我有一个想要部署到应用程序服务器(GlassFish)中的 Java 程序/线程。线程应该作为“服务”运行,在应用服务器启动时启动,在应用服务器关闭时停止。
我该怎么做呢?它不是真正的会话 Bean 或 MDB。这只是一个线程。
我有一个想要部署到应用程序服务器(GlassFish)中的 Java 程序/线程。线程应该作为“服务”运行,在应用服务器启动时启动,在应用服务器关闭时停止。
我该怎么做呢?它不是真正的会话 Bean 或 MDB。这只是一个线程。
我只用 Tomcat 做过这个,但它应该在 Glassfish 中工作。
创建一个实现的Listener类javax.servlet.ServletContextListener
,然后放到web.xml中。当您的网络应用程序启动和销毁时,它将收到通知。
一个简单的监听器类:
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>
不知道这种东西是否推荐,但过去对我来说效果很好。
这不是您应该在任何应用服务器中执行的操作,除非您有权访问应用服务器提供的托管线程。我不熟悉 Glassfish,但您可以使用 commonj WorkManager 在 Websphere 或 Weblogic 中执行此操作。
显然,同样可以通过 JCA WorkManager(我不熟悉)在 Glassfish 和 JBOSS 中完成。
查看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
创建一个 servlet,其 init 方法启动一个作为主程序的线程。
public void init() throws ServletException {
mailThread = new MailSendThread();
mailThread.start();
}
在我们应用程序的 web.xml 文件中添加一个 servlet,该 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>
我还需要创建几个线程,每个线程都会打开一个套接字,连接到在我的 Glassfish 应用程序中运行的另一个远程进程。服务器。我查看了您需要实现的 Glassfish 提供的 LifecycleListener bean。
我创建了一个原型来执行 LifecycleListener 实现中的线程和套接字工作,但它确实对管理这些资源没有帮助。要访问 LifecycleListener,我必须放置一个公共静态方法来执行所需的操作。
我在 LifecycleListener 中看不到任何价值,因为我可以在我的 EJB 中执行完全相同的工作,即调用 LifecycleListener 的客户端。因为 bean 中的 Thread 和 Socket 确实没有适当的管理。
有人告诉我,JCA 可能是最好的选择。我没有试过这个。
我使用计时器服务启动一个定时对象,并且只有一个过期时间。然后,在超时期间,我对线程做我想做的事情。
http://onjava.com/pub/a/onjava/2004/10/13/j2ee-timers.html
对我来说,它之所以有效,是因为它使用 J2EE 组件并且是一个不同的线程。