我用c#和activemq编码,使用NMS和apache-activemq-5.9.1。我希望在发送每条消息时在自定义属性中设置一个唯一的guid,然后我可以删除特定的消息guid(不清除队列,只删除其中的一条消息)。我在Can I delete a message from a queue of ActiveMQ in c# code?中找到了类似的问题,但它没有答案,所以我再问一次。
答案 0 :(得分:2)
在这方面,您只能使用NMS API做两件事。第一种是删除整个目的地,如referenced问题所示。
第二种方法是使用分配了选择器的消费者,该消费者只匹配您要丢弃的消息。消费者将接收并确认将其从代理中移除的消息。仅当队列深度不是很大以至于消息存储在消息存储中并且由于ActiveMQ中的maxPageSize设置不够大而不会被分页时,这种方法才有效。
唯一的另一个解决方案是使用Jolokia提供的REST API来访问ActiveMQ MBean,并尝试以这种方式删除消息,但是仍然可能遇到离线存储中的消息问题而无法成为寻求删除。
这里的根本问题是您正在尝试将ActiveMQ用作数据库,而它(或任何其他JMS代理)并不打算这样做。这是一种经常出现的反模式。如果您想以DB方式访问消息,那么使用数据库,您将节省大量的时间和精力。