我们正在使用hornetQ,并获得了一个单独的java应用程序,它连接到队列以从中读取。 我们正在连接它,从连接创建JMS会话, 然后从会话中获取JMS MessageConsumer,然后将自定义MessageListener分配给MessageConsumer。 我们为每个处理过的消息调用message.acknowledge()。
这一切都很有效,但是如果我们在处理过程中杀死我们的java应用程序,在点击acknowledge()之前,消息将从hornetQ中删除,但从未处理过,并且永远丢失。 似乎我们当前的Java应用程序JMS设置以某种方式通过从队列中删除,然后回滚/重新插入它,如果出现问题。 但是如果我们终止我们的应用程序,就不会有任何回滚或重新插入,因为它发生在我们的客户端/ java代码中。
是否有设置或交付模式或我可以在客户端配置的内容,导致HornetQ将每条消息视为"未消费"(并且仍然在队列中)直到客户端发送确认,回滚不是必要的吗?
编辑:也尝试使用事务模式,调用:
connection.createSession(true,acknowledgementType)
我们的MessageListener:
@Override public void onMessage(Message message) { LOGGER.debug("Message received. Going to handle message."); try { final TextMessage messageReceived = (TextMessage) message; final String text = messageReceived.getText(); LOGGER.debug(String.format("Message content:\n%s", text)); final boolean isMessageSent = eventDispatcher.handleEvent(text); if (isMessageSent) { LOGGER.error("Behold!"); message.acknowledge(); session.commit(); } else { session.rollback(); } } catch (JMSException jmse) { LOGGER.error("Failed to get text from a message from the events queue.", jmse); } catch (JAXBException jaxbe) { LOGGER.error("Failed to deserialize contents of the message from the events queue.", jaxbe); } catch (Exception ex) { LOGGER.error("An error occurred when receiving an event from the events queue:", ex); }