我的 weblogic 服务器上需要一个自定义 threda;我不能使用 TimerEJB 或 Delayed MDB,因为我必须使用 3d 库。
我知道不鼓励应用服务器上的自定义线程;这里有一篇相关文章(4 岁):为什么不鼓励在 Java EE 容器中生成线程?
是不是还是灰心丧气?我可以使用ExecutorService
Quartz 吗?或者我必须只考虑 commonj 和工人经理?
我的 weblogic 服务器上需要一个自定义 threda;我不能使用 TimerEJB 或 Delayed MDB,因为我必须使用 3d 库。
我知道不鼓励应用服务器上的自定义线程;这里有一篇相关文章(4 岁):为什么不鼓励在 Java EE 容器中生成线程?
是不是还是灰心丧气?我可以使用ExecutorService
Quartz 吗?或者我必须只考虑 commonj 和工人经理?
在 Weblogic 11g (EJB3.0) 上不鼓励创建“自己的线程执行器”(另请参阅Java EE 规范和多线程),您应该使用:
例子:
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 控制下的线程将停止,其他线程不应终止;我遇到了这个问题。
WebLogic Server 中的 WorkManager 功能本质上是动态的,基于传入请求的数量,线程池大小会自动重新调整大小以最大化吞吐量。要使用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>
Quartz 在应用程序服务器上工作,使用 spring 他们可以使用工作管理器
JEE7 引入了批处理( JSR 352 )。Java 平台 API (Batch) 的批处理应用程序为批处理应用程序提供了一个编程模型,并为调度和执行作业提供了一个运行时。
执行服务
从java规范:
Java EE 7 平台中的另一个新功能是 Batch API,它为批处理应用程序提供编程模型以及用于调度和执行作业的运行时,以及 Concurrency Utilities API,它通过托管执行器服务、托管调度执行器提供异步功能.
在 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());
请参阅http://www.oracle.com/technetwork/java/restrictions-142267.html