簡體   English   中英

Spring JMS 監聽器確認

[英]Spring JMS listener acknowledge

我正在使用 JMS 從 IBM MQ 消息代理發送接收消息。 我目前正在開發偵聽器服務,該服務會在未確認的情況下將未處理的異常和消息發送回隊列。 我希望服務重試可配置的時間並拋出意味着偵聽器服務不可用的完整異常消息。

我的監聽器和容器工廠如下所示。

@JmsListener(destination = "testqueue", containerFactory = "queuejmsfactory")
public void consumer(String message) throws JMSException 
{ handle(message); }

@Bean(name = "queuejmsfactory") public JmsListenerContainerFactory getQueueTopicFactory(ConnectionFactory con , 
DefaultJmsListenerContainerFactoryConfigurer config) 
{ DefaultJmsListenerContainerFactory d = new DefaultJmsListenerContainerFactory(); 
d.setSessionTransacted(true); 
d.setSessionAcknowledgeMode(Session.AUTO_ACKNOWLEDGE); 
config.configure(d,con); 
return d; }

簡而言之,我有一個使用 SessionawareMessageListener onMessage 的現有代碼,我試圖將其復制到@JmsListener。 如果必須手動處理類似於 onMessage,我如何處理 session 提交和自動回滾以及如何在 JmsListener 中獲取 session。

@Override
public void onMessage(Mesage mes, Session ses) throws JMSException 
{ try 
{ TestMessage txtMessage = (TextMessage)message; 
handle(txtMessage); ses.commit(); 
} catch (Exception exp) 
{ if (shouldRollback(message))
{ ses.rollback();} 
else{logger,warn("moved to dlq"); 
ses.commit(); 
} 
} }

private boolean shouldRollback(Message mes) throws JMSException 
{ int rollbackcount = mes.getIntProperty("JMSXDeliveryCount"); 
return (rollbackcount <= maxRollBackCountFromApplication.properties)
}

更新代碼:

@JmsListener(destination = "testqueue", containerFactory = "queuejmsfactory")
    public void consumer(Message message) throws JMSException 
    { 
        try {TestMessage txtMessage = (TextMessage)message;
            handle(txtMessage);}
        catch(Excepton ex) {
            if shouldRollback(message)
            {throw ex;}
            else {logger.warn("moved to dlq")}

    }}

    private boolean shouldRollback(Message mes) throws JMSException 
    { int rollbackcount = mes.getIntProperty("JMSXDeliveryCount"); 
    return (rollbackcount <= maxRollBackCountFromApplication.properties)
    }

    @Bean(name = "queuejmsfactory") public JmsListenerContainerFactory getQueueTopicFactory(ConnectionFactory con , 
    DefaultJmsListenerContainerFactoryConfigurer config) 
    { DefaultJmsListenerContainerFactory d = new DefaultJmsListenerContainerFactory(); 
    d.setSessionTransacted(true); 
    d.setSessionAcknowledgeMode(Session.AUTO_ACKNOWLEDGE); 
    config.configure(d,con); 
    return d; }

我還嘗試從 Headers 訪問 JMSXDeliveryCount,但無法獲得確切的 object 來訪問傳遞計數。 你能澄清一下嗎?

@JmsListener(destination = "testqueue", containerFactory = "queuejmsfactory")
    public void consumer(Message message,
                               @Header(JmsHeaders.CORRELATION_ID) String correlationId,
                               @Header(name = "jms-header-not-exists") String nonExistingHeader,
                               @Headers Map<String, Object> headers,
                               MessageHeaders messageHeaders,
                               JmsMessageHeaderAccessor jmsMessageHeaderAccessor) {}

您可以將Session作為另一個參數添加到JmsListener方法中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM