我们正处于申请的设计阶段。我们决定使用Spring-Integration。作为起点,应用程序使用入站适配器从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)创建工作线程的线程池。每个工作线程将从节点处理器开始处理消息,该消息将使用简单弹簧的依赖注入方式中的所有后续组件,而不使用弹簧集成。 2)使用task-executor创建每个组件的线程池。每个组件的每个线程将选择缓冲到其先前通道上的输入对象。但是,这将创建许多线程,因为每个组件都将是多线程的。
有人可以就选择的方法提出一些解决方案吗?
答案 0 :(得分:0)
一旦你从JMS message poller
开始流程,我就没有理由将消息从轮询线程转移到任何其他线程。如果您的一般逻辑将在该单个线程内完成,并且在这种情况下,您的应用程序的吞吐量将取决于Poller TaskExecutor并发性,那将更好。
audit logging
,message saving
和node object saving
可能来自不同的thead。在这种情况下,QueueChannel
适合您。我指的是所有<int:wire-tap>
个频道。
答案 1 :(得分:0)
@prasadsh您是否通过将<wire-tap>
频道转换为QueueChannel获得所需的效果?您也可以尝试将channel1转换为QueueChannel,因为无论如何您都有channel.tbl_message来记录来自jms的输入消息。
我很想知道您是否有任何解决方案,因为我们有类似的要求(10k消息/秒)