Синхронизация доступа к методу MDB между экземплярами - PullRequest
1 голос
/ 17 ноября 2010

У меня есть компонент, управляемый сообщениями, который получает сообщения аудита.Эти сообщения также содержат информацию о проверяемой системе.Когда сообщение получено, MDB может создать систему, если она не существует, или повторно использовать существующую систему.

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

Ответы [ 3 ]

1 голос
/ 21 ноября 2010

Убедитесь, что только один поток обрабатывает все сообщения.Это можно настроить в спецификации активации, пул соединений.

0 голосов
/ 20 сентября 2018

MessageDrivenBean можно синхронизировать через очередь Параметры пункта назначения . В моем случае MessageDriven аннотация выглядит так для обработки одного сообщения:

@MessageDriven(name = "ArchiveCounterStJmsListener", activationConfig = {
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
    @ActivationConfigProperty(propertyName = "destination", propertyValue = LINK_TO_QUEUE + "?consumer.dispatchAsync=false&consumer.prefetchSize=1"),
    @ActivationConfigProperty(propertyName = "maxSessions", propertyValue = "1")
})
0 голосов
/ 17 ноября 2010

Вы можете попробовать что-то вроде этого:

private Object LOCK;
public void onMessage() {
    code…
    synchronized(LOCK) {
        check if system exists, create if necessary
    }
    more code…
}
...