2014-03-27 143 views
2

我试图解决以下情形:JMS先前消息确认

我使用消息,而是采取在我根据对正确消息处理系统中的中断(比如例如数据库)

我正在使用CLIENT_ACKNOWLEDGE,并且只在没有引发异常时调用.acknowledge()方法。

当我抛出一个异常,消息未被确认,并且我可以看到建立的未确认队列时,这可以正常工作。但是,这些消息已经全部交付给消费者。

现在假设数据库重新联机,并且任何新消息都被成功处理。所以我打电话给他们。我读到了这个调用.ackackledge()不仅承认了这个消息,而且还承认了消费者以前收到的所有消息。

这不是我想要的!我需要这些先前未确认的消息被重新发送/重试。我想让他们在队列中让JMS处理重试,因为在消息“重试消息”中维护一个Collection可能会冒失去这些消息的风险(因为.ackackledge已经让所有人都失望了)硬件失败)。

是否有一种方法可以明确确认特定的消息,而不是“承认所有先前的消息”行为?

回答

1

您需要在重新从第一个未确认消息重新启动消息传递失败后,在您的会话中调用恢复。从JMS 1.1规范部4.4.11

当使用CLIENT_ACKNOWLEDGE模式,客户端可以建立一个较大 数未确认的消息的同时试图对其进行处理。 A JMS提供商应为管理员提供一种限制客户端 超限运行的方法,以便客户端不会因资源耗尽而被驱动,并且当他们正在使用的某些资源暂时被阻止时会导致 发生故障。

会话的recover方法用于停止会话和与它的第一个确认的消息重新启动它 。实际上,交付消息的会话系列 将重置为其最后一个确认消息 后的时间点。它现在提供的消息可以是不同于原先递送由于消息到期 和更高优先级的消息的到达 。

+0

为了这个工作,我需要关闭我的消费,直到我知道失败结束。我需要保证消息顺序。我什么时候才能知道致电恢复?我需要等到新消息通过后才能成功处理。在这种情况下,我会在调用恢复来处理以前的消息之前处理一条新消息。 – 75inchpianist

+0

我不确定您的客户在发生故障时不会如何停止,因为当tcp连接断开时您的Connection无效。在失败后重新连接时,请致电恢复。 –

+0

我与JMS的连接不是失败的。这是我与数据库的连接。所以当我消费一条消息时,我试图将数据从数据库中提取出来。这会引发异常。所有消息都会发生这种情况,直到数据库备份完毕。所以在这段时间里我不会阻止我的消费者。我发现我的数据库连接的唯一方法是备份,如果我使用消息并且无法抛出异常。 – 75inchpianist

3

确认特定消息未由JMS规范定义。因此,一些JMS实现者提供每个消息传递确认,而另一些则不提供。您将需要检查您的JMS提供者文档。

消息队列通常具有对消息是如何传递给客户端的选项,可以是先入先出(FIFO)或基于优先级的。选择FIFO选项,以便所有消息按照它们进入队列的顺序传送。当数据库脱机并返回时,请调用恢复方法重新以相同顺序重新传送所有消息。