【问题标题】:Threading in an Application Server应用服务器中的线程
【发布时间】:2010-10-06 15:37:24
【问题描述】:

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

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

【问题讨论】:

  • 好奇:为什么要开个话题?当您必须在 AppServer 中启动线程时,我总是感觉很糟糕......
  • 线程是运行一个HSQL DB Server实例

标签: java multithreading glassfish ejb application-server


【解决方案1】:

我只用 Tomcat 做过这个,但它应该可以在 Glassfish 中工作。

创建一个实现javax.servlet.ServletContextListener的Listener类,然后放到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();
        }
    }

}

这在您最后一个“上下文参数”之后和您的第一个“servlet”之前的 web.xml 中:

<listener>
    <listener-class>atis.Listener</listener-class>
</listener>

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

【讨论】:

  • 在我看来这比劫持 servlet.init() 方法要干净得多。不过,我对在 AppServer 中启动线程感到有些不自在。
  • +1 这是要做的。如果您对管理自己的线程感到不舒服.. 在应用服务器中启动石英。但是像这里描述的那样在 SCL 中执行它..
  • 不错。在 Glassfish 3 上工作。
  • 仅供参考,从 Servlet 3.0 开始,您可以跳过 web.xml 文件编辑来配置您的侦听器。只需使用 @WebListener 注释您的类,即可让 Web 应用程序容器自动实例化并注册侦听器。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:
    【解决方案4】:

    创建一个 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>
    

    【讨论】:

      【解决方案5】:

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

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

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

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

      【讨论】:

        【解决方案6】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-02-07
          • 1970-01-01
          • 2013-12-24
          • 2014-03-15
          • 1970-01-01
          • 2011-07-14
          • 2011-08-21
          相关资源
          最近更新 更多