如何配置Spring Integration以使用多线程从Redis读取数据?

时间:2019-05-30 11:40:08

标签: spring multithreading redis spring-integration

我正在设置一个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" />

我不知道我做错了什么,或者我缺少什么。感谢您的帮助。

1 个答案:

答案 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定义。