Spring消息监听器/ MANUAL确认

时间:2015-09-23 14:35:02

标签: spring jms message mdp

我知道这听起来像听了1000次,但我不这么认为 我无法找到解决方案:

使用通用ejb我可以使用确认模式来确认() 手动消息。如果我不这样做,那就重新传递。我这样做了 在过去,它运作良好。

使用Spring JMS我遇到了问题,我似乎也是 只有在例外情况下才能设置要重新处理的重新传递 抛出或根本不投掷。

如何像ejb一样实现它?

我的问题是:如果消息被确认,我不想要 它将被重新传递,即使发生异常。

2 个答案:

答案 0 :(得分:1)

我们可以根据您的要求使用spring framework的 DefaultMessageListenerContainer

请参阅以下来自Spring的文档:

  

以类似于EJB世界中的消息驱动Bean(MDB)的方式,   消息驱动的POJO(MDP)充当JMS消息的接收器。该   一个限制(但也参见下面的讨论   MDP上的MessageListenerAdapter类是它必须实现的   javax.jms.MessageListener接口。请注意,在   您的POJO将在多个线程上接收消息的情况,   确保您的实现是线程安全的非常重要。

http://docs.spring.io/spring/docs/2.5.x/reference/jms.html#jms-asynchronousMessageReception

以下是我在方法中添加了acknowledge()方法的代码段。

JMS侦听器类:

public class MyProjectJMSListener implements MessageListener {
    public void onMessage(Message message) {
        try {
            message.acknowledge();
            //Business logic to be added 
        }
        catch (JMSException ex) {
                throw new RuntimeException(ex);
        }       
    }
}

<强>弹簧JMS-config.xml中

<bean id="messageListener" class="com.myproj.MyProjectJMSListener" />

<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="connectionFactory"/>  <!-- connectionFactory bean class to be added -->
    <property name="destination" ref="my.jms.destination"/> 
    <property name="messageListener" ref="messageListener" />
</bean>

答案 1 :(得分:1)

感谢您的回复。但是,我这样做完全是这样的, 除了我使用Spring 3和annotation配置。问题 不是接收而是确认。如果我使用交易 或不是,似乎消息在自动时被确认 接收。

我尝试直接扩展MessageListener,然后继续... 注意到了。

public class JMSListener implements SessionAwareMessageListener<TextMessage> {
...

    @Override
    public void onMessage(TextMessage message, Session session) {
        ...
    }
}

这样我就能看到会话设置。例如。 session.getAcknowledgeMode() 提供客户端确认和session.getTransacted()提供真实 或者取决于我设置的内容。但似乎没有效果。 无论如何,这个消息似乎得到了承认。

对于CLI的CLIENT_ACKNOWLEDGE,java doc也有区别 和jee。对于春天,有写:

“CLIENT_ACKNOWLEDGE”:成功侦听器执行后自动确认消息;如果抛出异常,则无法重新开始。

对于jee,有写道:

CLIENT_ACKNOWLEDGE使用此确认模式,客户端通过调用消息的确认方法来确认消费消息。

对我来说,这可能是原因?但如果确实如此(我 无法相信它会使春天无法处理消息?