Исполнитель задачи Spring интеграции - Последующие активаторы службы выполняются как часть пула - PullRequest
0 голосов
/ 09 мая 2018

Я пишу весеннее приложение, в котором я использую 2 исполнителя задач. Итак, структура моего кода следующая:

<!--
Web gatherer Configuration 
-->

<int:channel id="web-gatherer-channel">
    <int:queue capacity="10"/>
</int:channel>
<task:executor id="webGathererExecutor" pool-size="10" queue-capacity="10"/>
<int:service-activator input-channel="web-gatherer-channel" ref="webGatherer" method="getData"
                       output-channel="aggregator-router-channel">
    <int:poller task-executor="webGathererExecutor" fixed-delay="500">
    </int:poller>
</int:service-activator>


<!--
    Webgatherer  Configuration - END
-->

 <!--
SQL Gatherer Configuration - Start
-->
<int:channel id="sql-gatherer-channel">
    <int:queue capacity="10"/>
</int:channel>
<task:executor id="sqlGathererExecutor" pool-size="10" queue-capacity="10"/>
<int:service-activator input-channel="sql-gatherer-channel" ref="sqlGatherer" method="getData"
                       output-channel="aggregator-router-channel">
    <int:poller task-executor="sqlGathererExecutor" fixed-delay="500">
    </int:poller>
</int:service-activator>


<!--
SQL Gatherer Configuration - END
-->
 <int:chain input-channel="aggregator-router-channel">
    <int:aggregator ref="aggregator" method="aggregate" message-store="resultMessageStore"
                    release-strategy="gathererRelease"
                    correlation-strategy="gathererCorrelationStrategy"
                    correlation-strategy-method="getCorrelationKey">
    </int:aggregator>

    <int:router ref="generatorRouter" method="route"/>
</int:chain>

<int:chain input-channel="XLS-channel" output-channel="mailSender-channel">
    <int:service-activator  ref="xlsGenerator" method="generate"/>
</int:chain>

Таким образом, поток, как показано ниже

Сообщение -> Сплиттер -> 1. Сборщик Web 2. Сборщик SQL -> Aggrgator -> Генератор XLS

В настоящее время мой активатор службы XLS должен работать независимо, но в журналах я вижу, что он работает под одним из исполнителей задач, который является случайным.

JxlsGenerator:sqlGathererExecutor-4 transformXLS execution in 166 ms

Я не могу понять, почему он работает как часть пула исполнителей задач.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 09 мая 2018

Это результат <int:aggregator>. Он получает сообщения из разных потоков, и когда он готов освободить группу, он собирает результат и отправляет его из потока, которому соответствует условие освобождения. Так называется ваш XLS-channel или из одного, или из другого потока.

Ну, на самом деле любой код на Java вызывается из какого-то потока. Когда мы разрабатываем однопоточное приложение только с main(), весь код вызывается из этого потока main. Если вы не меняете поток, программа выполняется в текущем потоке.

Если вы хотите иметь XLS-channel в отдельном независимом потоке, подумайте о том, чтобы сделать этот канал <executor>: https://docs.spring.io/spring-integration/docs/5.0.5.RELEASE/reference/html/messaging-channels-section.html#channel-configuration-executorchannel.

А также читайте о модели потоков Java.

...