Многопоточная обработка с RedisQueueInboundGateway - PullRequest
0 голосов
/ 20 ноября 2018

Я использую Spring Integration с Redis.Производитель использует RedisQueueOutboundGateway, а с другой стороны у получателя есть поток, определенный с помощью RedisQueueInboundGateway.

При чтении из документации я нашел следующее предложение

Должен быть настроен исполнитель задачис более чем одним потоком для обработки

Мне нужно иметь параллельные исполнения, чтобы ускорить обработку запросов, но я вижу, что всегда есть один поток, даже если я настроил пользовательский ThreadPoolTaskExecutorкак следующий

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 голосов
/ 20 ноября 2018

Это верно.На данный момент RedisQueueInboundGateway является однопоточным.Существует только один ListenerTask:

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

Звучит так, как будто мы должны ввести concurrency опцию в RedisQueueInboundGateway!Не стесняйтесь поднимать JIRA по этому вопросу, и вклад приветствуется!

Вы можете достичь искусственного параллелизма с несколькими RedisQueueInboundGateway экземплярами для одной и той же очереди Redis.Таким образом, каждый из них начнет свой собственный ListenerTask.

...