2015-04-16 56 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