据我所知,ActiveMQ有一个名为AUTO Acknowledge的功能,它实际上通知代理已收到消息(不确认生产者)。
我想知道是否可以在ActiveMQ或RabbitMQ中向消费者发送确认。然后我想在生产者处理确认消息,如果它不会收到确认,然后再将消息发送给消费者。
答案 0 :(得分:0)
您希望在异步介质上执行同步用例。
在RabbitMQ的情况下,您可以使用RPC,如此处所述 - https://www.rabbitmq.com/tutorials/tutorial-six-python.html 和 https://www.rabbitmq.com/direct-reply-to.html
请注意,即使是作者也建议避免使用它:
如有疑问,请避免使用RPC。如果可以,您应该使用异步管道 - 而不是类似RPC的阻塞,将结果异步推送到下一个计算阶段。
RabbitMQ Java客户端通过com.rabbitmq.client.Channel.basicConsume
提供自动缓存。
答案 1 :(得分:0)
至少对于ActiveMQ - 这是内置的。你必须在activemq.xml中打开它
<policyEntry queue=">" advisoryForConsumed="true"/>
只需听取您要监控消费消息的队列的顾问主题。然后你可以提取消息id:s以及什么不“勾选”未完成的请求。
对于完整的端到端确认,我建议更多自定义。即您的producer-app应该侦听一些“响应”队列,该队列接收有关生成的消息状态的响应。即如果处理失败 - 你可能想知道为什么等......
无论如何,这里有一些生产者的代码,它也会监听来自ActiveMQ的确认。
public void run() throws Exception {
ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory("tcp://localhost:61616");
conn = cf.createConnection();
sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination dest = sess.createQueue("duck");
MessageConsumer mc = sess.createConsumer(AdvisorySupport.getMessageConsumedAdvisoryTopic(dest));
mc.setMessageListener(this);
conn.start();
MessageProducer mp = sess.createProducer(sess.createQueue("duck"));
mp.send(sess.createTextMessage("quack"));
}
public void onMessage(Message msg) {
try {
String msgId = msg.getStringProperty("orignalMessageId");
System.out.println("Msg: " + msgId + " consumed");
} catch ( Exception e) {
e.printStackTrace();
}
}