Java 爪哇石英';s拼图
我的项目是建立一个调度系统,通过cron表达式在特定时间调度某个爬虫,我选择使用quartz。我在作业对象中创建一个子流程。当计划作业时,它将创建一个进程来启动一个scrapy crawler来获取数据,父进程是使用Java 爪哇石英';s拼图,java,quartz-scheduler,scrapy,Java,Quartz Scheduler,Scrapy,我的项目是建立一个调度系统,通过cron表达式在特定时间调度某个爬虫,我选择使用quartz。我在作业对象中创建一个子流程。当计划作业时,它将创建一个进程来启动一个scrapy crawler来获取数据,父进程是使用waitFor()java api进行等待。 public void execute(JobExecutionContext context) throws JobExecutionException { try { JobKey j
waitFor()java api进行等待。
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是一种“搔痒爬行糠秕”。然而,当它被安排时,我发现这个过程只是在很短的时间内完成的,然后我使用了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+,整个进程在此停止。如何修复它并让子进程在此作业对象中执行?我怀疑您的子进程生成了一些输出,然后被阻止,因为您没有在主进程中读取此输出。如果是,您有两种解决问题的方法:
- 显式读取子进程的输出流以防止其阻塞
- (仅限Java 7)使用ProcessBuilder API将子项目的流与父项目的流合并:
ProcessBuilder pb=新的ProcessBuilder(“myCommand”、“myArg1”、“myArg2”)
pb.inheritIO()
进程p=pb.start()
- 显式读取子进程的输出流以防止其阻塞
- (仅限Java 7)使用ProcessBuilder API将子项目的流与父项目的流合并:
ProcessBuilder pb=新的ProcessBuilder(“myCommand”、“myArg1”、“myArg2”)
pb.inheritIO()
进程p=pb.start()