Jakarta ee JavaEE5,如何在单例Bean上运行外部进程

Jakarta ee JavaEE5,如何在单例Bean上运行外部进程,jakarta-ee,process,singleton,weblogic,Jakarta Ee,Process,Singleton,Weblogic,我必须从JavaEE5应用程序启动一个长时间运行的外部进程,并将该进程抽象为有状态的托管bean。进程的生命周期必须与JavaEE应用程序的生命周期相关联 简单地说,bean在初始化过程中通过RuntimeAPI启动进程,并提供与进程交互的接口,在IO通道上进行内部写入和读取。这个过程一直是开放的 必须确保容器只实例化单个实例,并始终注入此特定实例。只要应用程序正在运行,实例就必须存在。实例应在部署期间初始化,并在取消部署或服务器关闭期间释放。因此,在这些阶段中,生命周期挂钩必须可用以打开和关闭

我必须从JavaEE5应用程序启动一个长时间运行的外部进程,并将该进程抽象为有状态的托管bean。进程的生命周期必须与JavaEE应用程序的生命周期相关联

简单地说,bean在初始化过程中通过
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>