JMS - 队列中的重新传递流

时间:2014-10-14 13:22:26

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

配置

我在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);

我理解的是,消费者应该处理消息的确认,换句话说,如果消费者不要调用message.acknowledge()方法,那么消息应该是交还。是不是?

当我的MDB刚刚读取消息(由监听器onMessage)时,该消息刚刚从队列中下来(如果我调用或不调用message.acknowledge()方法则独立)。 / p>

   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) {
            }

我做错了什么?

1 个答案:

答案 0 :(得分:0)

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