2017-08-31 41 views
1

我必须从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中如何实现?

+0

让我想想....如果过程是以独立的方式(例如:windows服务)以“逻辑”的方式通过这个bean进行“物理”启动,那该怎么办? –

+0

应用程序必须控制进程和生命周期必须绑定到应用程序 –

+0

此外,JNI不是一个选项,因为JVM的稳定性必须得到保证 –

回答

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的一部分,因此您应该可以使用它。

+0

好听的我结束了得出同样的结论 –

1

要模拟一个没有@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> 
+0

这可能工作,但似乎太易变 –