应用服务器中的线程处理

12

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

我应该如何做?它并不是一个Session Bean或MDB,只是一个线程。


好奇:为什么需要启动一个线程?当您必须在AppServer中启动线程时,我总是感到不舒服... - Guillaume
该线程是为了运行一个 HSQL DB 服务器实例。 - mainstringargs
6个回答

7

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

不知道这种方法是否被推荐,但在过去它对我来说运作良好。


这对我来说比劫持servlet.init()方法要干净得多。尽管如此,我对在AppServer中启动线程感到有些不舒服。 - Guillaume
+1 这是正确的方法。如果您不喜欢管理自己的线程,请在应用程序服务器内启动Quartz。但请像这里描述的那样,在SCL内执行它。 - Andreas Petersson
不错。这里可以在Glassfish 3上运行。 - Bjørn Stenfeldt
自 Servlet 3.0 起,您可以跳过编辑 web.xml 文件来配置监听器。只需使用 @WebListener 注释您的类即可让 Web 应用程序容器自动实例化和注册监听器。 - Basil Bourque

3

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

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



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>

0

我使用计时器服务启动一个定时对象,并设置了单次到期。然后,在超时时,我使用线程执行我想要完成的操作。

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

对我来说,它可以工作,因为它使用了J2EE组件并且是不同的线程。


0

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

我创建了一个原型来执行LifecycleListener实现中的线程和套接字工作,但它并没有帮助管理这些资源。为了访问LifecycleListener,我不得不放置一个public static方法来执行所需的操作。

我认为LifecycleListener没有价值,因为我可以在我的EJB内部执行完全相同的工作,这是调用LifecycleListener的客户端。因为bean中没有适当的线程和套接字管理。

有人告诉我JCA可能是最好的选择。我还没有尝试过。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接