在骡子流中按顺序使用来自 JMS 的消息



我有一个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>

您可以采用以下任何一种方法。

  1. 将队列设置为独占。这将使服务器只能向一个使用者发送消息。

  2. 使用JMS 的 JMSXGroupID属性。这将确保消息按标头"JMSXGroupID"中的特定组的顺序进行处理。例如,如果有 5 条消息,其中 JMSXGroupID 设置为 "customer1" 表示 3 条消息,将 "customer2" 设置为 2 条消息。然后,"客户 1"下 3 条消息的处理和"客户 2"下 2 条消息的处理将是顺序的。但是,两个组的消息将并行执行。

最新更新