【问题标题】:JMS - Redelivery flow in a queueJMS - 队列中的重新传递流
【发布时间】:2014-12-09 07:33:09
【问题描述】:

配置

我在 OC4J 10.1.3.x 中使用 EJB 3

问题

我创建了一个具有 CLIENT_ACKNOWLEDGE 方向的队列生产者,例如:

    queueConnection = queueConnectionFactory.createQueueConnection();
    queueSession = queueConnection.createQueueSession(false,
            Session.CLIENT_ACKNOWLEDGE);
    queueSender = queueSession.createSender(queue);

    ObjectMessage objMessage = queueSession.createObjectMessage();
    Mail data = new Mail();
    data.setMessage("Some random message.");
    objMessage.setObject(data);
    queueSender.send(objMessage);

我的理解是consumer应该处理消息的ack,也就是说如果consumerDO NOT调用message.acknowledge()方法,那么消息应该是redelivery。对吗?

发生的情况是,当我的 MDB 刚刚读取消息(由侦听器 onMessage)时,该消息刚刚从队列中取出(独立于我是否调用 message.acknowledge() 方法)。

   public void onMessage(Message message) {
            try {
                if (message instanceof ObjectMessage) {
                    ObjectMessage objectMessage = (ObjectMessage) message;
                    Mail mail = (Mail) objectMessage.getObject();
                    System.out.println(mail.getMessage());
                    throw new RuntimeException("Error");
                }
            } catch (JMSException e) {
            }

我做错了什么?

【问题讨论】:

    标签: java jakarta-ee jms message-queue message-driven-bean


    【解决方案1】:

    好吧,我对此进行了大量研究,发现容器通常会忽略客户端对会话创建的控制。在这种情况下:queueConnection.createQueueSession(false, Session.CLIENT_ACKNOWLEDGE); 因此,如果您需要在 MDB 中处理带有确认的消息过程,您需要使用 EJB 事务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-13
      • 2018-07-16
      • 2014-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-22
      • 2020-03-29
      相关资源
      最近更新 更多