JAVA Quartz的谜题

时间:2013-06-16 15:32:11

标签: java quartz-scheduler scrapy

我的项目是建立一个计划系统,通过cron表达式在特定时间安排一些爬虫,我选择使用石英。我在Job对象中创建一个子进程。在安排作业时,它会创建一个启动scrapy搜寻器来获取数据的进程,而父进程正在等待使用waitFor() java api. Sth,如下所示:

 public void execute(JobExecutionContext context) throws JobExecutionException {
        try {
                JobKey jobKey = context.getJobDetail().getKey();
                System.out.println("CrawlerJob says: " + jobKey + " executing at " + new Date());
                JobDataMap dataMap = context.getJobDetail().getJobDataMap();
                String scrapycmd=dataMap.getString("ScrapyCMD");
                Process process=Runtime.getRuntime().exec(scrapycmd);

                System.out.println("wait for process...");
                process.waitFor();
        }catch(InterruptedException e){
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
            _log.info(e.toString());
        }
}

ScrapyCMD是scrapy crawl myspider。但是,当它安排时,我发现这个过程只能在非常短的时间内完成,然后我正在使用ps -aux | grep python

gabriel   4202  0.0  1.0 755672 39400 pts/2    Sl+  22:14   0:02 /usr/local/bin/python /usr/local/bin/scrapy crawl myspider

子进程的状态是sl +,整个进程在那里停止。如何修复它并让子进程在这个Job对象中执行?

1 个答案:

答案 0 :(得分:1)

我怀疑您的子进程会生成一些输出然后被阻止,因为您没有在主进程中读取此输出。如果是这样,您有两种方法可以解决此问题:

  • 明确地从子进程的输出流中读取以阻止它阻止

  • (仅限Java 7)使用ProcessBuilder API将子项目的流与父流的流合并:

    ProcessBuilder pb = new ProcessBuilder(“myCommand”,“myArg1”,“myArg2”);
     pb.inheritIO();
     过程p = pb.start();