【问题标题】:Java EE 5, how to run external process on Singleton BeanJava EE 5,如何在 Singleton Bean 上运行外部进程
【发布时间】:2017-08-31 08:08:07
【问题描述】:

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

简单地说,bean在初始化过程中通过Runtime API启动进程,并提供与进程交互的接口,内部在IO通道上读写。该进程始终处于打开状态。

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

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

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

【问题讨论】:

  • 让我想想……如果进程以独立方式“物理”启动(例如:Windows 服务)并通过此 bean “逻辑”控制会怎样?
  • 应用程序必须控制进程并且生命周期必须与应用程序绑定
  • 另外,这里不能选择JNI,因为必须保证JVM的稳定性

标签: jakarta-ee process singleton weblogic


【解决方案1】:

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

【讨论】:

  • 很高兴听到我得出了同样的结论
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多