2014-02-06 3 views
1

Мы реализовали MDB, которые выполняют входной и параллельный вход пользователя. У нас есть лимитная проверка на пользовательские данные (например, количество номеров телефонов, которые могут быть у пользователя).Java - MDB - Как избежать проблемы параллелизма

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

Есть ли способ исправить? делая данные одного пользователя, выбранные одним и тем же потоком, прекрасны. Но я не знаю, как это сделать.

Пожалуйста, помогите. Заранее спасибо.

Редактировать: Еще одна вещь, которую я пропустил передать. Эта проблема возникает при запуске в разных узлах.

+0

У вас проблема параллелизма, а не параллельная проблема. Вам нужно каким-то образом контролировать, кто что получает, когда. Без более подробной информации я больше ничего не могу добавить. – edharned

+0

@edharned Спасибо, я обновил вопрос соответственно – Vaandu

+0

Посмотрите на этот шаблон: http://www.eaipatterns.com/CompetingConsumers.html. Подумайте, что произойдет, если пространство пользователей будет разделено между серверами. Например, один сервер обрабатывает пользователей, чья учетная запись начинается 0-5, другая - 6-9. Теперь у вас есть SPOF, но это может быть устранено с помощью механизма аренды, где каждая аренда представляет диапазон, а серверы захватывают лизинг по мере их запуска. –

ответ

0

Это зависит от сервера приложений, количество узлов и приложения, но follwing сценариев нормально для меня:

  • Weblogic или JBOSS поддержка Единица заказа функции:

Message Unit-of-Order - это функция с добавленной стоимостью в WebLogic Server, которую позволяет создавать автономный поставщик сообщений или группу продюсеров, действующих , как один, группировать сообщения в si по отношению к порядку обработки . Этот единый блок называется Единицей заказа, а требует, чтобы все сообщения с этого устройства обрабатывались последовательно в порядке их создания.

  • Если обновить ту же запись первого поток получить блокировку и второй поток ждать фиксации транзакции, то второй поток должен проверить обновление (оптимистичный замка) и он может выйти немедленно.

например.

Thread 1: lastUpd = now() 
Thread 1: UPDATE MYTABLE SET LAST_UPDATE=${lastUpd} WHERE ID=${id} 
Thread 2: lastUpd = now() 
Thread 2: UPDATE MYTABLE SET LAST_UPDATE=${lastUpd} WHERE ID=${id} //remain locked 
Thread 1: a lot of work ... 
Thread 1 COMMIT 
Thread 2: a lot of work ... 
Thread 2: lastUpd2= SELECT LAST_UPDATE MYTABLE WHERE ID=${id} 
Thread 2: IF lastUpd2!= lastUpd ROLLBACK 
+0

Я не знаю, как реализовать функцию Единицы заказа. Не могли бы вы дать некоторые ссылки или информацию? Спасибо. – Vaandu

+0

Вам не нужно ничего реализовывать, просто настройте weblogic и поместите uuid в заголовок сообщения: http: //docs.oracle.com/cd/E15051_01/wls/docs103/jms/uoo.html – venergiac

+0

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

Смежные вопросы