我有一个Java程序/线程,我想将其部署到应用服务器(GlassFish)中。该线程应作为“服务”运行,在应用服务器启动时启动,在应用服务器关闭时停止。
我应该如何做?它并不是一个Session Bean或MDB,只是一个线程。
我有一个Java程序/线程,我想将其部署到应用服务器(GlassFish)中。该线程应作为“服务”运行,在应用服务器启动时启动,在应用服务器关闭时停止。
我应该如何做?它并不是一个Session Bean或MDB,只是一个线程。
我只在Tomcat中做过这个,但是在Glassfish中也应该可以工作。
创建一个实现javax.servlet.ServletContextListener
的监听器类,然后将其放入web.xml文件中。当您的Web应用程序启动和销毁时,它将被通知。
一个简单的监听器类:
public class Listener implements javax.servlet.ServletContextListener {
MyThread myThread;
public void contextInitialized(ServletContextEvent sce) {
myThread = new MyThread();
myThread.start();
}
public void contextDestroyed(ServletContextEvent sce) {
if (myThread != null) {
myThread.setStop(true);
myThread.interrupt();
}
}
}
这段代码需要放在web.xml中,放在最后一个 'context-param' 之后和第一个 'servlet' 之前:
<listener>
<listener-class>atis.Listener</listener-class>
</listener>
不知道这种方法是否被推荐,但在过去它对我来说运作良好。
web.xml
文件来配置监听器。只需使用 @WebListener
注释您的类即可让 Web 应用程序容器自动实例化和注册监听器。 - Basil Bourque除非您可以访问应用程序服务器提供的托管线程,否则不应在任何应用程序服务器中执行此操作。我不熟悉Glassfish,但是您可以使用commonj WorkManager在Websphere或Weblogic中执行此操作。
显然,在Glassfish和JBOSS中可以通过JCA WorkManager(我不熟悉)完成相同的操作。
public void init() throws ServletException {
mailThread = new MailSendThread();
mailThread.start();
}
<servlet>
<servlet-name>Mail Sending Servlet</servlet-name>
<servlet-class>MailServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
我使用计时器服务启动一个定时对象,并设置了单次到期。然后,在超时时,我使用线程执行我想要完成的操作。
http://onjava.com/pub/a/onjava/2004/10/13/j2ee-timers.html
对我来说,它可以工作,因为它使用了J2EE组件并且是不同的线程。
我还需要创建几个线程,每个线程将打开一个套接字到运行在我的Glassfish应用程序服务器中的另一个远程进程。我研究了Glassfish提供的LifecycleListener bean,需要实现它。
我创建了一个原型来执行LifecycleListener实现中的线程和套接字工作,但它并没有帮助管理这些资源。为了访问LifecycleListener,我不得不放置一个public static方法来执行所需的操作。
我认为LifecycleListener没有价值,因为我可以在我的EJB内部执行完全相同的工作,这是调用LifecycleListener的客户端。因为bean中没有适当的线程和套接字管理。
有人告诉我JCA可能是最好的选择。我还没有尝试过。