Пользовательская тема на Weblogic Server 11g
Мне нужен пользовательский threda на моем сервере weblogic; Я не могу использовать TimerEJB или Delayed MDB, поскольку мне нужно использовать 3d-библиотеку.
Я знаю, что пользовательские потоки на сервере приложений не приветствуются; вот соответствующий пост (4 года): Почему не рекомендуется создавать потоки в контейнере Java EE?
Это все еще не рекомендуется? Могу ли я использовать ExecutorService
или кварц? Или я должен рассмотреть только commonj и рабочий менеджер?
1 ответ
В Weblogic 11g (EJB3.0) рекомендуется создавать "собственного исполнителя потоков" (см. Также спецификацию Java EE и многопоточность), которые вы должны использовать:
- TimerService
пример:
MyEjb {
@Stateless
public class TimerBean implements TimerRemote {
@Resource
TimerService service;
@Override
public void startTimer() {
Timer timer = service.createTimer(1000, 1000, null);
System.out.println("Timers set");
}
@Timeout
public void handleTimeout(Timer timer) {
System.out.println("Handle timeout event here...");
}
}
** Если вы не можете использовать Deleyed MDB или TimerService, вам нужно работать с Work Manager **.
Weblogic и Websphere совместимы с CommonJ ( JSR 237 Timer & WorkManager); другими словами, они используют общий интерфейс для работы с менеджером работы; в weblogic рабочие менеджеры регулируют жизненный цикл потоков (Servlet, EJB, MDB,..., пользовательские потоки).
ИМХО не использовать ExecutorService
поскольку weblogic не находится под контролем: если вы остановите приложение (не сервер), то потоки, находящиеся под контролем weblogic, остановятся, остальные потоки не должны завершаться; Я испытал эту проблему.
Руководитель работ
Функция WorkManager в WebLogic Server по своей природе является динамической и основана на количестве входящих запросов, размер пула потоков автоматически изменяет размеры для максимизации пропускной способности. Для работы с WorkManager вы можете получить доступ через интерфейс commonj или MBean.
пример:
InitialContext ic = new InitialContext();
commonj.work.WorkManager wm = (WorkManager);
ic.lookup(‘java:comp/env/wm/default’); // default work manager
весна
Например, у Spring есть простой способ прикрепить свой собственный TaskExecutor к comonj worker manager:
<bean id="workManager" class="org.springframework.scheduling.commonj.WorkManagerTaskExecutor">
<property name="workManagerName" value="java:comp/env/wm/default" />
</bean>
кварцевый
Кварц работает на серверах приложений, а с весны они могут использовать менеджер работ
JAVA EE 7
JEE7 представляет пакет ( JSR 352). Пакетные приложения для Java Platform API (Batch) предоставляют модель программирования для пакетных приложений и среду выполнения для планирования и выполнения заданий.
Исполнитель Сервис
Из спецификации Java:
Также новым в платформе Java EE 7 является пакетный API, который предоставляет модель программирования для пакетных приложений и среду выполнения для планирования и выполнения заданий, а также API-интерфейс Concurrency Utilities, который предоставляет асинхронные возможности с помощью службы управляемого исполнителя, управляемого запланированного исполнителя,
В JEE7 Executor Service был расширен с ManagedExecutorService
а также ManagedThreadFactory
,
пример:
javax.naming.InitialContext ctx = new InitialContext();
ManagedExecutorService mes = (ManagedExecutorService)
ctx.lookup("java:comp/env/concurrent/ThreadPool");
// Create a set of tasks to perform the account retrieval.
ArrayList<Callable<MyObject>> retrieverTasks = new ArrayList<Callable<MyObject>>();
retrieverTasks.add(new MyCallable());
Заключение: Weblogic
См. http://www.oracle.com/technetwork/java/restrictions-142267.html