我有一个tibco队列,我们从生产者那里接收消息,而骡子流正在消耗这些消息。我在 jms:connector 中将消费者数量设置为 20。当负载很高时,我的消息在流中不按顺序接收。 我希望我的流按顺序接收消息,而不会使其成为单线程。
下面是流程开头带有记录器的流程:
<flow name="some name" doc:name="ServiceId-8" initialState="started">
<jms:inbound-endpoint queue="${queue1}" connector-ref="jmsconnector" doc:name="JMS">
<logger message="Receiving Message: #[message.payload]" category="com.xyz" level="INFO" doc:name="Logger"/>
<jms:transaction action="ALWAYS_BEGIN"/>
</jms:inbound-endpoint>
<processor....
<component....
........
........
</flow>
连接器:
<jms:connector name="jmsconnector" specification="1.1" username="${name}" password="${pass}" validateConnections="true" jndiInitialFactory="factoryClass" jndiProviderUrl="${url}" connectionFactoryJndiName="GenericConnectionFactory" cacheJmsSessions="true" eagerConsumer="true" forceJndiDestinations="true" numberOfConsumers="20" persistentDelivery="true" maxRedelivery="5" doc:name="JMS">
<spring:property name="jndiProviderProperties">
<spring:map>
<spring:entry key="java.naming.security.principal" value="${name}"/>
<spring:entry key="java.naming.security.credentials" value="${pass}"/>
</spring:map>
</spring:property>
<reconnect-forever/>
</jms:connector>
您可以采用以下任何一种方法。
-
将队列设置为独占。这将使服务器只能向一个使用者发送消息。
-
使用JMS 的 JMSXGroupID属性。这将确保消息按标头"JMSXGroupID"中的特定组的顺序进行处理。例如,如果有 5 条消息,其中 JMSXGroupID 设置为 "customer1" 表示 3 条消息,将 "customer2" 设置为 2 条消息。然后,"客户 1"下 3 条消息的处理和"客户 2"下 2 条消息的处理将是顺序的。但是,两个组的消息将并行执行。