背景
我有一个标准的生产者消费者队列,消费者很慢而生产者很快。期望是每当生产者完成所请求的消息时它确认该消息,并且生产者将假定与该消息相关联的任务完成。由于生产者很快,我不希望线程生成等待,相反,只要确认消息,就应该调用回调。由于JMS在这方面受到限制,我已经尽可能直接使用了ActiveMQMessageProducer
之类的ActiveMQ类。
问题:
消息正在获得自动确认,即使消费者尚未启动,也会调用已注册的异步回调。
public void send(Destination destination,
Message message,
AsyncCallback onComplete)
生产者
public static boolean setup() {
Producer.connectionFactory = new
ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
// Create a Connection
Producer.connection =
(ActiveMQConnection)connectionFactory.createConnection();
connection.setAlwaysSessionAsync(true);
connection.start();
}
public Producer() {
session = (ActiveMQSession)connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
destination = (ActiveMQDestination)session.createQueue("TEST.FOO");
producer = (ActiveMQMessageProducer)session.createProducer(destination);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
}
...
public void run() {
long id = messageID.getAndIncrement();
String text = "Hello world!"
Message message = session.createTextMessage(text);
producer.send(message, new MessageCompletion(id, this.messageRundown));
}
消费
public static boolean setup() {
Consumer.connectionFactory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
Consumer.connection = (ActiveMQConnection)connectionFactory.createConnection();
connection.setAlwaysSessionAsync(true);
return true;
}
public Consumer() {
session = (ActiveMQSession)connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
destination = (ActiveMQDestination)session.createQueue("TEST.FOO");
consumer = (ActiveMQMessageConsumer)session.createConsumer(destination);
consumer.setMessageListener(this);
connection.start();
}
// implements MessageListener
@Override
public void onMessage(Message message) {
messageQueue.add(message);
}
public void run() {
while(true) {
Message message = messageQueue.poll();
while(message != null) {
// do some work
message.acknowledge();
message = messageQueue.poll();
}
Thread.sleep(10000);
}
}
虽然不需要消费者,但我已将其添加以供参考,已删除内容以确保简洁,这是工作代码的一部分。
答案 0 :(得分:1)
您对确认工作方式的理解是错误的。发件人的异步回调仅告诉您代理已收到该邮件。如果它是持久性发送,则回调将指示该消息也被写入磁盘。
JMS或大多数其他消息代理中没有生产者和消费者的耦合。生产者在队列上放置一条消息,然后消费者可以随时进入并从该队列中消费。两者之间没有耦合,生产者在继续生成下一条消息之前不能等待消费者。
如果您想知道何时处理特定消息以便您可以限制工作,那么您需要查看JMS Request / Response样式消息传递模式。