任务执行程序Spring集成 - 后续服务激活程序作为池的一部分执行

时间:2018-05-09 10:21:16

标签: java spring spring-integration

我正在使用一个Spring应用程序,我正在使用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>

所以流程如下

消息 - &gt;分离器 - &gt; 1. Web收集器2. SQL收集器 - &gt; Aggrgator - &gt; XLS生成器

目前我的XLS服务激活器应该独立运行但是在日志中我可以看到它在一个随机的任务执行器下运行。

JxlsGenerator:sqlGathererExecutor-4 transformXLS execution in 166 ms

我无法理解为什么它作为任务执行程序池的一部分运行。

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

这是<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线程模型的内容。