Есть много способов сделать это.
Во-первых, вы можете использовать таймер EJB для создания однократно запускаемого процесса, который запускается немедленно. Это хорошая техника для запуска процессов в фоновом режиме. Таймер EJB связан с конкретной реализацией сеансового компонента. Вы можете добавить таймер EJB к каждому сеансу Bean, который вы хотите сделать, или у вас может быть один сеансовый компонент, который затем может вызывать логику вашего приложения через некоторый механизм диспетчеризации.
Для меня я передаю сериализуемый большой двоичный объект параметров вместе с именем класса, который соответствует определенному интерфейсу, в общий сеансовый компонент, который затем выполняет класс. Таким образом, я могу легко создать фон для чего угодно.
Одно предостережение относительно таймера EJB заключается в том, что таймеры EJB являются постоянными. После создания таймера EJB он остается в контейнере до завершения или отмены его задания. Проблема в том, что если у вас есть длительный процесс, и сервер выходит из строя, при перезапуске процесс продолжится и восстановится. Помните, что это может быть хорошо, но только если ваш процесс готов к перезапуску. Но если у вас есть простой процесс, повторяющий «10 000 элементов», если сервер отключается на элементе 9 999, когда он возвращается, вы можете легко увидеть, что он просто начинается с элемента 1. Все это работоспособно, просто предостережение, чтобы знать из.
Другой способ сделать что-то в фоновом режиме - использовать очередь JMS. Поместите сообщение в очередь, и обработчик будет синхронизирован с остальной частью вашего приложения.
Важная часть здесь, и кое-что, что я также сделал, используя работу с Timer Bean, заключается в том, что вы можете контролировать, сколько «заданий» будет выполняться в зависимости от того, сколько экземпляров MDB вы настроите для системы.
Итак, для конкретной задачи по запуску процесса в нескольких параллельных порциях я беру задачу, разбиваю ее на «части», а затем отправляю каждую часть в очередь сообщений, где их выполняют MDB. Если я разрешаю 10 экземпляров MDB, у меня может одновременно выполняться 10 «частей» любой задачи.
Это действительно работает на удивление хорошо. Есть небольшие накладные расходы, связанные с разделением процесса и маршрутизацией его через очередь JMS, но это все в основном «время запуска». Как только это начнется, вы получите реальную выгоду.
Еще одним преимуществом использования очереди сообщений является то, что вы можете иметь ваши фактические длительные процессы, выполняющиеся на отдельном компьютере, или вы можете легко создать кластер машин для обработки этих процессов. Тем не менее, интерфейс такой же, и код не знает разницы.
Я обнаружил, что как только вы отодвинете долго выполняющийся процесс на задний план, вы можете заплатить цену менее мгновенного доступа к этому процессу. То есть нет причин непосредственно контролировать сами выполняемые классы, просто пусть они публикуют интересную информацию и статистику в базе данных или JMX, или что-то еще, вместо того, чтобы иметь что-то, что может контролировать объект напрямую, потому что он использует одно и то же пространство памяти.
Мне легко удалось настроить структуру, которая позволяет запускать задачи либо в таймере EJB, либо в очереди разброса MDB, задачи одинаковы, и я мог отслеживать их прогресс, останавливать их и т. Д.
Вы можете комбинировать технику разброса для создания нескольких заданий таймера EJB. Одним из бесплатных преимуществ MDB является то, что он действует как пул потоков, который может ограничивать ваши задания (чтобы вы не перегружали свою систему слишком большим количеством фоновых процессов). Вы получаете это «бесплатно», просто используя функции управления EJB в контейнере.
Наконец, в Java EE 6 есть новый «асинхронный» (или что-то в этом роде) квалификатор для методов Session Bean. Я не знаю подробностей о том, как это работает, так как я еще не играл с новым контейнером Java EE 6. Но я полагаю, что вы, вероятно, не захотите менять контейнеры только для этого объекта.
05.01.2010
WorkManager
специфичен для WebSphere, поэтому в целом не подходит: stackoverflow.com/questions/9026516/ 19.03.2012