在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
中使用正常执行程序是否可行?
所以在JEE6世界中,解决这个问题最好的方法是什么? 我的主要问题是我用@Produces创建一个bean,这可能是一个长时间运行的操作? – DarVar
它需要是同步的。即使在EE7中,@ @ Produces(CDI)方法也应该是同步的。 –
约翰是对的。为什么在Java EE 6及更低版本中执行线程是不可接受的,我将扩展一下。每当你开始你自己的线程时,服务器不再管理这个线程中的任何东西。你不会得到任何交易,容器服务,没有注入等。同样因为服务器没有管理它,所以不能保证当服务器关闭时所有的东西都会被清理掉,这至少会导致僵尸进程和内存泄漏,最糟糕的安全问题。这根本不是一个好主意。 – LightGuard