【问题标题】:Message-Driven Bean reads two times the same message消息驱动 Bean 两次读取相同的消息
【发布时间】: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 也遇到了类似的情况,设置正确的确认模式对我有帮助。反正你可以试试

标签: java jakarta-ee jms websphere-7 message-driven-bean


【解决方案1】:
@MessageDriven(activationConfig = {
    @ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "java:/jms/queue/data"),
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
    @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") })

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

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

@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);
    }

}

【讨论】:

    猜你喜欢
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 2018-02-10
    • 2011-01-12
    • 2017-06-13
    相关资源
    最近更新 更多