簡體   English   中英

Spring Integration在事務中將消息發送到Executor

[英]Spring Integration send messages to Executor in transaction

我有大量來自CSV文件的消息,然后將其發送到限速API。 我正在使用由數據庫通道消息存儲支持的隊列通道,以使消息在處理時持久。 我想盡可能接近速率限制,因此我需要跨多個線程將消息發送到API。

我對如何工作的想法是讀取數據庫,查看可用的消息,然后將每個消息委托給要在事務中處理的線程之一。

但是我無法做到這一點,我要做的是擁有一個事務輪詢器,該輪詢器具有N個線程的線程池,固定的速率(例如5秒)和每次輪詢的最大消息數量為10(某種程度)超過了5秒鍾內可以處理的內容)...可以正常工作,但是當沒有太多消息等待時(例如,如果有10條消息,它們將由一個線程處理)就會出現問題實際上是一個問題,因為我們將收到1000條消息。 但是,從概念上講,它似乎比我認為的工作原理更為復雜。

我可能沒有很好地解釋這一點,但是當消息快速傳入但輸出速度較慢時,似乎是一個常見問題?

您的解決方案確實是正確的,但是您需要考慮不要將消息轉移到Exectuor因為那樣您會跳出事務邊界。

您在同一線程中處理了10條消息的事實恰好是實現細節,它看起來像這樣:

AbstractPollingEndpoint.this.taskExecutor.execute(() -> {
            int count = 0;
            while (AbstractPollingEndpoint.this.initialized
                    && (AbstractPollingEndpoint.this.maxMessagesPerPoll <= 0
                    || count < AbstractPollingEndpoint.this.maxMessagesPerPoll)) {
                try {
                    if (!Poller.this.pollingTask.call()) {
                        break;
                    }
                    count++;
                }

因此,我們在同一線程中輪詢消息,直到maxMessagesPerPoll

為了使其真正更並行並且仍保持事務不丟失消息,您需要考慮使用fixedRate

/**
 * Specify whether the periodic interval should be measured between the
 * scheduled start times rather than between actual completion times.
 * The latter, "fixed delay" behavior, is the default.
 */
public void setFixedRate(boolean fixedRate)

並增加TaskScheduler用於輪詢的線程數量。 您可以這樣做聲明一個名稱為IntegrationContextUtils.TASK_SCHEDULER_BEAN_NAMEThreadPoolTaskScheduler bean,以覆蓋池為10的默認值。 或使用全局屬性僅覆蓋默認TaskScheduler的池大小: https : TaskScheduler

暫無
暫無

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

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