我正在设置一个Spring Integration配置以使用多线程从Redis读取数据,但是当我运行我的应用程序时,Spring仅创建一个线程。
我正在创建一个int-redis:queue-inbound-channel-adapter,其执行者任务的池大小= 500,队列容量= 0。
<redis:queue-inbound-channel-adapter
id="fromRedis" channel="privateAggregationExecutorChannel" queue="${instance}_private"
receive-timeout="1000" recovery-interval="3000" expect-message="false" error-channel="distributionErrors"
auto-startup="false" task-executor="robotTaskExecutor"/>
<task:executor
id="robotTaskExecutor"
pool-size="500"
queue-capacity="0"
keep-alive="50"
rejection-policy="CALLER_RUNS" />
<int:service-activator input-channel="privateAggregationExecutorChannel" ref="aggregationExecutor" method="run" />
我不知道我做错了什么,或者我缺少什么。感谢您的帮助。
答案 0 :(得分:0)
是的。 RedisQueueMessageDrivenEndpoint
实际上是单线程组件:
@Override
protected void doStart() {
if (!this.active) {
this.active = true;
this.restart();
}
}
private void restart() {
this.taskExecutor.execute(new ListenerTask());
}
如您所见,此通道适配器仅调度了一个ListenerTask
。
要使其成为多线程,最好使用ExecutorChannel
从该通道适配器发送消息。这样,即使RedisQueueMessageDrivenEndpoint
是单线程的,您仍然要进行多线程的处理。
我们刚刚意识到,当我们可以解决其他简单方法时,将并发引入此组件将有些复杂。
另一种方法是为相同的<redis:queue-inbound-channel-adapter>
和queue
通道发送多个same
定义。