У меня есть 4 решения:
< ol>
[*]MessageReceiver.receive() (ждет бесконечно, текущая реализация. Но это не рекомендуемый способ получения сообщений от AMQ; на самом деле я вижу застрявшие сообщения в очереди. Но я могу свободно выдавать исключение приложения после линии get() и все тесты пройдены)
[*]Bean, управляемый сообщениями + некоторый локальный кеш: отправитель сообщения отправляет сообщение, затем вводит его цикл while(), проверяющий кэш-компонент, пришел ли ответ. Цикл может быть с Thread.sleep() или без него. Тем временем MDB получает сообщение и помещает ответ в кэш-компонент. Поэтому я использую этот кэш-компонент для синхронизации.
Он работает, и MDB — рекомендуемый способ получения сообщений в EJB, но я либо ввожу while() миллион раз в течение двух секунд ожидания (я вижу это запах кода), либо управляю потоком самостоятельно(
Код: Выделить всё
Thread.sleep()
- решение 1), но с @Asynchronous как https ://docs.oracle.com/javaee/6/tutorial/doc/gkkqg.html. Я вижу это похоже на 1), потому что Future.get() будет блокироваться на неопределенный срок, а получение сообщений без MDB не рекомендуется, но я сам не управляю потоком. Я тоже могу свободно кинуть.
- @Timeout и TimerService. Плохо то, что он используется для задач приложений (предназначен для задач cron с точностью не более нескольких секунд, а не для задач, выполняемых на миллисекунды позже). Но ожидание даже 1 секунды — это слишком долго для нашего соглашения об уровне обслуживания. Кроме того, я не могу выдать исключение приложения.
Что мне делать?
Подробнее здесь: https://stackoverflow.com/questions/792 ... y-from-jms