12

我有一个想要部署到应用程序服务器(GlassFish)中的 Java 程序/线程。线程应该作为“服务”运行,在应用服务器启动时启动,在应用服务器关闭时停止。

我该怎么做呢?它不是真正的会话 Bean 或 MDB。这只是一个线程。

4

6 回答 6

7

我只用 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>

不知道这种东西是否推荐,但过去对我来说效果很好。

于 2009-02-10T14:16:01.310 回答
3

这不是您应该在任何应用服务器中执行的操作,除非您有权访问应用服务器提供的托管线程。我不熟悉 Glassfish,但您可以使用 commonj WorkManager 在 Websphere 或 Weblogic 中执行此操作。

显然,同样可以通过 JCA WorkManager(我不熟悉)在 Glassfish 和 JBOSS 中完成。

于 2009-02-10T14:00:52.487 回答
1

创建一个 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>
于 2009-02-10T13:52:19.700 回答
0

我还需要创建几个线程,每个线程都会打开一个套接字,连接到在我的 Glassfish 应用程序中运行的另一个远程进程。服务器。我查看了您需要实现的 Glassfish 提供的 LifecycleListener bean。

我创建了一个原型来执行 LifecycleListener 实现中的线程和套接字工作,但它确实对管理这些资源没有帮助。要访问 LifecycleListener,我必须放置一个公共静态方法来执行所需的操作。

我在 LifecycleListener 中看不到任何价值,因为我可以在我的 EJB 中执行完全相同的工作,即调用 LifecycleListener 的客户端。因为 bean 中的 Thread 和 Socket 确实没有适当的管理。

有人告诉我,JCA 可能是最好的选择。我没有试过这个。

于 2009-05-02T14:11:43.240 回答
0

我使用计时器服务启动一个定时对象,并且只有一个过期时间。然后,在超时期间,我对线程做我想做的事情。

http://onjava.com/pub/a/onjava/2004/10/13/j2ee-timers.html

对我来说,它之所以有效,是因为它使用 J2EE 组件并且是一个不同的线程。

于 2010-07-01T13:34:06.143 回答