Jms 消息仅确认,直到消息确认为止

2024-06-22

如何确保消息确认仅删除在 jms 代理中调用确认的消息之前的消息。 目前我有一个系统,它从 jms 队列中消费并部分处理它。稍后,一批这些消息将由不同的线程保存。我现在需要确认消息。但问题是我必须停止使用消息,否则确认先前收到的消息也将确认收到的所有其他后续消息。

换句话说,假设队列中有 10 条消息。我消费了 7 个,然后在第 5 条消息上确认。这反过来会从队列中删除消费者收到的所有 7 条消息。有没有办法只确认并从队列中删除消息直到第 5 条消息。

编辑:我尝试创建两个会话并从不同的会话中使用,但是(至少使用 apache qpid)这执行不一致。我所说的不一致是指,有时在测试过程中,一个消费者能够接收消息,而另一个消费者根本没有接收到消息,无论你等待多久。这对我来说是一个解决方案,但由于不一致,不能使用它作为解决方案。


我知道这篇文章已经过时了,但这个答案应该会让那些后来偶然发现它的人受益。

如果您想精细控制要确认的消息,individual确认方法应该对你有帮助。使用此确认模式,您可以确认会话中的各个消息。尚未被确认的消息将被重新传送。

这不是规范的一部分,但大多数队列提供程序都在规范之外支持它。

Oracle http://docs.oracle.com/cd/E19717-01/819-7757/aeqeg/index.html

为了获得更大的灵活性,消息队列允许您自定义 JMS 客户端确认模式。在客户端确认模式下,客户端 通过调用显式确认消息消耗 消息对象的acknowledge()方法。

标准行为 该方法用于使会话确认所有消息 自上次以来已被会话中的任何消费者消费 该方法被调用。 (也就是说,会话确认当前 消息和所有先前未确认的消息,无论是谁 消耗了他们。)

除了 JMS 指定的标准行为之外,消息队列 允许您使用客户端确认模式来确认一条消息 时间。

public interface com.sun.messaging.jms.Message {
          void acknowledgeThisMessage() throws JMSException;
          void acknowledgeUpThroughThisMessage() throws JMSException;
}

ActiveMQ https://java.net/jira/browse/JMS_SPEC-95

人们可以想象其他也有用的确认模式,例如 示例: CONSUMER_ACKNOWLEDGE 其中 Message.acknowledge() 将 仅确认特定 MessageConsumer 上收到的消息, 或 CONSUMER_CHECKPOINT_ACKNOWLEDGE 其中 Message.acknowledge() 会 仅确认收到的消息(包括该消息) 调用该方法的实例。

但如果不尝试所有这些不同的可能性, 是否可以考虑只添加 INDIVIDUAL_ACKNOWLEDGE 模式?仅此一点就可以实现多线程应用程序 实现他们需要的任何行为。

connection.createQueueSession(false, ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE);

我个人没有使用过 QPID,但是文档提示 http://qpid.apache.org/releases/qpid-0.22/messaging-api/ruby/api/classes/Qpid/Messaging/Session.html#M000009事实上,单独的消息确认是可能的。

Examples
  # acknowledge all received messages
  session.acknowledge

  # acknowledge a single message
  session.acknowledge :message => message

在处理批次时,您可以确认接收和处理的每条消息。如果遇到异常,不要ack消息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jms 消息仅确认,直到消息确认为止 的相关文章

随机推荐