Spring消息侦听器/手动确认

Spring消息侦听器/手动确认,spring,jms,message,mdp,Spring,Jms,Message,Mdp,我知道这听起来像是听到了1000次,但我不这么认为 我真的找不到解决办法: 使用公共ejb,我可以使用确认模式来确认() 手动发送消息。如果我不这样做,它将被重新交付。是我干的 在过去,它运作良好 使用SpringJMS,我有一个问题,似乎我 仅当出现异常时,才能将重新交付设置为处理 不管是扔还是不扔 如何使用ejb实现它 我的问题是:如果消息被确认,我不想 即使出现异常,它也需要重新交付。我们可以根据您的要求使用spring framework的DefaultMessageListenerCo

我知道这听起来像是听到了1000次,但我不这么认为 我真的找不到解决办法:

使用公共ejb,我可以使用确认模式来确认() 手动发送消息。如果我不这样做,它将被重新交付。是我干的 在过去,它运作良好

使用SpringJMS,我有一个问题,似乎我 仅当出现异常时,才能将重新交付设置为处理 不管是扔还是不扔

如何使用ejb实现它

我的问题是:如果消息被确认,我不想
即使出现异常,它也需要重新交付。

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

请查找Spring的以下文档:

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

下面是我在方法上添加了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);
        }       
    }
}
spring 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>

感谢您的回复。但是,我就是这样做的, 除了我使用Spring3和注释配置。问题 不是接收,而是确认。如果我使用事务 不管是否,消息似乎是自动确认的,而 接收

我试着直接用下面的方法。。 注意是有效的

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

    @Override
    public void onMessage(TextMessage message, Session session) {
        ...
    }
}
公共类JMSListener实现SessionAwareMessageListener{
...
@凌驾
公共消息无效(文本消息消息、会话){
...
}
}
这样我就可以看到会话设置。例如session.getAcknowledgeMode() 传递客户端确认和会话。getTransact()传递true 或错误取决于我设置的内容。但似乎没有效果。 不管怎样,这条信息似乎得到了承认

spring客户端的java文档中也存在差异 还有吉。对于spring,有这样一句话:

“客户端确认”:侦听器成功执行后自动确认消息;在引发异常的情况下不重新交付

对于jee,有这样一句话:

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

对我来说这可能是原因?但如果真的是这样(我
难以置信)这会使spring无法处理消息?

您找到解决方案了吗?