Производитель-потребитель в Java - несколько потребителей

У меня есть модель производитель-потребитель на Java с несколькими потребителями. Я передаю объект между производителями и потребителями, у которого есть переменная, назовем ее «имя».

Теперь это имя может быть A, B или C. Если значение равно A, один потребитель снимет его из очереди и что-то с ним сделает. Если значение равно B, другой потребитель извлечет его из той же очереди и сделает что-нибудь еще. Если значение равно C, то же самое делает третий потребитель.

У меня вопрос, как это реализовать. Моя текущая теория следующая (в псевдокоде):

// This is code for each consumer
pull item off the queue
check if item.name is right for this consumer (A, B, or C)
if so, send it to consume()
else, put it back on the queue

Будет ли что-то подобное работать, или это нанесет ущерб моей синхронизации потоков? Если это не сработает, какую модель мне следует использовать для этого?


person aquemini    schedule 25.02.2013    source источник
comment
Я не вижу здесь причин для нескольких потребителей. Поскольку это всего три случая, почему бы не привлечь к ним одного обычного потребителя?   -  person Sebastian    schedule 25.02.2013
comment
Похоже, вам действительно нужны компоненты и темы, управляемые сообщениями.   -  person duffymo    schedule 25.02.2013
comment
Вы все пишете с нуля? Как насчет использования JMS API?   -  person gerrytan    schedule 25.02.2013
comment
@Sebastian Назначение требует нескольких потребителей.   -  person aquemini    schedule 25.02.2013
comment
@duffymo Не могли бы вы немного рассказать о них?   -  person aquemini    schedule 25.02.2013
comment
@gerrytan Большая часть кода у меня уже написана, но я не могу понять, как различать потребителей.   -  person aquemini    schedule 25.02.2013
comment
JMS, темы, очереди, публикация / подписка - это гораздо больше, чем просто SO-ответ. Лучше проведите небольшое исследование и вернитесь.   -  person duffymo    schedule 25.02.2013
comment
Предполагая, что все типы потребителей реализуют интерфейс Consumer, добавьте метод getName(), чтобы вы могли различать их. Другой подход: вы используете instanceof для сравнения экземпляра среды выполнения каждого подкласса Consumer.   -  person gerrytan    schedule 25.02.2013
comment
вы можете просто позволить каждому потребителю заглянуть в очередь или свернуть en.wikipedia.org/ wiki / Образец цепочки ответственности   -  person Ray Tayek    schedule 25.02.2013


Ответы (1)


Самый простой способ - определить заголовки сообщения при публикации сообщения. Тогда у вас может быть несколько потребителей, каждый с уникальными селекторами сообщений, которые ищут конкретный заголовок сообщения. Таким образом, только правильный потребитель получает сообщение, и вам не нужно беспокоиться о повторной публикации сообщения, если неправильный потребитель получит сообщение (что очень неэффективно и было бы нехорошо в загруженной системе с большим количеством сообщений, работающих на их пути. через систему).

http://docs.oracle.com/javaee/1.3/jms/tutorial/1_3_1-fcs/doc/prog_model.html

person EdH    schedule 25.02.2013