我正在尝试重新处理来自死信/消息队列(DLQ)的消息。 在下面的方法中,当我在 Payara 5.2022.5 上执行
null
时,我得到 dlqConsumer.receive(5000)
。 当我使用 QueueBrowser
时,消息显示得很好。 while循环不执行什么?
public void resubmitMessages(int toResubmit) throws Exception {
log.debug("DLQService: resubmitMessages()");
InitialContext ctx = null;
QueueConnectionFactory connectionFactory;
QueueConnection queueConn = null;
try {
ctx = new InitialContext();
connectionFactory = (QueueConnectionFactory) ctx.lookup("jms/ConnectionFactory");
queueConn = connectionFactory.createQueueConnection();
QueueSession queueSession = queueConn.createQueueSession(true, QueueSession.AUTO_ACKNOWLEDGE);
assert queueSession.getTransacted();
Queue clsQueue = (Queue) ctx.lookup(CLS_NAME);
QueueSender sender = queueSession.createSender(clsQueue);
Queue dlq = (Queue) ctx.lookup("queue/mq.sys.dmq");
MessageConsumer dlqConsumer = queueSession.createConsumer(dlq);
int i = 0;
Message message;
while ((message = dlqConsumer.receive(5000)) != null && i < toResubmit) {
try {
log.debug("Processing: " + ((ObjectMessage) message).getObject());
sender.send(message);
queueSession.commit();
log.debug("resubmitted successfully to main queue from dlq");
} catch (JMSException jmse) {
log.error("Exception caught while resubmitting message to main queue", jmse);
queueSession.rollback();
throw jmse;
}
i++;
}
} catch (Exception e) {
log.error("Exception caught while sending message", e);
throw e;
} finally {
cleanUp(ctx, queueConn);
}
}
我错过了
queueConn.start();
来开始交易。 为什么我的方式没有返回消息,我不知道。 如果您是 JMS 专家,请对此发表评论。