簡體   English   中英

如何設置基於優先級運行批處理作業?

[英]How do I set up to run batch jobs based on priority?

我查看了文檔以及谷歌嘗試學習的許多內容,但到目前為止,我已經空手而歸:

1)是否有可設置的參數可以讓我實現以下目的? 如果有,我該如何配置?

我想設置批處理作業,這樣除了“正常”優先級之外,我還可以選擇運行“高”優先級作業,這會阻止其他人排隊。 在“正常”優先工作中,FIFO很好。 我希望持續記錄所提交的工作及其狀態,最好是自動重試失敗。

我特別使用Spring-Batch 3.0.3和Spring 4.0.6。 我正在從JBoss AS 7.1.1服務器上的Web服務提交作業。

2)如果沒有開箱即用的實現,我可以寫一些東西(taskExecutor?)來實現這個目標嗎? 我怎么能這樣做?

我得到了建議的ThreadPoolExecutor,但Job類仍然難以處理,因為我找不到指定作業類的位置。 (由於多種原因,我正在使用jXML進行配置,而不是使用注釋進行編程。)無論我做什么,部署總是繼續使用org.springframework.batch.core.job.flow.FlowJob然后可以轉換到不同的工作類。

您可以使用帶有PriorityBlockingQueue的ExecutorService來處理此問題,例如:

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

然后,為您提供盡可能多的工作:

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

這些將由PriorityBlockingQueue根據您傳遞給它們的優先級進行排序。

您的Job類將實現Runnable和Comparable:

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
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM