我正在尝试为我目前的项目实施JMS。
我创建了消息生产者和消息使用者作为两个独立的应用程序,并希望将生产和消费作为两个独立的进程(客户端)。但我的要求是在生产者和消费者之间进行交易管理。假设生产者发送了100批消息,如果单个消息传递中的任何一个失败,则整个100个按摩批次应该失败。
我想我可以实现这一点,因为我发送的每批消息都在单独的会话中,所以我可以提交或回滚会话。但我的消费者是异步的并且在单个会话上运行。
如何在消费者中实现交易管理?如果该批次中的任何单个消息处理(消耗)失败,我希望消费者还应该回滚上面提到的100个消息批处理。
答案 0 :(得分:3)
您希望实现类似端到端确认之类的内容,但这会以某种方式与消息队列的概念发生冲突,这些消息队列本质上是异步的。如果您的消费者很忙,交易可能会延长一段时间。
为了简化它,我不会发送100条消息,而只发送一条消息,因为实际上您只有一条逻辑消息。
要实现确认/重试,消费者可以在另一个队列上发回另一条消息。制作人可以重试,接收者必须丢弃重复等。
我宁愿分担责任:制作人的责任是将消息传递给您的消息服务器。这是数据中心检查队列填充的可靠性。这是客户的责任,只有完全处理的消息才会从队列中删除(查找JMS会话CLIENT_ACKNOWLEDGE)。