gpt4 book ai didi

java - JEE7 : best way to create another thread that never exits

转载 作者:行者123 更新时间:2023-12-01 12:58:48 25 4
gpt4 key购买 nike

我正在编写一个 JEE7/Glassfish 4 应用程序,它从外部队列 (RabbitMQ) 读取数据并对其进行处理。它需要一个方法(我想是一个 EJB 方法),其中包含一个永远不会退出的循环来读取队列。我想因为这个循环永远不会退出,所以它需要位于一个单独的线程上。我的问题是,在 JEE7 应用程序中执行此操作的正确方法是什么?

这可能是显而易见的,但 ReadQueue() 方法需要在应用程序启动时自动启动,并且必须保持永久运行。

ManagedExecutorService 适合这个吗?

最佳答案

ManagedExecutorService 正是您想要用于此目的的服务。

JEE 中提供此服务是一个很大的好处。过去,我们基本上只是忽略了准则并自己管理所有这些东西。

MES 允许您捕获调用组件的上下文信息,并将您的任务与容器的生命周期联系起来。这些在 JEE 环境中都非常重要。

至于从哪里开始任务,你基本上有两种选择。

一,您可以使用 ServletContextListener,并让它在容器启动期间启动任务。

第二,您可以使用 @Singleton EJB,并结合其生命周期方法来启动您的任务。

如果您从 ServletContextListener 启动任务,那么该任务将像在 WAR 环境中一样运行。如果您从 @Singleton 启动它,它将在 Session Beans 环境中运行(这主要与 JNDI 的显示方式有关)。

无论哪种方式,您只需要担心通过这些机制启动任务。您应该依靠 ManagedTaskListener.taskAborted 接口(interface)方法来关闭您的任务。

理论上,您可以使用在关闭期间发送到您的任务的 Thread.interrupt。我自己在这方面从来没有好运,我依靠外部机制来告诉长时间运行的任务关闭。

我希望能够亲 body 验这个新设施,但我还没有机会尝试。但从规范来看,这就是您想要做的。

关于java - JEE7 : best way to create another thread that never exits,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23668302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com