Java EE 5,如何在Singleton Bean上运行外部进程
我必须从Java EE 5应用程序启动一个长时间运行的外部进程,并将此进程抽象为其他bean作为有状态的管理bean。流程的生命周期必须与Java EE应用程序的生命周期相关联。Java EE 5,如何在Singleton Bean上运行外部进程
简而言之,bean在初始化期间通过Runtime
API启动进程,并提供与进程交互,内部写入和读取IO通道的接口。这个过程始终开放。
必须确保容器仅实例化单个实例,并始终注入此特定实例。只要应用程序正在运行,实例就必须存在。实例应在部署期间初始化,并在取消部署或服务器关闭期间处理。因此,生命周期挂钩必须可用于在这些阶段打开和关闭流程。
如果这个bean捆绑在EAR中,或者作为独立的库模块部署,只要它在应用程序中可用并满足要求即可。
我知道有关注释@Singleton
和@ApplicationScoped
,但这些是Java EE 6注释。这在Java EE 5中如何实现?
我认为最好的办法是绑到ServletContextListener。
的代码会是这样的:
package tld.yourcompany.your.java.package;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class ProcessManagerContextListener implements ServletContextListener{
@Override
public void contextDestroyed(ServletContextEvent event) {
// shut down the process
}
@Override
public void contextInitialized(ServletContextEvent event) {
// start up your process
}
}
然后,因为你是在史前时代的环境的时候,你就需要修改web.xml有:
<web-app ...>
<listener>
<listener-class>
tld.yourcompany.your.java.package.ProcessManagerContextListener
</listener-class>
</listener>
</web-app>
ServletContextListener是EE 1.3的一部分,因此您应该可以使用它。
好听的我结束了得出同样的结论 –
要模拟一个没有@Singleton
的单例,你只需要确保你有一个一个有状态bean。 With Weblogic:
<weblogic-enterprise-bean>
<ejb-name>YourEJB</ejb-name>
<entity-descriptor>
<entity-cache>
<max-beans-in-cache>1</max-beans-in-cache>
</entity-cache>
</entity-descriptor>
</weblogic-enterprise-bean>
这可能工作,但似乎太易变 –
让我想想....如果过程是以独立的方式(例如:windows服务)以“逻辑”的方式通过这个bean进行“物理”启动,那该怎么办? –
应用程序必须控制进程和生命周期必须绑定到应用程序 –
此外,JNI不是一个选项,因为JVM的稳定性必须得到保证 –