パフォーマンスを向上させるために、スレッドプールサイズの数を制御するタスクエグゼキューターでエグゼキューターチャネルを使用することをお勧めします。このようにして、メッセージが jms キューに到着すると、コンシューマーがメッセージを受け取り、別のスレッドでフローを処理する状況が発生します。この種の構成では、マルチスレッド作業は taskexecutor チャネルによって実行され、別のスレッドでメッセージの受信を実行することを覚えておいてください。このため、必要なマルチスレッドのグレードをよく考えなければなりません。
キューメッセージチャネルの場合、受信を実行するためにチャネルをポーリングするポーラーが必要です。キューの容量は、舞台裏のアトミックキューの容量です。
xml でこの方法でエグゼキューター チャネルを構成できます。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:si="http://www.springframework.org/schema/integration"
xmlns:tx="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/integration
http://www.springframework.org/schema/integration/spring-integration.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">
<tx:executor id="taskExecutor" pool-size="10" queue-capacity="10"/>
<si:channel id="ch" >
<si:dispatcher task-executor="taskExecutor"/>
</si:channel>
</beans>
またはこのようにjava-dslで
@Bean
public IntegrationFlow storeBookPageByPage(ConnectionFactory connectionFactory,
@Qualifier("createBookQueue") Destination createBookQueue,
@Qualifier("createBookResultQueue") Destination createBookResultQueue,
PdfBookMasterRepository pdfBookMasterRepository,
BookRepository bookRepository){
String tempFilePathBaseDir = environment.getProperty("bookService.storeBookPageByPage.tempFilePathBaseDir");
return IntegrationFlows.from(Jms.messageDriverChannelAdapter(connectionFactory)
.destination(createBookQueue)
.errorChannel(storeBookPageByPageErrorChannel()))
.channel(channels -> channels.executor(Executors.newScheduledThreadPool(5)))
.....
}