2016-11-07 2 views
1

Here the pattern of consumer-producerПроизводитель потребительская модель в JAVA

Producer создает новое сообщение, consumer слушает их через Broker.

Пока producer создает и отправляет сообщение, а consumer ждет сообщения. Когда приходит новое сообщение, consumer выводит его на экран.

Я хочу, чтобы Producer был уведомлен о том, что Consumer получил сообщение и его освободил.

Интересно, есть ли способ уведомить/подать заявку Producer от Consumer? Или я должен сообщить Consumer через Broker? Как это можно сделать?

+2

Там нет простых да/нет ответа здесь. Вы сами это поняли, есть много вариантов для этого. – GhostCat

ответ

2

Стандарт JMS поддерживает очередь ответа (JMSReplyTo), так что исходный потребитель может вернуть ответное сообщение исходному производителю в конкретной очереди.

Как показано здесь;

http://www.enterpriseintegrationpatterns.com/patterns/messaging/RequestReplyJmsExample.html

enter image description here

Если вы также можете использовать JMSCorrelationID, то вы можете связать сообщения вместе, так что вы знаете ответ относится к конкретному запросу с идентификатором ххххх.

Это означает, что потребитель станет производителем для ответного сообщения.

ссылается также имеют код, чтобы показать рабочий пример (хотя я не пробовал сам)

+1

Хороший ответ, но очередь не должна быть JMS. Это может быть блокировка памяти в памяти. – duffymo

+0

Правда. Я сделал предположение, основанное на отсутствии деталей в вопросе. –

+1

Все еще тонкий, правильный ответ от вас. Показывает большое понимание проблемы. – duffymo

1

Я бы спросил, почему Продюсер должен знать.

Вся цель производителя/потребителя состоит в том, чтобы отделить два объекта. Производители не знают и не заботятся о том, кто обрабатывает сообщение.

Ваше предложение разбивает эту модель. Вы не должны этого делать, если у вас нет веской причины, кроме «Я хочу».

Если необходимо, дайте классу потребителя ссылку на производителя и выведите на него метод, который может использоваться для отправки сообщения. Или свяжите их в базе данных, указав, что потребитель пишет в таблицу, которую производитель может также запросить.

Но теперь эти два безнадежно запутались. Я думаю, что это плохой выбор.

+0

Вы можете добавить ссылку системы ACK в очередь. Просто знать, что сообщение обработано (но если больше нет сообщений, вы уже знаете ...), но не от кого. Это менее проблематично – AxelH

+0

Что делать, если это не очередь JMS? Возможно, это BlockingDeque в памяти. Еще плохая идея. – duffymo

+0

Согласен, с самого начала это плохая идея. Я бы не использовал этот дизайн, если мне нужно знать, обрабатывается ли сообщение в любое время. Я не говорил о JMS Queue специфически, любой набор Set мог сделать это на самом деле. Я думаю, как TCP-связь, но без прямого ответа на продюсера. Использование отдельной коллекции, которую Производитель может проверить ** при необходимости **. Но опять же, почему, когда, как, по многим вопросам, быть хорошей идеей;) – AxelH

0

Это больше похоже на Слушатель узора. Используйте 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()); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^