Jakarta ee JavaEE5,如何在单例Bean上运行外部进程
我必须从JavaEE5应用程序启动一个长时间运行的外部进程,并将该进程抽象为有状态的托管bean。进程的生命周期必须与JavaEE应用程序的生命周期相关联 简单地说,bean在初始化过程中通过Jakarta ee JavaEE5,如何在单例Bean上运行外部进程,jakarta-ee,process,singleton,weblogic,Jakarta Ee,Process,Singleton,Weblogic,我必须从JavaEE5应用程序启动一个长时间运行的外部进程,并将该进程抽象为有状态的托管bean。进程的生命周期必须与JavaEE应用程序的生命周期相关联 简单地说,bean在初始化过程中通过RuntimeAPI启动进程,并提供与进程交互的接口,在IO通道上进行内部写入和读取。这个过程一直是开放的 必须确保容器只实例化单个实例,并始终注入此特定实例。只要应用程序正在运行,实例就必须存在。实例应在部署期间初始化,并在取消部署或服务器关闭期间释放。因此,在这些阶段中,生命周期挂钩必须可用以打开和关闭
Runtime
API启动进程,并提供与进程交互的接口,在IO通道上进行内部写入和读取。这个过程一直是开放的
必须确保容器只实例化单个实例,并始终注入此特定实例。只要应用程序正在运行,实例就必须存在。实例应在部署期间初始化,并在取消部署或服务器关闭期间释放。因此,在这些阶段中,生命周期挂钩必须可用以打开和关闭流程
只要该bean在应用程序中可用并满足要求,它是捆绑在EAR中,还是作为独特的库模块部署都无关紧要
我知道一些注释,比如
@Singleton
和@ApplicationScoped
,但这些都是JavaEE6注释。在Java EE 5中,这怎么可能呢?要模拟没有@singleton
的单例,只需确保只有一个有状态bean:
YourEJB
1.
我认为您最好的选择是与客户保持联系
代码类似于:
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>
tld.yourcompany.your.java.package.ProcessManagerContextListener
ServletContextListener是EE 1.3的一部分,因此您可以使用它。让我想想。。。。如果进程以独立的方式“物理”启动(例如:windows服务),并通过该bean“逻辑”控制,该怎么办?应用程序必须对进程具有控制权,并且生命周期必须与应用程序绑定。因此,JNI在这里不是一个选项,因为必须保证JVM的稳定性,才能听到我得出相同的结论
<web-app ...>
<listener>
<listener-class>
tld.yourcompany.your.java.package.ProcessManagerContextListener
</listener-class>
</listener>
</web-app>