Components 我应该为工作线程使用spring集成还是简单的spring IoC?

Components 我应该为工作线程使用spring集成还是简单的spring IoC?,components,spring-integration,worker-thread,Components,Spring Integration,Worker Thread,我们正处于应用程序的设计阶段。我们决定使用Spring集成。作为起点,应用程序使用入站适配器从JMS队列读取消息,该入站适配器基于轮询,并使用任务执行器进行多线程处理。在对消息进行审计日志记录之后,这些接收方线程将消息放到通道上,工作线程从中拾取每条消息以进行进一步处理。进一步的处理本身包括不同的组件,如消息解析、节点对象构建、预链接和链接。在步骤中,它包括用于保存消息和保存节点对象的侦听器。这符合以下配置 <int-jms:inbound-channel-adapter jms-temp

我们正处于应用程序的设计阶段。我们决定使用Spring集成。作为起点,应用程序使用入站适配器从JMS队列读取消息,该入站适配器基于轮询,并使用任务执行器进行多线程处理。在对消息进行审计日志记录之后,这些接收方线程将消息放到通道上,工作线程从中拾取每条消息以进行进一步处理。进一步的处理本身包括不同的组件,如消息解析、节点对象构建、预链接和链接。在步骤中,它包括用于保存消息和保存节点对象的侦听器。这符合以下配置

<int-jms:inbound-channel-adapter jms-template="jmsTemplate"  channel="channel1" id="MessageReceiver">
    <int:poller fixed-delay="100" time-unit="MILLISECONDS" task-executor="taskExecutor"/>
</int-jms:inbound-channel-adapter>
<int:channel id="channel1">
        <int:interceptors>
            <int:wire-tap channel="channel.tbl_message"/>
        </int:interceptors>
    </int:channel>

<bean id="dataSource" destroy-method="close"
    class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${db.driverClassName}" />
    <property name="url" value="${db.host.url}" />
    <property name="username" value="${db.username}" />
    <property name="password" value="${db.password}" />
</bean>

<int-jdbc:outbound-channel-adapter channel="channel.tbl_message" data-source="dataSource"
    query="#{message.receiver.insert.query}" id="MessageLogger"></int-jdbc:outbound-channel-adapter>

<int:transformer input-channel="channel1" output-channel="channel2" method="parse" id="NodeBuilder">
    <bean class="com.recon.parser.NodeBuilder"></bean>
</int:transformer>
<int:channel id="channel2"/>

<int:filter input-channel="channel3" output-channel="channel5"
    discard-channel="channel4" method="validate" id="NodeValidator">
    <bean class="com.recon.util.Validator"></bean>
</int:filter>
<int:channel id="channel3">
    <int:interceptors>
        <int:wire-tap channel="channel.tbl_node"/>
    </int:interceptors>
</int:channel>
<int-jdbc:outbound-channel-adapter channel="channel.tbl_node" data-source="dataSource"
    query="#{valid.node.insert.query}" id="ValidNodePersist"></int-jdbc:outbound-channel-adapter>

<int:channel id="channel4"/>
<int-jdbc:outbound-channel-adapter channel="channel4" data-source="dataSource"
    query="#{validation.failure.insert.query}" id="FailedNodePersist"></int-jdbc:outbound-channel-adapter>

<int:transformer input-channel="channel2" output-channel="channel3" method="nodeEnricher" id="NodeEnricher">
    <bean class="com.recon.processor.NodeEnricher"></bean>
</int:transformer>

<int:channel id="channel5"/>
<int:service-activator input-channel="channel5" id="LinkerManager">
    <bean class="com.recon.manager.LinkerManager"></bean>
</int:service-activator>

现在我有两个选择: 1) 创建工作线程的线程池。每个工作线程将处理来自节点处理器的消息,节点处理器将以简单spring的依赖项注入方式使用所有后续组件,而不使用spring集成。 2) 使用任务执行器创建每个组件的线程池。每个组件的每个线程将拾取缓冲到其先前通道上的输入对象。但是,这将创建许多线程,因为每个组件都将是多线程的


是否有人可以就要选择的方法提出一些解决方案?

一旦您从
JMS message poller
启动流,我看不出有理由将消息从轮询线程转移到任何其他线程。如果您的一般逻辑将在该单线程内完成,并且在这种情况下,应用程序的吞吐量将取决于轮询器TaskExecutor并发性,则会更好


审核日志记录
消息保存
节点对象保存
可以从不同的AD执行。在这种情况下,
QueueChannel
是为您准备的。我的意思是所有那些
频道。

@prasasash您是否通过将
频道转换为队列频道来获得所需的性能?您还可以尝试将channel1转换为QueueChannel,因为您有channel.tbl_消息来记录来自jms的输入消息


我很想知道您是否有任何解决方案可以使用,因为我们有类似的要求(10k消息/秒)

消息发布率很高,即大约9000到10000毫秒/秒。因此,我希望尽快释放轮询器线程,而不增加完全处理消息的负担。如何使用
而不是
并发使用者
?抱歉,我最初没有粘贴整个配置。这里是:我们只在任务执行器中使用入站通道适配器。我们现在已将设计更改为使用显式拦截器,而不是Wire tap,因为我们不需要异步审核日志记录。正如您所说,channel1将成为队列通道,用于缓冲队列。我们尚未评估设计的性能。不确定我们需要在哪里调整它。