Weblogic Server 11g上的自定义线程

giu*_*usy 3 java multithreading commonj weblogic11g

我的weblogic服务器上需要一个自定义的threda; 我不能使用TimerEJB或Delayed MDB,因为我必须使用3d库.

我知道不鼓励应用服务器上的自定义线程 ; 这里有一篇相关文章(4岁):为什么不鼓励在Java EE容器中产生线程?

它仍然气馁吗?我可以使用ExecutorServiceQuartz吗?或者我只考虑commonj和工人经理?

ven*_*iac 9

在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...");
    }
}
Run Code Online (Sandbox Code Playgroud)

**如果您不能使用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
Run Code Online (Sandbox Code Playgroud)

弹簧

例如,spring有一种简单的方法可以将自己的TaskExecutor附加到comonj worker manager:

<bean id="workManager" class="org.springframework.scheduling.commonj.WorkManagerTaskExecutor">
        <property name="workManagerName" value="java:comp/env/wm/default" />
    </bean>
Run Code Online (Sandbox Code Playgroud)

石英

Quartz适用于应用程序服务器,使用spring可以使用工作管理器

JAVA EE 7

JEE7引入了Batch(JSR 352).Java平台API(批处理)的批处理应用程序为批处理应用程序和用于调度和执行作业的运行时提供编程模型.

执行人服务

来自java规范:

Java EE 7平台的另一个新功能是Batch API,它为批处理应用程序提供编程模型,为调度和执行作业提供运行时,以及Concurrency Utilities API,它通过托管执行程序服务,托管预定执行程序提供异步功能. .

在JEE7中,Executor Service已经ManagedExecutorServiceManagedThreadFactory.

例:

   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());
Run Code Online (Sandbox Code Playgroud)

结论:Weblogic

请参阅http://www.oracle.com/technetwork/java/restrictions-142267.html