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,我如何在 JmsListener 中获取会话。

@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,但无法获取访问传递计数的确切对象。你能澄清一下吗。

@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 方法。