文档章节

XXL-JOB使用命令行的方式启动python时,日志过多导致阻塞的解决方式

c
 codeobj
发布于 11/18 11:29
字数 529
阅读 19
收藏 0

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

一、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进行拼接后在使用\n进行拆分,有点类似于,一次性读出文件的所有内容的方式,需要自己进行处理后得到行数据

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

二、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}") 获取

个人博客 蜗牛

© 著作权归作者所有

c
粉丝 0
博文 22
码字总数 33547
作品 0
私信 提问
DragonCloud/xxl-job-plus

介绍 Xxl-Job是一款优秀的开源调度平台,在推广并使用的过程中,我在它的基础上进行了扩展,开发了一些它本身无法满足我们公司业务需求的功能,提供了异构系统(PHP,Python等)接入的方案和实...

DragonCloud
03/13
0
0
Xxl-Job 的超集 - Xxl-Job-Plus

Xxl-Job是一款优秀的开源调度平台,在推广并使用的过程中,我在它的基础上进行了扩展,开发了一些它本身无法满足我们公司业务需求的功能,提供了异构系统(PHP,Python等)接入的方案和实施样...

你的十七
03/13
3.2K
0
XXL-JOB v1.7.1,分布式任务调度平台

版本 V1.7.1 特性 运行日志读写编码统一为UTF-8,解决windows环境下日志乱码问题; 通讯超时时间限定为10s,避免异常情况下调度线程占用; 执行器,server启动、销毁和注册逻辑调整; JettyS...

许雪里
2017/05/08
766
1
java分布式任务调度xxl-job

小陈博主2017-11-30 21:11:56 前言碎语 在单机应用时期,任务调度一般都是基于spring schedule和集成quartz来实现的,当系统发展成分布式服务,应用多实例的时候,任务就会出现多次调用的问题...

u011277123
2017/12/13
0
0
xxl-job中关于quartz中的配置详解

在半个月之前,有幸看了xxl-job源码,原本打算写一篇源码分析文章。结果由于琐碎的事情干扰了,搁浅了。本篇文章先预热一下,讲下xxl-job中关于quartz知识。(本文内容参考自xxl-job官网) xxl...

cmazxiaoma
04/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

用于电话号码验证的综合正则表达式

我正在尝试综合使用正则表达式来验证电话号码。 理想情况下,它将处理国际格式,但必须处理美国格式,包括以下内容: 1-234-567-8901 1-234-567-8901 x1234 1-234-567-8901 ext1234 1(234)...

javail
44分钟前
6
0
你为什么要使用表达 >而不是Func ?

我了解lambda和Func和Action代表。 但是表情让我难过。 在什么情况下,您将使用Expression<Func<T>>而不是普通的旧Func<T> ? #1楼 我想添加一些关于Func<T>和Expression<Func<T>>之间的区别......

技术盛宴
59分钟前
5
0
用最简单的方法实现原生JS放大镜特效

<html lang="en"><head> <meta charset="UTF-8"> <title>Document</title> <style> *{margin:0px;padding:0px;} #big{width:200p......

汤清丽
今天
4
0
NIO 编程

1. NIO 比 传统 IO 有什么优点? 答:NIO 一个 线程 可以监听多个客户端,传统 客户端 -- 服务端模型中,一个线程监听一个客户端,导致线程消耗过多,一个线程要分配0.5M~1M内存。 2. NIO服务...

杨凯123
今天
4
0
SpringBoot 系列教程自动配置选择生效

191214-SpringBoot 系列教程自动配置选择生效 写了这么久的 Spring 系列博文,发现了一个问题,之前所有的文章都是围绕的让一个东西生效;那么有没有反其道而行之的呢? 我们知道可以通过@Co...

小灰灰Blog
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部