2013-07-03 49 views
1

从JMS队列(Websphere MQ)获取消息以进一步处理Mule(v。2.2.1)时,我们会遇到虚假错误。下面我列出了受影响的服务以及Mule日志中的摘录。具有“DispatchThread:1”的第一段是服务按预期工作时的情况,而第二种情况是“DispatchThread:6”,则该消息丢失,即未处理。接收方的组件未收到消息(线程问题?)

如日志所示,消息排队等待processFooBar.service在两种情况下进行处理,但在后一种情况下,它从未被提取用于进一步处理。在工作示例中,它几乎立即被排队并处理。

我们怀疑这是由线程配置文件的不平衡引起的,即接收器线程配置文件等,但同时我们觉得这是一个非常模糊的解释。有点担心,如果系统负载增加,消息可能会丢失,而且即使我们增加了可能遇到相同问题的线程数量。

如果我们的怀疑能够得到证实,并且如果有人遇到同样的问题,他们会怎么做呢?我们将升级到Mule 3,但我怀疑这个问题对于Mule 3来说没有什么不同?

服务定义:

<service name="processFooBar"> 
    <inbound> 
     <jms:inbound-endpoint queue="A.FROM.BAR" 
           connector-ref="fooConnector" 
           disableTemporaryReplyToDestinations="true"> 
      <transformers> 
       <transformer ref="messageLogger"/> 
       <transformer ref="jmsMessageToObjectTransformer"/> 
       ... 
       .. 
      </transformers> 
     </jms:inbound-endpoint> 
    </inbound> 
    ... 
    .. 
</service> 

日志提取物:

... 
.. 
@ESB-: 2013-06-24 10:31:37,319 DEBUG [DispatchThread: 1] org.mule.service.AbstractService - Service: processFooBar has received asynchronous event on: jms://A.FROM.BAR 
@ESB-: 2013-06-24 10:31:37,319 DEBUG [DispatchThread: 1] org.mule.model.seda.SedaService - Service: processFooBar has received asynchronous event on: jms://A.FROM.BAR 
@ESB-: 2013-06-24 10:31:37,319 DEBUG [DispatchThread: 1] org.mule.model.seda.SedaService - Service processFooBar putting event on queue processFooBar.service: MuleEvent: ..., endpointEncoding=UTF-8} 
@ESB-: 2013-06-24 10:31:37,321 DEBUG [processFooBar.1] org.mule.model.seda.SedaService - Service: processFooBar dequeued event on: jms://A.FROM.BAR 
@ESB-: 2013-06-24 10:31:37,331 DEBUG [processFooBar.1] org.mule.model.seda.SedaService - Service processFooBar polling queue processFooBar.service, timeout = 10,000 
@ESB-: 2013-06-24 10:31:37,339 DEBUG [processFooBar.2] org.mule.DefaultMuleMessage - new copy of message for Thread[processFooBar.2,5,main] 
@ESB-: 2013-06-24 10:31:37,367 DEBUG [processFooBar.2] org.mule.transformer.AbstractTransformer - Setting transformer name to: fooDecoderTransformer 
@ESB-: 2013-06-24 10:31:37,368 DEBUG [processFooBar.2] org.mule.transformer.AbstractTransformer - java.lang.Object has been added as source type for this transformer, there will be no source type checking performed 
@ESB-: 2013-06-24 10:31:37,368 DEBUG [processFooBar.2] org.mule.transformer.AbstractTransformer - Setting transformer name to: objectToStringTransformer 
... 
.. 
@ESB-: 2013-06-24 13:19:51,896 DEBUG [DispatchThread: 6] org.mule.service.AbstractService - Service: processFooBar has received asynchronous event on: jms://FOMS.FROM.FSM.Bar 
@ESB-: 2013-06-24 13:19:51,896 DEBUG [DispatchThread: 6] org.mule.model.seda.SedaService - Service: processFooBar has received asynchronous event on: jms://FOMS.FROM.FSM.Bar 
@ESB-: 2013-06-24 13:19:51,897 DEBUG [DispatchThread: 6] org.mule.model.seda.SedaService - Service processFooBar putting event on queue processFooBar.service: MuleEvent: ..., endpointEncoding=UTF-8} 
... 
.. 

回答

0

骡子有一个限制到最大线程默认为16,所以你可以继续改变:

第一件事你可以

  1. 设置numberOfConsu链节的JMS连接器
  2. 设置maxThreadsActive属性的JMS连接器的接收线程瞩目的元素上属性
<jms:activemq-connector name="jmsConnector" numberOfConsumers="15" brokerURL="vm://localhost"> 
    <receiver-threading-profile maxThreadsActive="15"/> 
</jms:activemq-connector> 

另一种方案是,你可以设置流处理策略,请参考以下链接: https://docs.mulesoft.com/mule-user-guide/v/3.5/flow-processing-strategies