并非所有消息都从ActiveMQ in Mule应用程序中退出队列
我在Mule应用程序中有一个带有两个JMS连接器的暂存队列,用于读取和写入队列。如果我将队列上的40条消息暂存/排队,则只有20条消息将被排队,其余的消息将作为待处理消息放置,并且在Mule应用程序未重新启动之前不会排队 下面是连接器和mule flow的代码。有人能告诉我这里有什么问题吗?以及为什么消息处理会在20条消息时停止 如果需要更多信息,请告诉我并非所有消息都从ActiveMQ in Mule应用程序中退出队列,activemq,mule,Activemq,Mule,我在Mule应用程序中有一个带有两个JMS连接器的暂存队列,用于读取和写入队列。如果我将队列上的40条消息暂存/排队,则只有20条消息将被排队,其余的消息将作为待处理消息放置,并且在Mule应用程序未重新启动之前不会排队 下面是连接器和mule flow的代码。有人能告诉我这里有什么问题吗?以及为什么消息处理会在20条消息时停止 如果需要更多信息,请告诉我 <!-- PROCESSING BEAN WHICH HAS ALL STREAM INTERACTION AND ERROR HAN
<!-- PROCESSING BEAN WHICH HAS ALL STREAM INTERACTION AND ERROR HANDLING -->
<spring:bean name="processorPR" class="net.prcins.esb.claims.vci.policereports.processing.PoliceReportProcessor" scope="prototype">
<spring:property name="policeReportBO" ref="policeReportBO" />
</spring:bean>
<!-- This is for validation of inital transformation -->
<spring:bean name="receiverPR" class="net.prcins.esb.claims.vci.policereports.staging.PoliceReportReceiver" scope="prototype" />
<!-- PROCESSING BEAN WHICH HAS ALL BUSINESS LOGIC -->
<spring:bean name="policeReportBO" class="net.prcins.esb.claims.vci.policereports.processing.PoliceReportBO" scope="prototype">
<spring:property name="rulesFileCovLogic_NE" value="${policeReport.rules.covLogic.NE}"/>
<spring:property name="rulesFileCovLogic_NJ" value="${policeReport.rules.covLogic.NJ}"/>
</spring:bean>
<jms:activemq-connector name="jmsConnectorStagingQReaderNormal"
brokerURL="${mule.activemq.broker.read.normal.url}"
specification="1.1"
maxRedelivery="-1"
persistentDelivery="true"
createMultipleTransactedReceivers="true"
numberOfConcurrentTransactedReceivers="10"
connectionFactory-ref="connectionFactoryPR"
disableTemporaryReplyToDestinations="false">
</jms:activemq-connector>
<!-- JMS CONNECTOR FOR WRITING FROM STAGING QUEUE -->
<jms:activemq-connector name="jmsConnectorStagingQWriter"
brokerURL="${mule.activemq.broker.write.url}"
specification="1.1"
maxRedelivery="-1"
persistentDelivery="true"
createMultipleTransactedReceivers="true"
numberOfConcurrentTransactedReceivers="10"
connectionFactory-ref="connectionFactoryPR"
disableTemporaryReplyToDestinations="false">
</jms:activemq-connector>
<jms:endpoint name="inboundProcessReaderNormalPR" queue="${policereport.queue.staging.name}" exchange-pattern="one-way" connector-ref="jmsConnectorStagingQReaderNormal" />
<flow name="pr-flow-stage-individual-message">
<http:inbound-endpoint host= "localhost"
port= "${policeReport.inbound.port}"
path= "claims/vci/policeReport/record"
exchange-pattern= "request-response"
>
</http:inbound-endpoint>
<object-to-string-transformer />
<logger message="PoliceRecord: SPLIT MESSAGE:#[payload]" level="ERROR" />
<transformer ref="XMLToRecord"></transformer>
<!-- COMPONENT TO PROCESS THE DATA -->
<!-- Component returns Invoice XML if all validations are successful, else it returns error XML containing error message, error code and original payload -->
<component>
<spring-object bean="receiverPR"></spring-object>
</component>
<transformer ref="RecordToXML"></transformer>
<object-to-string-transformer />
<!-- DECIDE SUCCESS/FAILURE AND PLACE ON QUEUE IF SUCCESS -->
<choice>
<when expression="//Record/Response/Status = 'ACCEPTED'" evaluator="xpath">
<jms:outbound-endpoint ref="inboundProcessReaderNormalPR" doc:name="JMS">
<jms:transaction action="NONE"/>
</jms:outbound-endpoint>
</when>
<otherwise>
<!-- Relevant endpoint for error handling -->
<logger message="Skipped staging message due to errors" level="ERROR" />
</otherwise>
</choice>
<logger message="PoliceReport: STAGED PAYLOAD:#[payload]" level="ERROR" />
<default-exception-strategy>
<logger message="PoliceReport: Exception recived in flow-stage-individual-message. Payload is :#[payload]" level="ERROR" />
</default-exception-strategy>
</flow>
<!-- ============================== PROCESSING =============================== -->
<!-- ====================================================================== -->
<!--=================== PROCESSING JOB FOR Police Report (NORMAL) ========================-->
<flow name="pr-flow-process-jms-input-normal" >
<jms:inbound-endpoint ref="inboundProcessReaderNormalPR"/>
<flow-ref name="pr-flow-process-jms-input-subbflow" />
</flow>
<!--=================== PROCESSING JOB FOR Police Report (DR) ========================-->
<flow name="pr-flow-process-jms-input-dr" >
<jms:inbound-endpoint ref="inboundProcessReaderDRPR" />
<flow-ref name="pr-flow-process-jms-input-subbflow" />
</flow>
<!--=================== PROCESSING JOB FOR PoliceReport (NE) ========================-->
<sub-flow name="pr-flow-process-jms-input-subbflow" >
<transformer ref="DomToXmlPR" doc:name="DOM to XML"/>
<transformer ref="XMLToRecord"></transformer>
<!-- COMPONENT TO PROCESS THE DATA. WILL PROCESS THE OBJECT AND RETURN ANOTHER OBJECT AS RESPONSE -->
<component>
<spring-object bean="processorPR"></spring-object>
</component>
<!-- Component above performs all business logic, including validations, creation/editing of claim, error handling etc.
Returns success/failure of claim import processing in the end -->
<transformer ref="RecordToXML"></transformer>
<object-to-string-transformer />
<!-- DECIDE SUCCESS OR FAILURE -->
<choice>
<when expression="//Record/Response/Status = 'ERROR' and contains(//Record/Response/Description, 'SysError')" evaluator="xpath">
<!-- DROP XFORMED BATCH FORMAT STRING ON THE JMS QUEUE
RETURNS RIGHT AWAY, NO WAITING -->
<logger message="PoliceReport: FAILED TO PROCESS MESSAGE :#[payload]" level="ERROR" />
<jms:outbound-endpoint queue="${policeReport.queue.errors.name}" exchange-pattern="one-way" connector-ref="policeReportJMSConnectorErrorQWriter" />
</when>
<otherwise>
<logger message="Messages processd without error :#[payload]" level="ERROR" />
</otherwise>
</choice>
<transformer ref="record2balancingXFormer" />
<object-to-string-transformer />
<splitter evaluator="xpath" expression="//Batch_Status" />
<!-- <logger message="OUTPUT OF SPLITTER IS: #[payload]" level="ERROR" /> -->
<custom-transformer class="net.prcins.esb.claims.vci.policereports.transformers.DocumentToString" />
<!-- Not sure why only splitter makes the payload workable for HTTP call. Without this, I keep getting error that the Rest Endpoint does not accept XML -->
<flow-ref name="pr-flow-balancing"/>
</sub-flow>
不确定发生了什么,但有些事情可能会在配置中引入不必要的线程/争用,这让我有点担心:
- 如果可用实例少于并发线程,则池化组件可能会成为瓶颈。您确定真的需要
集合组件
?使用它们代替标准
组件的理由是什么
是一个私有流,而不是子流,并且使用默认的处理策略。这意味着flow process jms input subbflow
中的flow process jms input normal
调用实际上会将执行转移到另一个线程。除非它是真正的您希望发生的事情,否则我建议您将flow ref
转换为子流,这样它将在流程jms input subbflow
中接收jms消息的同一线程上执行- 在
中引用全局端点jms:outbound endpoint
,而不是重新定义它inboundProcessReaderNormal
这些更改很可能无法解决问题,但至少可以简化执行模型,并有助于更好地推理正在发生的事情。您也可以共享Mule配置吗?特别是处理JMS消息的流。@David,我已经用mule config更新了上面的问题,以及对队列的读写流。@David,感谢您了解这一点。我们使用池组件进行多线程处理。我们将有一些需要同时处理的客户端请求。组件将提供这种多线程行为吗?此外,我尝试了这两种选择,但似乎没有帮助。我不知道为什么处理会在20点停止,而rest消息在队列中仍然处于挂起状态。不知道这个神奇的数字(20)来自哪里:)。您还有什么其他建议可以尝试吗?如果您的组件是线程安全的,那么就没有理由将它们合用。单个实例可以同时处理所有请求。我提出了第三个建议。你能用配置的当前状态更新你的问题吗?您是否打算将
流程jms输入子流的结果返回给执行初始HTTP调用的客户端?@David,组件不是线程安全的。因此,我将它们定义为原型,因为它们是有状态bean。我已经添加了所有三个建议并更新了代码。最初我发布了40条消息,所有40条消息都从队列中退出队列。然后,我又安排了40场比赛,然后只有20场比赛被淘汰。不确定,为什么会这样?如果你有任何其他建议,请告诉我。谢谢你的回复。