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