2015-05-22 68 views
1

我正面臨着JBoss EAP 6和WebSphere MQ的問題。我已經開發一個消息驅動bean:WebSphere MQ wmq.jmsra在MDB異常之後循環

@MessageDriven(activationConfig = { 
    @ActivationConfigProperty(propertyName = "useJNDI", propertyValue = "true"), 
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), 
    @ActivationConfigProperty(propertyName = "destination", propertyValue = "java:/jms/VGT.EXTERN.IN"), 
    @ActivationConfigProperty(propertyName = "clientID", propertyValue = "VGT_BYSENDINGSYSTEMDISPATCHERMDB") }) 
@Pool(value = "BySendingSystemDispatcherMDB-pool") 
@TransactionAttribute(TransactionAttributeType.REQUIRED) 
public class BySendingSystemDispatcherMDB implements javax.jms.MessageListener { 

private Logger logger = Logger.getLogger(getClass()); 

@Inject 
@Named 
BySendingSystemDispatcher bySendingSystemDispatcher; 

@Resource 
MessageDrivenContext mdc; 

@Inject 
@Named 
Listener listener; 

@Override 
public void onMessage(Message message) { 
    try { 
     // Weiterbearbeitung deligieren 
     bySendingSystemDispatcher.onMessage(message); 
    } catch (JMSException e) { 
     listener.handleExceptionWhenMessageIsPoisend(e); 
     logger.error(e.getLinkedException(), e); 
     mdc.setRollbackOnly(); 
    } catch (JAXBException e) { 
     mdc.setRollbackOnly(); 
     listener.handleExceptionWhileProcessingMessage(message, e); 
     logger.error(e.getMessage(), e); 
    } catch (ClassCastException e) { 
     logger.error(e.getMessage(), e); 
     mdc.setRollbackOnly(); 
    } catch (Exception e) { 
     logger.error(e.getMessage(), e); 
     mdc.setRollbackOnly(); 
    } finally { 
     // logging 
     if (logger.isDebugEnabled()) { 
      String id = null; 
      try { 
       id = message.getJMSMessageID(); 
       logger.debug(((TextMessage) message).getText()); 
      } catch (Exception e) { 
       logger.debug("logging of message - " + id + " failed"); 
      } 
     } 

    } 

} 

方法bySendingSystemDispatcher.onMessage(消息)是投擲從java.lang.Exception的派生的異常,與@ApplicationException註解(回滾=真)。如果發生這種情況,消息將按照配置重新傳遞5次,之後它將在資源適配器內循環,並且不會再交付。我已經檢查了與HornetQ相同的場景,它按預期工作。

以下異常將被MQ

拋出
Class : class javax.jms.JMSException 
Stack : com.ibm.msg.client.commonservices.trace.Trace.ffst(Trace.java:1611) 
     : com.ibm.msg.client.wmq.common.internal.messages.WMQSendMarshal.constructMQMD(WMQSendMarshal.java:287) 
     : com.ibm.msg.client.wmq.common.internal.messages.WMQSendMarshal.exportMQMDAndMessageBuffers(WMQSendMarshal.java:503) 
     : com.ibm.msg.client.wmq.common.internal.messages.WMQSendMarshal.exportMQMD(WMQSendMarshal.java:567) 
     : com.ibm.msg.client.wmq.internal.WMQPoison$PoisonMessage.calculateMqmdAndBuffers(WMQPoison.java:1816) 
     : com.ibm.msg.client.wmq. 

一個有趣的一點是,你可以找到MQMD頭超過了退出閾值的恢復計數。

任何想法會發生什麼以及如何解決?

約爾格

+0

/var/mqm/errors中是否存在其他錯誤?是否有任何生成的fdc文件? – Umapathy

+0

FDC是寫的,但沒有真正明顯的報告在這份報告。我在本文中指出的至少有一個例外是FDC。您是否正在尋找一些特別的東西? –

+0

FDC文件生成期間引發異常,所以想知道它的報告什麼。定義「按預期工作」。 HornetQ丟棄的消息?您是否也在VGT.EXTERN.IN隊列中定義了退出隊列和退出閾值? – Umapathy

回答

0

我們發現爲什麼的ressource適配器已被迫循環的原因。由於我們錯誤地配置了boq,max-msg-len屬性比引用隊列小8倍。如果有一條消息比boq的max-msg-len大,並且有一個異常強制它移動到boq,那麼資源適配器試圖將它放到boq並失敗。正常情況下,ressouce適配器應該將其移動到dlq,但由於事務丟失,這也失敗了。在未能轉移到dlq之後,資源適配器沒有丟棄該消息,但它再次嘗試將其移至boq,該boq再次失敗,並且循環已啓動。

在我看來,資源適配器的行爲並不是真的正確,但如果同步max-msg-len屬性,問題就不應該發生。

感謝Umapathy對他的支持。

Jörg