Here the pattern of consumer-producer
Producer
创建新邮件,consumer
通过Broker
收听。
到目前为止,producer
在consumer
等待消息时创建并发送消息。当新消息到来时consumer
将其打印到屏幕上。
我希望Producer
被告知Consumer
已收到该消息并将其出列。
我想知道有没有办法从Producer
通知/ feedack Consumer
?或者我应该通过Consumer
通知Broker
?怎么办?
答案 0 :(得分:2)
JMS标准支持回复队列(JMSReplyTo),以便原始使用者可以将回复消息返回给特定队列上的原始生产者。
如此处所示;
http://www.enterpriseintegrationpatterns.com/patterns/messaging/RequestReplyJmsExample.html
如果您还使用JMSCorrelationID,则可以将消息链接在一起,以便您知道答复与id为xxxxx的特定请求相关。
对于coruse而言,这意味着消费者将成为回复消息的制作者。
提供的链接还有代码显示一个工作示例(虽然我自己没有尝试过)
答案 1 :(得分:1)
我会问为什么制片人需要知道。
生产者/消费者的整个目的是解耦两个对象。生产者不知道或关心谁处理消息。
您的提案违反了该模式。你不应该这样做,除非你有一个非常好的理由,除了“我想要。”
如果必须,请为使用者类提供对生产者的引用,并在其上公开可用于发送消息的方法。或者通过让消费者写入生产者也可以查询的表来将它们耦合到数据库中。
但现在这两个人已经无可救药地纠缠在了一起。我认为这是一个糟糕的选择。
答案 2 :(得分:0)
它更像是 Listener 模式。使用EventBus
。 2个活动:public PutEvent(MyType message) {...}
,public TakeEvent(long id) {...}
。然后:
EventBus bus = new SimpleEventBus();
bus.addHandler(producerInstance::onMessageTaken, GetEvent.getType());
bus.addHandler(consumerInstance::onMessageArrived, PutEvent.getType());
消费者:
MyType message = queue.pop();
bus.fireEventFromSource(new TakeEvent(message.getId()), this);
...
@Override public void onMessageArrived(PutEvent event) {
// We know, that there're messages out there and can later pop it
System.out.printf("%d from %s", event.getMessage().getId(), event.getSource() != null ? event.getSource().hashCode() + "" : "unknown");
}
制片:
MyType message = new MyType(data, ++id);
queue.add(message);
bus.fireEventFromSource(new PutEvent(message), this);
...
@Override public void onMessageTaken(TakeEvent event) {
// Wow, who took it?
System.out.printf("%s took %d", event.getSource() != null ? event.getSource().hashCode() + "" : "unknown", event.getId());
}