Java JMS-队列中的重新交付流

Java JMS-队列中的重新交付流,java,jakarta-ee,jms,message-queue,message-driven-bean,Java,Jakarta Ee,Jms,Message Queue,Message Driven Bean,配置 我在OC4J 10.1.3.x中使用EJB3 问题 我创建了一个面向客户机的队列生成器,如: queueConnection = queueConnectionFactory.createQueueConnection(); queueSession = queueConnection.createQueueSession(false, Session.CLIENT_ACKNOWLEDGE); queueSender = queueSessi

配置

我在OC4J 10.1.3.x中使用EJB3

问题

我创建了一个面向客户机的队列生成器,如:

    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);
我的理解是,消费者应该处理消息的ack,换句话说,如果消费者不调用
message.acknowledge()
方法,那么消息应该重新传递。是这样吗

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


我做错了什么?

嗯,我做了大量的研究,发现容器通常会忽略会话创建的客户端控制。在这种情况下:
queueConnection.createQueueSession(false,Session.CLIENT\u ACKNOWLEDGE)所以,如果您需要在MDB中使用acknowledge或not处理消息过程,那么您需要使用EJB事务

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