Как запустить фоновый процесс в Java EE

Я хочу запустить фоновый процесс в среде Java EE (OC4J 10). Кажется неправильным просто начать Thread с "новой темой". Но я не могу найти хороший способ для этого.

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

Я также подумал об использовании метода onTimeout Timer в сеансе bean, но это не позволяет мне передавать параметры (насколько мне известно).

Есть ли какой-либо "канонический" способ обработки такой задачи, или мне просто нужно вернуться к "новой теме" или java.concurrent.ThreadPool.

Ответ 1

Java EE обычно пытается удалить потоки от проблем разработчиков. (Успех в этом - совершенно другая тема).

JMS - это, безусловно, предпочтительный подход для решения этой проблемы.

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

Ответ 2

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

Если вам не нравится стандартное соответствие Java EE (если вы на самом деле прибегаете к потокам, а не занимаетесь JMS), у контейнера Oracle наверняка будут свои собственные способы сделать это (например, Планировщик заданий OracleAS).

Ответ 3

Не знаю OCJ4 подробно, но я использовал подход Thread и подход java.util.Timer для выполнения некоторой задачи в приложении на основе Tomcat. В Java 5+ есть возможность использовать одну из служб Executor (Sheduled, Priority).

Я не знаю о onTimeout, но вы можете передавать параметры в самом сеансе, в контексте приложения или в статической переменной (не рекомендуется, говорят некоторые). Но имя говорит мне, что оно вызывается, когда пользовательский сеанс отключается, и вы хотите сделать некоторую очистку.

Ответ 4

Использование JMS - правильный способ сделать это, но это более тяжелый вес.

Преимущество, которое вы получаете, состоит в том, что если вам нужно несколько серверов, один сервер или что-то еще, как только сервер настроен, ваша "Threading" теперь может быть распределена на несколько машин.

Это также означает, что вы не хотите отправлять сообщение для действительно тривиального объема работы или с огромным количеством данных. Хорошо используйте свои интерфейсные точки.

Ответ 5

см. здесь дополнительную информацию: fooobar.com/questions/22075/...

Я создавал потоки в контейнере (Tomcat, JBoss) без проблем, но они были действительно простыми очередями, и я не полагаюсь на кластеризацию.

Однако EJB 3.1 представит асинхронный вызов, который может оказаться полезным: http://www.theserverside.com/tt/articles/article.tss?track=NL-461&ad=700869&l=EJB3-1Maturity&asrc=EM_NLN_6665442&uid=2882457

Ответ 6

Java EE на самом деле не запрещает вам создавать свои собственные потоки, поэтому спецификация EJB, в которой говорится о "неуправляемых потоках", не разрешена. Причина в том, что эти потоки неизвестны серверу приложений, и поэтому контейнер не может управлять такими вещами, как безопасность и транзакции в этих потоках.

Тем не менее, существует множество инфраструктур, которые создают собственные потоки. Например, Quartz, Axis и Spring. Изменения уже используют один из них, поэтому не так уж плохо создавать свои собственные потоки, если вы знаете о последствиях. Тем не менее я согласен с другими в том, что использование JMS или JCA предпочтительнее создания ручного потока.

Кстати, OC4J позволяет создавать свои собственные потоки. Однако он не позволяет искать JNDI из этих неуправляемых потоков. Вы можете отключить это ограничение, указав аргумент -userThreads.

Ответ 7

Я родом из .NET-фона, и JMS кажется мне очень тяжелым. Вместо этого я рекомендую Quartz, который является библиотекой планирования фона для приложений Java и JEE. (Я использовал Quartz.NET в моем приложении ASP.NET MVC с большим успехом.)