与HornetQ的Java JMS连接

时间:2015-12-07 22:02:08

标签: java jms hornetq

我们正在使用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);
    }

0 个答案:

没有答案