使用RedisQueueInboundGateway进行多线程处理

时间:2018-11-20 14:52:30

标签: spring multithreading redis spring-integration

我正在将Spring Integration与Redis一起使用。生产者使用RedisQueueOutboundGateway,另一方面接收者使用RedisQueueInboundGateway定义流。

从文档中阅读后,我发现以下句子

  

任务执行器必须配置多个线程进行处理

我需要并发执行,以加快请求的处理速度,但是即使我像下面这样配置自定义ThreadPoolTask​​Executor,我仍然可以看到总是有一个线程

public Executor getAsyncExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(5);
    executor.setMaxPoolSize(40);
    executor.setQueueCapacity(40);
    executor.setThreadNamePrefix("QueueAsyncExecutor-");
    executor.initialize();
    return executor;
}

并且此线程池的使用是

final RedisQueueInboundGateway rqig = new RedisQueueInboundGateway(finalDestination, jedisConnectionFactory);
rqig.setTaskExecutor(getAsyncExecutor());

最终结果是对请求的顺序处理,所有处理均使用与从日志中看到的相同的线程完成。在这种情况下是否可以启用多线程处理?怎么样?

1 个答案:

答案 0 :(得分:1)

是的。 RedisQueueInboundGateway目前是单线程的。只有一个ListenerTask

private void restart() {
    this.taskExecutor.execute(new ListenerTask());
}

听起来像我们需要在该concurrency中引入RedisQueueInboundGateway选项!随时就此问题提出JIRA,欢迎您提供帮助!

对于同一个Redis队列,您可以通过多个RedisQueueInboundGateway实例实现人工并发。这样,他们每个人都会开始自己的ListenerTask