Как запустить фоновый процесс в Java EE - PullRequest
10 голосов
/ 26 июня 2009

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

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

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

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

Ответы [ 7 ]

14 голосов
/ 26 июня 2009

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

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

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

3 голосов
/ 26 июня 2009

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

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

1 голос
/ 26 июня 2009

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

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

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

1 голос
/ 26 июня 2009

см. Здесь для получения дополнительной информации: / stackoverflow.com вопросы / 533783 / почему-скандинавской-нити-в-j2ee-контейнер-это-обескуражен

Я без проблем создавал потоки в контейнере (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

1 голос
/ 26 июня 2009

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

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

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

1 голос
/ 26 июня 2009

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

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

0 голосов
/ 22 декабря 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...