2015-04-16 52 views
5

我已经通过文件看,以及提出了许多谷歌试图了解,但到目前为止,我已经拿出空手而归:如何根据优先级设置运行批处理作业?

1)是否存在,让我实现以下可设置的参数?如果有,我该如何配置它?

我想设置批处理作业,以便除了“正常”优先级之外,我还可以选择运行“高”优先级作业,以排挤其他人。在“正常”的优先工作中,FIFO是好的。我想持续记录已提交的作业及其状态,最好是自动重试失败。

我正在使用Spring-Batch 3.0.3,特别是Spring 4.0.6。我从JBoss AS 7.1.1服务器上的webservice提交作业。 2)如果没有开箱即用的实现,我可以写些什么(taskExecutor?)来实现这个目标吗?我该怎么做呢?

我得到了建议的ThreadPoolExecutor来工作,但Job类仍然棘手,因为我找不到指定作业类的位置。 (出于各种原因,我使用jXML进行配置,而不是使用注释进行编程)。无论我做什么,部署都会继续使用org.springframework.batch.core.job.flow.FlowJob,然后才能不会转换为不同的工作班级。

回答

0

您可以使用的ExecutorService用的PriorityBlockingQueue来处理这个问题,是这样的:

int maxThreads = 4; 
ExecutorService pool = new ThreadPoolExecutor(1, maxThreads, 1, TimeUnit.SECONDS, new PriorityBlockingQueue<Runnable>()); 

然后,尽可能多的就业机会,你有:

Job job = new Job(desiredPriority); 
pool.execute(job); 

这些将通过的PriorityBlockingQueue得到有序基于你传递给他们的优先权。

你的工作类将实现Runnable和可比:

public class Job implements Runnable, Comparable<Job> { 
    private final int priority; 

    public Job(int priority) { 
     this.priority = priority; 
    } 

    @Override 
    public int compareTo(Job o) { 
     // enforces descending order (but this is up to you) 
     if (this.priority > o.priority) { 
      return -1; 
     } else if (this.priority < o.priority) { 
      return 1; 
     } else { 
      return 0; 
     } 
    } 

    @Override 
    public void run() { 
     // do whatever needs to happen on a thread 
    } 
} 
+0

谢谢,这是更多或更少的我在想什么,但我不知道我能建的PriorityBlockingQueue到执行者。到目前为止,我使用的是org.springframework.scheduling.concurrent.ThreadPoolTask​​Executor,主要是因为它在Spring Batch文档中提到。 – lepome

+0

我想我现在唯一关心的是java.util.concurrent.ThreadPoolExecutor是否会“与其他人一起玩”。我正在添加一个相当大的应用程序,并且我对整合很感兴趣。我意识到我的另一个问题是我试图让错误的类Comparable。 (现在,如果我只能找出评论编辑器,我会很有用。) – lepome

+0

ThreadPoolExecutor是相当常用的。请注意,PriorityBlockingQueue是无界的,因此如果Runnable对于非常大的对象是长时间运行的,那么您可能需要一个信号量来控制您排队的数量。 – spudone