在Application Server中进行线程处理

时间:2009-02-10 13:40:17

标签: java multithreading glassfish ejb application-server

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

我该怎么做呢?它实际上不是会话Bean或MDB。这只是一个主题。

6 个答案:

答案 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)

答案 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组件并且是一个不同的线程。