我试图解决以下情形:JMS先前消息确认
我使用消息,而是采取在我根据对正确消息处理系统中的中断(比如例如数据库)
我正在使用CLIENT_ACKNOWLEDGE,并且只在没有引发异常时调用.acknowledge()方法。
当我抛出一个异常,消息未被确认,并且我可以看到建立的未确认队列时,这可以正常工作。但是,这些消息已经全部交付给消费者。
现在假设数据库重新联机,并且任何新消息都被成功处理。所以我打电话给他们。我读到了这个调用.ackackledge()不仅承认了这个消息,而且还承认了消费者以前收到的所有消息。
这不是我想要的!我需要这些先前未确认的消息被重新发送/重试。我想让他们在队列中让JMS处理重试,因为在消息“重试消息”中维护一个Collection可能会冒失去这些消息的风险(因为.ackackledge已经让所有人都失望了)硬件失败)。
是否有一种方法可以明确确认特定的消息,而不是“承认所有先前的消息”行为?
为了这个工作,我需要关闭我的消费,直到我知道失败结束。我需要保证消息顺序。我什么时候才能知道致电恢复?我需要等到新消息通过后才能成功处理。在这种情况下,我会在调用恢复来处理以前的消息之前处理一条新消息。 – 75inchpianist
我不确定您的客户在发生故障时不会如何停止,因为当tcp连接断开时您的Connection无效。在失败后重新连接时,请致电恢复。 –
我与JMS的连接不是失败的。这是我与数据库的连接。所以当我消费一条消息时,我试图将数据从数据库中提取出来。这会引发异常。所有消息都会发生这种情况,直到数据库备份完毕。所以在这段时间里我不会阻止我的消费者。我发现我的数据库连接的唯一方法是备份,如果我使用消息并且无法抛出异常。 – 75inchpianist