2011-01-27 74 views
0

我正在使用websphere服务器。我有一个充当请求处理器的servlet。由于请求是(很多)后台处理,我只需要创建一个线程来完成所有这些后台任务。同时,我的请求处理器应该在启动该线程后返回。从查看日志中找到的内容只要我的请求处理器返回,后台处理线程似乎也会退出,因为它没有给出任何日志消息。我试图让后台线程成为一个守护进程,但它又不会留下任何日志消息。由websphere启动的请求处理器线程是否永远保持在线程池中?在这种情况下,我的后台线程不应该继续工作吗?即使请求处理器死了,是不是因为后台线程是守护线程,它应该继续执行? 请说明。如果我对websphere管理其线程的理解有任何缺陷。请帮我理解它。保持子线程运行

编辑:问题已经solved.Actually这是我bad.I在忍住HttpServletRequest对象与背景thread.But无论如何一旦请求从servlet返回它被销毁工作。所以在我的后台线程中出现了一些空指针异常,并且它正在退出。我仍然必须弄清楚HttpServletRequest对象的生命周期,以及它究竟是什么时候被销毁的。如果你能帮助我理解这一点,我会很感激。 无论如何,谢谢!

编辑:添加什么Servlets specification必须对这个说: 每个请求对象是有效的只有一个servlet的服务方法,或 的过滤器的doFilter方法的范围之内的范围内,除非异步处理 对组件启用,并且对请求 对象调用startAsync方法。在异步处理发生的情况下,在AsyncContext上调用完成之前,请求对象仍然有效,为 。容器通常会回收 请求对象,以避免创建请求对象 的性能开销。 显影剂必须意识到,维持引用请求对象 为其startAsync没有被调用外部上述范围是不 推荐,因为它可以具有不确定的结果。

+1

你在调用`Thread.start()`吗?你有没有尝试过使用JVisualVM来观察你的线程状态? – 2011-01-27 04:27:51

回答

1

websphere启动的请求处理器线程是否永远保持在线程池中?

大多数ThreadPoolExecutor实例允许线程在一些延长的空闲时间后死亡。这当然是可选的,我不确定websphere如何管理其工作线程。然而,线程并不依赖于产生它们的线程来让它们活着。线程是保持JVM活动并且每个都是独立的实体。

在这种情况下,不应该我的后台线程继续工作?即使请求处理器死了,是不是因为后台线程是守护线程,它应该继续执行?

使线程守护进程仅用于通知JVM,如果该线程仍然存在,它可能会退出。 JVM将继续执行,直到所有非守护进程线程终止。在你的情况下,它对问题没有影响,因为websphere不会被告知关闭而不会退出。一般来说,使线程守护进程与你想要的完全相反。您希望该线程的活力保持您的JVM活着。

当然,这些答案都不能解决您的问题。如何创建和启动线程的代码片段将有所帮助。许多人会建议你使用ExecutorService来代替制作新的主题。

0

在过去,我使用Quartz在响应HTTPRequest的同时创建一个'非阻塞工作线程'。

您可以将工作传递给Quartz-thread/job并返回响应,然后在后续请求期间与Quartz线程/作业进行交互。

您可以下载并了解更多有关Quartz Scheduler here

可以简化使用Spring抽象的过程。
有关信息,请参阅有关计划的Spring文档。

我希望这可以帮助 - 让我知道如果你需要进一步的方向。