zoukankan      html  css  js  c++  java
  • XXL-JOB使用命令行的方式启动python时,日志过多导致阻塞的解决方式

    一、Runtime.getRuntime().exec()的阻塞问题

    这个问题也不能算是XXL-JOB的问题,而是Java的Runtime.getRuntime().exec()造成的,BufferedReader的缓冲区大小有限,当不能及时从缓冲区中把输出取走,那么缓冲区满了之后就会导致程序阻塞;

    1、如何解决

    最简单的方式就是将正常输出和异常输出使用两个不同的线程进行操作

    
    Process process = Runtime.getRuntime().exec(command);
    StreamOutter errorGobbler = new StreamOutter(process.getErrorStream(), "ERROR");
    // any output?
    StreamOutter outputGobbler = new StreamOutter(process.getInputStream(), "OUTPUT");
    
    // kick them off
    errorGobbler.start();
    outputGobbler.start();
    // command exit
    process.waitFor();
    
    public class StreamOutter extends Thread {
        InputStream is;
        String type;
    
        public StreamOutter(InputStream is, String type) {
            this.is = is;
            this.type = type;
        }
    
        public void run() {
            System.out.println("进入" + type + "处理线程");
            BufferedReader br = null;
            try {
    
                InputStreamReader isr = new InputStreamReader(is);
                br = new BufferedReader(isr);
                String line;
                System.out.println("开始处理" + type + "线程数据");
                while ((line = br.readLine()) != null) {
                    XxlJobLogger.log(line);
                }
            } catch (IOException ioe) {
                ioe.printStackTrace();
            } finally {
                if (br != null) {
                    try {
                        br.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
    
            }
        }
    }
    

    2、如果按照1中写了之后也可以采用BufferedReader的read方式来快速处理

     br = new BufferedReader(isr);
     int one = null;
     if((one=br.read()) != -1){
     System.out.println((char) one);
     }
    

    br.read()是挨个取出所有字符,所以需要进行对one进行拼接后在使用 进行拆分,有点类似于,一次性读出文件的所有内容的方式,需要自己进行处理后得到行数据

    我这里使用第一种方式已经没有问题了,至于第二种方式则需要自行探索了,如果有使用第二中方式解决的同学,可以指点一二;

    二、Spring Boot通过命令行传入的参数

    方式一:

    java -jar xxx.jar aaa bbb cccc

    传了3个参数,分别是aaa,bbb,ccc

    通过main方法的参数获取

    方式二:

    java -jar xxx.jar --test.test=aaa --domain=bbb

    是springboot的写法,可以通过@Value("${test.test}")@Value("${domain}") 获取

    个人博客 蜗牛

  • 相关阅读:
    设置IIS7/IIS7.5的FTP支持断点续传
    win10图片打开方式里没有默认照片查看器的解决方法
    使用C#的HttpWebRequest模拟登陆网站
    在Raid模式下装Win10找不到固态硬盘怎么办
    C# String 前面不足位数补零的方法
    [SQL Server]无法创建 SSIS 运行时对象,请验证 DTS.dll 是否可用及是否已注册
    HTTPS协议说明
    技术晨读_20160217
    技术晨读_20160215
    fastcgi安装
  • 原文地址:https://www.cnblogs.com/codeobj/p/11881106.html
Copyright © 2011-2022 走看看