Java EE 5,如何 运行 Singleton Bean 上的外部进程

Java EE 5, how to run external process on Singleton Bean

我必须从 Java EE 5 应用程序启动一个长 运行 外部进程,并将此进程抽象到其他 bean 作为有状态托管 bean。进程的生命周期必须与 Java EE 应用程序的生命周期相关联。

简单地说,bean 在初始化期间通过 Runtime API 启动进程,并提供与进程交互的接口,在 IO 通道上进行内部写入和读取。进程一直开启。

必须确保容器只实例化单个实例,并且总是注入这个特定实例。只要应用程序 运行,该实例就必须存在。该实例应在部署期间初始化,并在取消部署或服务器关闭期间处置。因此,生命周期挂钩必须可用于在这些阶段打开和关闭流程。

这个 bean 是捆绑在 EAR 中,还是部署为不同的库模块都没有关系,只要它在应用程序中可用并满足要求即可。

我知道 @Singleton@ApplicationScoped 等注释,但这些是 Java EE 6 注释。这在 Java EE 5 中怎么可能?

要在没有 @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>

我认为你最好的选择是系在 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 的一部分,因此您应该可以使用它。