Mule散射聚集路由器引发异常

Mule散射聚集路由器引发异常,mule,mule-studio,Mule,Mule Studio,我正在探索Mule散点聚集,以并行处理Mule fork和join模式中的流。我的Mule配置如下: <flow name="fork" doc:name="fork"> <http:inbound-endpoint host="localhost" port="8090" path="mainPath" exchange-pattern="request-response" doc:name="HTTP"/> <set-property prop

我正在探索Mule散点聚集,以并行处理Mule fork和join模式中的流。我的Mule配置如下:

 <flow name="fork" doc:name="fork">
    <http:inbound-endpoint host="localhost" port="8090" path="mainPath" exchange-pattern="request-response" doc:name="HTTP"/>
    <set-property propertyName="MULE_CORRELATION_GROUP_SIZE"  value="2" doc:name="Property"/>
     <!--  <all enableCorrelation="IF_NOT_SET" doc:name="All"> -->
            <scatter-gather timeout="6000">
              <processor-chain>
               <async doc:name="Async">
               <set-property propertyName="MULE_CORRELATION_SEQUENCE" value="1" doc:name="Property"/>
               <flow-ref name="Flow1" doc:name="Flow Reference"/>
               </async>
              </processor-chain>

              <async doc:name="Async">
              <set-property propertyName="MULE_CORRELATION_SEQUENCE" value="2" doc:name="Property"/>
              <flow-ref name="Flow2" doc:name="Flow Reference"/>
               </async>
               <!-- </all> -->
               </scatter-gather>
               <logger message="Main Flow" level="INFO" doc:name="Logger"/>
    </flow>

    <sub-flow name="Flow1" doc:name="Flow1">
     <logger level="INFO" message="Flow1: processing started" doc:name="Logger"/>
     <set-payload value="Flow1 Payload" doc:name="Set Payload"/>
     <!-- Transformation payload -->
      <logger level="INFO" message="Flow1: processing finished" doc:name="Logger"/>
      <flow-ref name="Join-Flow" doc:name="Flow Reference"/>
     </sub-flow>

    <sub-flow name="Flow2" doc:name="Flow2">
    <logger level="INFO" message="Flow2: processing started" doc:name="Logger"/>
     <set-payload value="Flow2 Payload" doc:name="Set Payload"/>
     <scripting:component doc:name="Groovy">
     <scripting:script engine="Groovy"><![CDATA[sleep(2000); return message.payload;]]></scripting:script>
     </scripting:component>
      <!--  Transformation payload -->
    <logger level="INFO" message="Flow2: processing finished" doc:name="Logger"/>
     <flow-ref name="Join-Flow" doc:name="Flow Reference"/>
    </sub-flow>

    <sub-flow name="Join-Flow" doc:name="Join-Flow">
    <collection-aggregator timeout="6000" failOnTimeout="true" doc:name="Collection Aggregator"/>
    <combine-collections-transformer doc:name="Combine Collections"/>
    <logger level="INFO"  message="Combined Payload: #[message.payload]" doc:name="Logger"/>
    <set-payload value="Soap XML Response" doc:name="Set Payload"/>
    </sub-flow> 
一个有趣的事实是,如果我使用。所以出于这个原因,我试着选择分散聚集而不是所有路由器。但我不确定如何处理上述由分散-聚集引发的异常。有什么出路吗

更新流程:-

现在您可以看到,在删除set属性之后,它并没有合并两个流的两个有效负载。。。。。它只获得第一个流的有效负载:-组合有效负载:[Flow1 payload]…

删除散布聚集中消息处理器周围的异步作用域,这确实为您实现了并行化,因此您不必这样做

编辑:还删除处理MULE_相关性属性的set属性消息处理器。“分散-聚集”应该为你做这件事

EDIT2:您可以删除围绕单个流的处理器链ref:这没用

此外,对于分散-聚集的作用似乎有一个深刻的误解:您通过传递和重新实现分散-聚集建议为您执行的所有操作,强制使其子流响应收敛到单个连接流,在该连接流中聚合内容

删除指向连接流的流引用,删除连接流,只将其处理逻辑而不是聚合器放在分散聚集后。

删除分散聚集中消息处理器周围的异步范围,这确实为您实现了并行化,因此您不必这样做

编辑:还删除处理MULE_相关性属性的set属性消息处理器。“分散-聚集”应该为你做这件事

EDIT2:您可以删除围绕单个流的处理器链ref:这没用

此外,对于分散-聚集的作用似乎有一个深刻的误解:您通过传递和重新实现分散-聚集建议为您执行的所有操作,强制使其子流响应收敛到单个连接流,在该连接流中聚合内容


删除指向连接流的流引用,删除连接流,并将其处理逻辑而不是聚合器放在分散聚集之后。

因此,根据David的建议,最终工作解决方案是:-

      <flow name="fork" doc:name="fork">
            <http:inbound-endpoint host="localhost" port="8090" path="scattergather" exchange-pattern="request-response" doc:name="HTTP"/>

          <scatter-gather timeout="6000">
           <!-- Calling Flow1 -->
            <flow-ref name="Flow1" doc:name="Flow Reference"/>
            <!-- Calling Flow2 -->
            <flow-ref name="Flow2" doc:name="Flow Reference"/>
          </scatter-gather>

           <!--  <collection-aggregator timeout="6000" failOnTimeout="true" doc:name="Collection Aggregator"/>
            <combine-collections-transformer doc:name="Combine Collections"/> -->
            <logger level="INFO"  message="Combined Payload: #[message.payload]" doc:name="Logger"/>
             <logger level="INFO"  message="Payload1: #[message.payload[0]] and Payload2: #[message.payload[1]] " doc:name="Logger"/>
            <set-payload value="Done Merging ...!!!" doc:name="Set Payload"/>

            <logger message="Back to Main Flow" level="INFO" doc:name="Logger"/>
        </flow>



        <sub-flow name="Flow1" doc:name="Flow1">
           <logger level="INFO" message="Flow1: processing started" doc:name="Logger"/>
           <set-payload value="Flow1 Payload" doc:name="Set Payload"/>
           <logger level="INFO" message="Flow1: processing finished" doc:name="Logger"/>
         </sub-flow>


        <sub-flow name="Flow2" doc:name="Flow2">
           <logger level="INFO" message="Flow2: processing started" doc:name="Logger"/>
           <!-- Sleep function to delay the flow2 payload -->
           <set-payload value="Flow2 Payload" doc:name="Set Payload"/>
               <scripting:component doc:name="Groovy">
                   <scripting:script engine="Groovy"><![CDATA[sleep(3000); return message.payload;]]></scripting:script>
               </scripting:component>
           <logger level="INFO" message="Flow2: processing finished" doc:name="Logger"/>
         </sub-flow>

</mule>

因此,根据David的建议,最终工作解决方案是:-

      <flow name="fork" doc:name="fork">
            <http:inbound-endpoint host="localhost" port="8090" path="scattergather" exchange-pattern="request-response" doc:name="HTTP"/>

          <scatter-gather timeout="6000">
           <!-- Calling Flow1 -->
            <flow-ref name="Flow1" doc:name="Flow Reference"/>
            <!-- Calling Flow2 -->
            <flow-ref name="Flow2" doc:name="Flow Reference"/>
          </scatter-gather>

           <!--  <collection-aggregator timeout="6000" failOnTimeout="true" doc:name="Collection Aggregator"/>
            <combine-collections-transformer doc:name="Combine Collections"/> -->
            <logger level="INFO"  message="Combined Payload: #[message.payload]" doc:name="Logger"/>
             <logger level="INFO"  message="Payload1: #[message.payload[0]] and Payload2: #[message.payload[1]] " doc:name="Logger"/>
            <set-payload value="Done Merging ...!!!" doc:name="Set Payload"/>

            <logger message="Back to Main Flow" level="INFO" doc:name="Logger"/>
        </flow>



        <sub-flow name="Flow1" doc:name="Flow1">
           <logger level="INFO" message="Flow1: processing started" doc:name="Logger"/>
           <set-payload value="Flow1 Payload" doc:name="Set Payload"/>
           <logger level="INFO" message="Flow1: processing finished" doc:name="Logger"/>
         </sub-flow>


        <sub-flow name="Flow2" doc:name="Flow2">
           <logger level="INFO" message="Flow2: processing started" doc:name="Logger"/>
           <!-- Sleep function to delay the flow2 payload -->
           <set-payload value="Flow2 Payload" doc:name="Set Payload"/>
               <scripting:component doc:name="Groovy">
                   <scripting:script engine="Groovy"><![CDATA[sleep(3000); return message.payload;]]></scripting:script>
               </scripting:component>
           <logger level="INFO" message="Flow2: processing finished" doc:name="Logger"/>
         </sub-flow>

</mule>

在删除异步块之后,我开始并行处理它。。但是获取空指针异常。。如何删除异常??嗨,大卫。。已删除集合属性。。但现在我的记录器中没有得到聚合结果。。它正在抛出异常空指针异常。。对你真是天才大卫。。。它起作用了。。删除了连接流,并在分散-聚集后完成了处理逻辑。。还删除了聚合器..删除异步块后,我将并行处理它。。但是获取空指针异常。。如何删除异常??嗨,大卫。。已删除集合属性。。但现在我的记录器中没有得到聚合结果。。它正在抛出异常空指针异常。。对你真是天才大卫。。。它起作用了。。删除了连接流,并在分散-聚集后完成了处理逻辑。。还删除了聚合器..在分散聚集之后只有一个记录器:使用它有什么意义?如果您对聚合结果没有做太多的处理,那么您不需要它,也不需要全部,只需异步执行不同的消息处理器/链…现在我需要日志中的聚合结果。。我将使用此聚合结果供以后使用。在分散收集之后,您只有一个记录器:使用它有什么意义?如果您对聚合结果没有做太多的处理,那么您不需要它,也不需要全部,只需异步执行不同的消息处理器/链…现在我需要日志中的聚合结果。。我将使用此聚合结果供以后使用
[try1].ScatterGatherWorkManager.02] org.mule.api.processor.LoggerMessageProcessor: Flow2: processing started
INFO  2014-08-18 13:34:24,361 [[try1].ScatterGatherWorkManager.01] org.mule.api.processor.LoggerMessageProcessor: Flow1: processing started
INFO  2014-08-18 13:34:24,364 [[try1].ScatterGatherWorkManager.01] org.mule.api.processor.LoggerMessageProcessor: Flow1: processing finished
WARN  2014-08-18 13:34:24,366 [[try1].ScatterGatherWorkManager.01] org.mule.routing.correlation.CollectionCorrelatorCallback: Correlation Group Size not set, but correlation aggregator is being used. Message is being forwarded as is
INFO  2014-08-18 13:34:24,401 [[try1].ScatterGatherWorkManager.01] org.mule.api.processor.LoggerMessageProcessor: Combined Payload: [Flow1 Payload]
INFO  2014-08-18 13:34:26,615 [[try1].ScatterGatherWorkManager.02] org.mule.api.processor.LoggerMessageProcessor: Flow2: processing finished
ERROR 2014-08-18 13:34:26,625 [[try1].connector.http.mule.default.receiver.03] org.mule.exception.DefaultMessagingExceptionStrategy: 
********************************************************************************
Message               : null (java.lang.NullPointerException). Message payload is of type: String
Code                  : MULE_ERROR--2
--------------------------------------------------------------------------------
Exception stack is:
1. null (java.lang.NullPointerException)
  org.mule.api.routing.AggregationContext$1:41 (null)
2. null (java.lang.NullPointerException). Message payload is of type: String (org.mule.api.MessagingException)
  org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor:32 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/MessagingException.html)
--------------------------------------------------------------------------------
Root Exception stack trace:
java.lang.NullPointerException
    at org.mule.api.routing.AggregationContext$1.evaluate(AggregationContext.java:41)
    at org.apache.commons.collections.CollectionUtils.select(CollectionUtils.java:517)
    at org.apache.commons.collections.CollectionUtils.select(CollectionUtils.java:498)
    + 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything)
********************************************************************************
      <flow name="fork" doc:name="fork">
            <http:inbound-endpoint host="localhost" port="8090" path="scattergather" exchange-pattern="request-response" doc:name="HTTP"/>

          <scatter-gather timeout="6000">
           <!-- Calling Flow1 -->
            <flow-ref name="Flow1" doc:name="Flow Reference"/>
            <!-- Calling Flow2 -->
            <flow-ref name="Flow2" doc:name="Flow Reference"/>
          </scatter-gather>

           <!--  <collection-aggregator timeout="6000" failOnTimeout="true" doc:name="Collection Aggregator"/>
            <combine-collections-transformer doc:name="Combine Collections"/> -->
            <logger level="INFO"  message="Combined Payload: #[message.payload]" doc:name="Logger"/>
             <logger level="INFO"  message="Payload1: #[message.payload[0]] and Payload2: #[message.payload[1]] " doc:name="Logger"/>
            <set-payload value="Done Merging ...!!!" doc:name="Set Payload"/>

            <logger message="Back to Main Flow" level="INFO" doc:name="Logger"/>
        </flow>



        <sub-flow name="Flow1" doc:name="Flow1">
           <logger level="INFO" message="Flow1: processing started" doc:name="Logger"/>
           <set-payload value="Flow1 Payload" doc:name="Set Payload"/>
           <logger level="INFO" message="Flow1: processing finished" doc:name="Logger"/>
         </sub-flow>


        <sub-flow name="Flow2" doc:name="Flow2">
           <logger level="INFO" message="Flow2: processing started" doc:name="Logger"/>
           <!-- Sleep function to delay the flow2 payload -->
           <set-payload value="Flow2 Payload" doc:name="Set Payload"/>
               <scripting:component doc:name="Groovy">
                   <scripting:script engine="Groovy"><![CDATA[sleep(3000); return message.payload;]]></scripting:script>
               </scripting:component>
           <logger level="INFO" message="Flow2: processing finished" doc:name="Logger"/>
         </sub-flow>

</mule>