Развертывание нескольких копий MDB - PullRequest
1 голос
/ 22 марта 2012

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

У нас есть решение, в котором мы разворачиваем несколько версий этого MDB с селекторами для каждого типа. Хотя это работает, это означает, что нам нужно обновлять дескрипторы развертывания в нашем приложении каждый раз, когда мы внедряем новую версию, которая кажется подверженной ошибкам.

Мы рассмотрели возможность использования планов развертывания для решения этой проблемы, но, насколько я понимаю, возможно только изменить существующие MDB, но не добавлять новые.

Есть что-то, чего нам не хватает?

Мы используем weblogic 10.3

Ответы [ 2 ]

1 голос
/ 22 марта 2012

Вот один из способов справиться с этим. Поскольку вы эффективно обрабатываете сообщения определенного типа в однопоточном режиме, вы можете отказаться от своих MDB и вместо этого управлять пулом потоков, каждый из которых обрабатывает один тип. Вы можете реализовать одноэлементную службу, которая предоставляет интерфейс управления JMX (или удаленный интерфейс EJB), который позволяет динамически добавлять / удалять типы. когда эта служба получает вызов для добавления нового типа, она запускает новый поток, который просто зацикливается, выполняя обычный приемный вызов JMS (с соответствующим селектором). если ваша служба поддерживает карту типа -> поток, вы также можете реализовать логику для удаления типа (например, прерывание потока или иным образом информирование его о завершении).

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

0 голосов
/ 23 марта 2012

Просто идея: превратить вашу тему в очередь. Создайте «распределитель» MDB, для которого вы настраиваете один (1), который прослушивает эту очередь. Этот MDB принимает сообщения, поддерживает (динамическую, статическую) карту типа («xyz») для очереди («queue15») и повторно отправляет сообщение в соответствующую «рабочую очередь». Создайте N (фиксированные, N> количество типов) рабочих очередей, при этом один из ваших MDB прослушивает каждую очередь. Никаких специальных настроек не требуется, так как ваш MDB может обрабатывать любой тип.

Таким образом, вам не нужно заранее знать, какие типы сообщений существуют. Ваши рабочие MDB обнаружат, что они получают только сообщения одного типа и по порядку. Это масштабируется? Ну, есть только один «дистрибьютор», но он просто смотрит на тип и повторно отправляет. Это должно быть действительно быстро. Фактическая работа асинхронна на втором уровне.

Я думаю, что даже можно было бы динамически создавать «рабочие очереди» с MDB для их прослушивания (возможно, через API-интерфейсы для конкретных контейнеров?).

...