我有一个Java程序/线程,我想部署到Application Server(GlassFish)。该线程应作为“服务”运行,该服务在Application Server启动时启动,在Application Server关闭时停止。
我该怎么做呢?它实际上不是会话Bean或MDB。这只是一个主题。
答案 0 :(得分:7)
我只用Tomcat做过这个,但它应该在Glassfish中运行。
创建一个实现javax.servlet.ServletContextListener
的Listener类,然后将其放在web.xml中。当您的网络应用程序启动并销毁时,它会收到通知。
一个简单的Listener类:
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();
}
}
}
这是在你的上一个'context-param'之后和你的第一个'servlet'之前的web.xml中:
<listener>
<listener-class>atis.Listener</listener-class>
</listener>
不知道是否推荐这种东西,但过去它对我来说效果很好。
答案 1 :(得分:3)
这不是您应该在任何应用服务器中执行的操作,除非您可以访问应用服务器提供的托管线程。我不熟悉Glassfish,但您可以使用commonj WorkManager在Websphere或Weblogic中执行此操作。
显然,可以通过JCA WorkManager(我不熟悉)在Glassfish和JBOSS中完成相同的操作。
答案 2 :(得分:2)
查看 LifecycleListener 界面:
http://glassfish.java.net/nonav/docs/v3/api/index.html?com/sun/appserv/server/LifecycleListener.html
http://docs.oracle.com/cd/E18930_01/html/821-2418/beamc.html
答案 3 :(得分:1)
创建一个servlet,其init方法启动一个主程序的线程。
public void init() throws ServletException {
mailThread = new MailSendThread();
mailThread.start();
}
在我们的应用程序的web.xml文件中添加一个servlet,其中包含一个load-on-startup元素,其中的数字是它的开始顺序。
<servlet>
<servlet-name>Mail Sending Servlet</servlet-name>
<servlet-class>MailServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
答案 4 :(得分:0)
我还需要创建几个线程,其中每个线程将打开一个套接字到另一个在我的Glassfish应用程序中运行的远程进程。服务器。我查看了您需要实现的Glassfish提供的LifecycleListener bean。
我创建了一个原型来在LifecycleListener实现中执行线程和套接字工作,它实际上没有帮助管理这些资源。要访问LifecycleListener,我必须使用公共静态方法来执行所需的操作。
我在LifecycleListener中看不到任何值,因为我可以在EJB中执行完全相同的工作,即调用LifecycleListener的客户端。因为bean中确实没有正确管理Thread和Socket。
我被告知JCA可能是最好的方式。我没试过这个。
答案 5 :(得分:0)
我使用计时器服务启动一个定时对象,并且只有一次到期。然后,在超时时间,我做了我想用线程做的事情。
http://onjava.com/pub/a/onjava/2004/10/13/j2ee-timers.html
对我而言,它起作用,因为它使用J2EE组件并且是一个不同的线程。