Как запустить фоновый процесс в Java EE
Я хочу запустить фоновый процесс в среде Java EE (OC4J 10). Кажется неправильным просто начать поток с "нового потока", но я не могу найти хороший способ для этого.
использование очереди JMS сложно в моем частном случае, так как мои параметры для этого вызова метода не сериализуемы.
Я также думал об использовании onTimeout
метод таймера на сеансовом компоненте, но это не позволяет мне передавать параметры (насколько я знаю).
есть ли "canon" способ справиться с такой задачей, или мне просто нужно вернуться к" новому потоку " или java.concurrent.ThreadPool
.
7 ответов
Java EE обычно пытается удалить поток из проблем разработчиков. (Это успех в этом совершенно другая тема).
JMS явно является предпочтительным подходом для обработки этого.
с большинством параметров у вас есть возможность принудительной или фальсификации сериализации, даже если они не сериализуемы по умолчанию. В зависимости от данных рассмотрите возможность его упаковки в сериализуемый объект, который может перезагрузить данные. Это будет явно зависеть от параметра и приложение.
JMS-это способ Java EE сделать это. Вы можете запустить свои собственные потоки, если контейнер позволяет вам, но это нарушает спецификацию Java EE (вы можете или не можете заботиться об этом).
Если вы не заботитесь о Java EE generic compliance (если вы на самом деле прибегаете к потокам, а не имеете дело с JMS), контейнер Oracle наверняка будет иметь собственные способы сделать это (например,Oracleas Планировщик Заданий).
Не знаю OCJ4 подробно, но я использовал подход потока и java.утиль.Таймер подход для выполнения некоторых задач в приложении на основе Tomcat. В Java 5+ есть возможность использовать одну из служб исполнителя (Sheduled, Priority).
Я не знаю о onTimeout, но вы можете передавать параметры в самом сеансе, контексте приложения или в статической переменной (некоторые говорят, что это не рекомендуется). Но имя говорит мне, что он вызывается, когда сеанс пользователя истекает, и вы хочу немного прибраться.
использование JMS-правильный способ сделать это, но это более тяжелый вес.
преимущество, которое вы получаете, заключается в том, что если вам нужно несколько серверов, один сервер или что-то еще, как только серверы настроены, ваш "поток" теперь может быть распространен на несколько машин.
Это также означает, что вы не хотите, чтобы отправить сообщение для действительно нормальной работы или с огромным количеством данных. Выберите точки интерфейса хорошо.
см. здесь для получения дополнительной информации: stackoverflow.com/questions/533783/why-spawning-threads-in-j2ee-container-is-discouraged
Я создавал потоки в контейнере (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
Java EE на самом деле не запрещает вам создавать свои собственные потоки, это спецификация EJB, которая говорит, что "неуправляемые потоки" ARN не разрешены. Причина в том, что эти потоки неизвестны серверу приложений, и поэтому контейнер не может управлять такими вещами, как безопасность и транзакции в этих потоках.
тем не менее, есть много фреймворков, которые создают свои собственные потоки. Например кварц, ось и весна. Изменения вы уже используете один из них, так что это не так уж плохо создавать свои собственные темы, пока вы знаете о последствиях. Тем не менее, я согласен с другими, что использование JMS или JCA предпочтительнее создания ручных потоков.
кстати, OC4J позволяет создавать собственные потоки. Однако это не позволяет JNDI искать из этих неуправляемых потоков. Вы можете отключить это ограничение, указав -userThreads
Я пришел из .NET-фона,и JMS кажется мне довольно тяжелым. Вместо этого я рекомендую кварцевые, который является библиотекой фонового планирования для приложений Java и JEE. (Я использовал Quartz.NET в моей ASP.NET MVC приложение с большим успехом.)