2013-10-01 3 views
1

В среде Java EE 5 у меня возникла проблема обеспечения наличия некоторых данных, написанных другой частью, прежде чем продолжить обработку моих собственных данных.Как правильно отложить обработку в контексте Java EE?

Исторически (время J2EE) это было сделано путем помещения объекта данных во внутреннюю очередь JMS после ожидания, например. 500 мс через Thread.sleep.

Но это не чувствует, что лучший способ справиться с этой проблемой, поэтому у меня есть 2 вопроса:

  1. Есть ли какие-либо проблемы с использованием метода сна в контексте Java EE?
  2. Какое разумное решение откладывает некоторую обработку в приложении Java EE 5?

Edit:

Я должен отметить, что моя обработка происходит при обработке объектов из очереди JMS через MDB.

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

ответ

1

Я согласен с @dkaustubh о таймерах и избегает манипулирования потоками в JavaEE.

Другая возможность заключается в использовании JMS-очереди с задержкой доставки. Хотя он не является частью API JavaEE, большинство поставщиков систем обмена сообщениями поддерживают его. check here.

+0

Это очень хороший совет: приложения работают в JBoss 5.1, поэтому [этот вопрос форума JBoss] (https://community.jboss.org/message/559414) нужно установить 'JMS_JBOSS_SCHEDULED_DELIVERY_PROP_NAME'. –

-1

Использование уведомлений и Object#wait()/Object#notifyAll() i.e. Многопоточность, производитель уведомляет потребителя.

+0

Вы уверены, что это можно безопасно сделать в рамках приложения Java EE? Моя обработка происходит из очереди JMS, поэтому я боюсь, что буду нарушать весь процесс, реализуя здесь свои собственные механизмы синхронизации. Кроме того, мне также нужен тайм-аут, если информация из первого источника недоступна. (Я добавил это к моему вопросу.) –

+0

Ну, wait() может тайм-аут (использовать Object # wait (long timeout)) ... Не уверен в синхронизации. В JRE также есть много вспомогательных классов, которые синхронизируются для вас. – AlexR

+0

Хорошо, но снова приложение работает в контейнере Java EE, поэтому я хотел бы знать, могу ли я вообще использовать эти механизмы? –

0

Я думаю, что это возможно с некоторым продвинутым методом Threading. Больше, чем думать о ручных синхронизациях и управлении потоками, вы всегда можете использовать пакет Java Concurrent.

Future может быть одним из способов сделать это. Обратитесь к пакету Java Concurrent.

2

Вы можете использовать функцию EJB TimerService. Следует избегать использования потоков в управляемой среде.