如何为CXF重新发布失败的QPid消息创建JMS传输?或者,是否有更好的解决方案,我';我失踪了?

如何为CXF重新发布失败的QPid消息创建JMS传输?或者,是否有更好的解决方案,我';我失踪了?,jms,cxf,qpid,Jms,Cxf,Qpid,我正在为我的公司写一个电子邮件网站服务。主要要求之一是保证交付,因此我们在JMS传输上有一个薄HTTP层,使用持久QPid队列 我遇到的问题之一是处理过程中的错误处理。如果在出现错误时简单地回滚事务,则消息将发送到队列的头部。如果错误足够普遍,这可能会锁定整个队列,直到有人手动干预,我们希望通过发回头部来避免这种情况,以便同时处理消息 然而,这就是我的问题所在。首先,虽然AMQP有一种机制可以原子地“拒绝并重新查询”消息,而不是确认消息,但JMS似乎没有任何类似的功能,因此访问它的唯一方法是通过

我正在为我的公司写一个电子邮件网站服务。主要要求之一是保证交付,因此我们在JMS传输上有一个薄HTTP层,使用持久QPid队列

我遇到的问题之一是处理过程中的错误处理。如果在出现错误时简单地回滚事务,则消息将发送到队列的头部。如果错误足够普遍,这可能会锁定整个队列,直到有人手动干预,我们希望通过发回头部来避免这种情况,以便同时处理消息

然而,这就是我的问题所在。首先,虽然AMQP有一种机制可以原子地“拒绝并重新查询”消息,而不是确认消息,但JMS似乎没有任何类似的功能,因此访问它的唯一方法是通过强制转换,这将我与特定的JMS实现联系在一起。此外,CXF的JMS传输似乎没有任何在传输级别重写或注入行为的方法,这意味着我要么编写字节码代理,要么更改代码并重新编译以获得所需的行为

为了解决这个问题,我考虑了在CXF中实现一个故障处理程序的想法,它只需从CXF消息重建JMS消息,并对其重新排队。但是,我不能使用事务处理会话,因为该故障会导致回滚,而我无法覆盖该回滚,然后我会在头部(回滚)和尾部(重新队列)上得到消息的副本。我不能使用CLIENT_ACKNOWLEDGE,因为JMS传输在提交消息进行处理之前会确认消息,这意味着如果服务器在错误的时间停机,我可能会丢失一条消息

因此,基本上,只要我坚持接受JMS传输的默认行为,就不可能在不损害数据完整性的情况下获得我想要的行为(对失败消息重新排队)

一位同事建议完全避免JMS传输,直接调用队列。然后,服务实现将是一个骨架类,其存在仅用于将消息放入队列,而另一个进程将实现一个消息侦听器。对我来说,这个解决方案是次优的,因为我失去了不可知web服务的优雅,并且由于将实现与底层技术耦合,我失去了一些可伸缩性

我还考虑过使用RabbitMQ客户端库为AMQP编写一个CXF传输。这将需要更长的时间,但这将是我们公司今后可以继续使用的东西,并且可能会对CXF项目做出贡献。也就是说,我对这个想法并不狂热,因为编写、运行和测试代码需要花费大量的时间

以下是我的用于CXF的beans.xml:


jmsConfig
应用程序/json
申请/放弃

有什么简单的东西我遗漏了吗?或者有没有更好的方法来解决这个问题呢?

因此,我接受了同事的建议,不再使用JMS传输来实现web服务。相反,我们将在Spring集成上创建一个瘦web服务层。这应该允许我们获得所需的控制粒度,而不会不必要地公开消息传递层