【发布时间】:2020-08-03 15:19:22
【问题描述】:
Spring integration MessageQueue without polling 的结果是,我有一个轮询器,它使用自定义 TaskScheduler 立即使用队列中的消息:
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setThreadNamePrefix("resultProcessor-");
IntegrationFlows
.from("inbound")
.channel(MessageChannels.priority().get())
.bridge(bridge -> bridge
.taskScheduler(taskScheduler)
.poller(Pollers.fixedDelay(0).receiveTimeout(Long.MAX_VALUE)))
.fixedSubscriberChannel()
.route(inboundRouter())
.get()
现在我想让多个线程同时使用,所以我尝试了:
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setThreadNamePrefix("resultProcessor-");
scheduler.setPoolSize(4);
但是,由于在AbstractPollingEndpoint 中任务调度器调度了一个同步轮询器(有点复杂),所以只创建了一个线程。如果我将 TaskExecutor 设置为 SyncTaskExecutor(默认)以外的任何值,我会遇到大量计划任务(请参阅 Spring integration MessageQueue without polling)。
如何在 Spring Integration 中同时从队列中消费?这似乎很基本,但我找不到解决方案。
我可以使用ExecutorChannel 代替队列,但是,(AFAIK)然后我会丢失队列功能,例如优先级、队列大小和我所依赖的指标。
【问题讨论】: