繁体   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