消息驱动 Bean 两次读取相同的消息

Posted

技术标签:

【中文标题】消息驱动 Bean 两次读取相同的消息【英文标题】:Message-Driven Bean reads two times the same message 【发布时间】:2016-05-04 05:04:27 【问题描述】:

在我的时区早上好。

应用服务器 -> WAS 7 EJB 3.0

在我正在进行的项目中,我们使用消息驱动 bean 从队列中读取消息。这个消息驱动 bean 读取了两次相同的消息,在第二次读取时它抛出异常,因为数据库插入中的完整性约束。 为什么这个消息驱动的 bean 读取消息两次。 我们在队列中只使用了一个侦听器,并且只有一个 MDB 连接到该侦听器。 我们通过注解使用下面的 ActivationConfigProperty 1 个消息选择器 2 目的地类型 3 目的地

代码片段

@MessageDriven(activationConfig = 
    @ActivationConfigProperty(propertyName = "messageSelector", propertyValue = "ResponseType = 'XXXXX'"),
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
    @ActivationConfigProperty(propertyName = "destination", propertyValue = "jms/YYYY"))

提前致谢 最好的问候

【问题讨论】:

你能告诉我们你在MDB中处理消息的代码sn-p吗?还为您的提供商/消费者通信选择了哪种确认模式? 有什么地方可以在 WAS 中配置确认吗? www-01.ibm.com/support/knowledgecenter/SSAW57_8.5.5/… 在这里查看。我仍然不确定这是否可以解决您的问题,但是我在 Weblogic 中的 MDB 也遇到了类似的情况,设置正确的确认模式对我有帮助。反正你可以试试 【参考方案1】:
@MessageDriven(activationConfig = 
    @ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "java:/jms/queue/data"),
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
    @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") )

使用此配置来指定消息的确认,我还认为我们需要指定 destinationLookupdestination 属性来指定严格的点对点通信。

使用消息侦听器来验证消息的准确接收时间以及消息发布的生存时间

@Stateless
public class MessageSender 

    @Inject
    JMSContext jmsContext;

    public void sendMessage(String message, Destination destination) 
        JMSProducer messageProducer = jmsContext.createProducer().setAsync(
                new CompletionListener() 

                    public void onException(Message message, Exception exception) 
                        System.out
                                .println("Message not delivered!!!!\nAn exception has occured "
                                        + exception);

                    

                    public void onCompletion(Message message) 
                        System.out
                                .println("Message  delivered : hooah ");

                    
                );
        // To check if both the messages are getting expired after the mentioned time
        messageProducer.setTimeToLive(6000);
        messageProducer.send(destination, message);
    


【讨论】:

以上是关于消息驱动 Bean 两次读取相同的消息的主要内容,如果未能解决你的问题,请参考以下文章

Intellij IDEA 创建消息驱动Bean - 接收JMS消息

是否可以在运行时手动将消息驱动 bean 订阅到 JMS 队列/主题?

WFLYEJB0137:仅允许具有 bean 管理的事务划分的会话和消息驱动的 bean 访问 UserTransaction

WebSphere 7 中的消息驱动 bean (EJB3)、XA 事务、错误处理

消息驱动的 bean (MDB) 可以在“外部”MQ 上侦听吗?

消息驱动bean(MDB)实例