2013-10-09 42 views
2

JEE6可以在CDI@Singleton豆中使用线程@Produces连接到外部第三方服务。在CDI Singleton bean中使用线程

我有一个JEE6战争正是这样做的:

import javax.ejb.Singleton; 
import javax.ejb.Startup; 
import javax.enterprise.inject.Produces; 
import javax.inject.Inject; 


@Singleton 
@Startup 
public class MyBean { 

    @Produces 
    public SomeService getSomeService() { 

     /** Retry a number of times to connect to some service **/ 
     SomeService someService = retry("127.0.0.1"); 

     return someService; 
    } 
} 

重试方法尝试的次数,以连接到服务。它使用Executors.newSingleThreadScheduledExecutor()每x秒重新尝试连接。

我相信在JEE7他们已经为这种事情添加了一个Managed Executor。但在JEE6中使用正常执行程序是否可行?

回答

1

在Java EE 6中,在EJB内启动线程是不可接受的。在Java EE 7中,他们已经放松了一些。

+0

所以在JEE6世界中,解决这个问题最好的方法是什么? 我的主要问题是我用@Produces创建一个bean,这可能是一个长时间运行的操作? – DarVar

+0

它需要是同步的。即使在EE7中,@ @ Produces(CDI)方法也应该是同步的。 –

+0

约翰是对的。为什么在Java EE 6及更低版本中执行线程是不可接受的,我将扩展一下。每当你开始你自己的线程时,服务器不再管理这个线程中的任何东西。你不会得到任何交易,容器服务,没有注入等。同样因为服务器没有管理它,所以不能保证当服务器关闭时所有的东西都会被清理掉,这至少会导致僵尸进程和内存泄漏,最糟糕的安全问题。这根本不是一个好主意。 – LightGuard