Как заставить мой MDB игнорировать сообщения, приходящие от себя? - PullRequest
3 голосов
/ 21 февраля 2010

У меня есть несколько клиентов, которые являются как потребителями, так и подписчиками одной темы в брокере сообщений ActiveMQ. Все клиенты используют один и тот же код, фактически они используют точно одно и то же корпоративное приложение, состоящее из: (1) EJB, создающего сообщение, и (2) MDB, потребляющего сообщение.

Проблема в основном в том, что если у меня есть клиенты A, B и C, и если A отправляет сообщение, то A, B, C все получат сообщение. Я не хочу, чтобы А. получал собственное сообщение.

Так что я поиграл с различными решениями, лучшее из которых я придумал, это установить строковое свойство в исходящем сообщении, например, источник = myVeryOwnID . Затем в MDB я установил селектор сообщений, например source <> 'myVeryOwnID' .

К сожалению, это плохое решение, потому что мне нужно было бы установить этот идентификатор в исходном коде (в моем случае, в аннотациях). Это означает, что при развертывании нового клиента я не могу просто передать кому-то файл .EAR, вместо этого мне нужно специально перекомпилировать с уникальным свойством «source».

В идеале я хотел бы использовать MAC-адрес в качестве идентификатора или, возможно, идентификатор, установленный в Glassfish (я использую GFv3).

Любые решения или идеи будут высоко оценены!

Ответы [ 3 ]

2 голосов
/ 22 февраля 2010

ИМХО способ использовать атрибут сообщения «источник» в сообщении и селектор сообщений. Теперь, если вы не хотите жестко кодировать это в MDB (в аннотациях), используйте дескриптор развертывания и установите селектор сообщений во время упаковки.

1 голос
/ 03 марта 2010

ActiveMQ содержит аргумент метода для решения именно этой ситуации. И метод ActiveMQSession.createConsumer(), и метод ActiveMQSession. createDurableSubscriber() предоставляют вариант, который принимает аргумент с именем noLocal. Установите для аргумента noLocal значение true, чтобы избежать получения сообщений, которые были опубликованы локально по тому же соединению.

Брюс

0 голосов
/ 28 февраля 2010

А как насчет простой старой опции System.GetProperty () и -D? Вы можете установить уникальный идентификатор приложения в качестве системного свойства:

-Dmyapp.id=A

Например, в Tomcat вы можете передать системное свойство через переменную JAVA_OPTS:

export JAVA_OPTS='-Dmyapp.id=A'

Тогда вы можете прочитать это в приложении:

String appId = System.getProperty("myapp.id")

Все, что вам нужно сделать, это установить системную переменную для каждого сервера вашего приложения.

...