Java: синхронизация потоков на нескольких серверах - PullRequest
5 голосов
/ 04 апреля 2009

У меня проблема с синхронизацией обработки для нескольких потоков на нескольких разных серверах для службы Java в Windows.

В этом приложении несколько потоков пользователей извлекают сообщения из одной и той же очереди JMS. Сообщения приходят группами по 3 или 4, и мне нужно убедиться, что сообщения в каждой группе обрабатываются полностью последовательно. Мне нужен какой-то механизм синхронизации, чтобы удостовериться, что если thread1 извлекает сообщение, затем thread2 извлекает следующее сообщение из этой группы, thread2 ждет, пока thread1 завершит обработку, прежде чем начинать обрабатывать свое сообщение.

Есть предложения по распределенным механизмам синхронизации для потоков? Подойдет любой тип решения (решения JMS, распределенное кэширование и т. Д.)

Примечание. Используемый нами JMS-провайдер - ActiveMQ.

Ответы [ 3 ]

7 голосов
/ 05 апреля 2009

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

java.util.concurrent.locks.Lock lock = Hazelcast.getLock ("mymonitor");
lock.lock ();
try {
// do your stuff
}finally {
   lock.unlock();
}

С уважением,

-talip

Hazelcast - Распределенная очередь с открытым исходным кодом, Карта, Набор, Список, Блокировка

7 голосов
/ 04 апреля 2009

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

1 голос
/ 04 апреля 2009

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

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

...