并非所有消息都从ActiveMQ in Mule应用程序中退出队列

并非所有消息都从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

我在Mule应用程序中有一个带有两个JMS连接器的暂存队列,用于读取和写入队列。如果我将队列上的40条消息暂存/排队,则只有20条消息将被排队,其余的消息将作为待处理消息放置,并且在Mule应用程序未重新启动之前不会排队

下面是连接器和mule flow的代码。有人能告诉我这里有什么问题吗?以及为什么消息处理会在20条消息时停止

如果需要更多信息,请告诉我

<!-- 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场比赛被淘汰。不确定,为什么会这样?如果你有任何其他建议,请告诉我。谢谢你的回复。