我正在使用websphere服务器。我有一个servlet作为请求处理器。由于请求是(很多)后台处理,我需要简单地创建一个线程来完成所有这些后台作业。同时我的请求处理器应在启动此线程后返回。我在查看日志时发现,只要我的请求处理器返回,后台处理线程似乎也会退出,因为它没有给出任何日志消息。我试图让后台线程成为守护进程,但同样不会留下任何日志消息。由websphere启动的请求处理器线程是否永远保留在线程池中?在那种情况下,我的后台线程不应继续工作吗?即使请求处理器死了,是不是因为后台线程是一个守护进程线程,它应该继续执行? 请澄清。如果我对websphere如何管理其线程的理解存在任何缺陷。请帮我理解。
编辑:问题已经解决。实际上这是我的不好。我正在阻止HttpServletRequest对象在后台线程中工作。但是无论如何它一旦被请求返回就被销毁了来自servlet。所以在我的后台线程中有一些空指针异常并且它正在退出。我仍然需要弄清楚HttpServletRequest对象的生命周期以及它何时被销毁。如果你能帮助我理解这一点,我将会是谢天谢地了。 不管怎样,谢谢!
编辑:添加Servlets specification对此的说法: 每个请求对象仅在servlet的服务方法范围内有效,或者 在过滤器的doFilter方法范围内,除非进行异步处理 为组件启用,并在请求上调用startAsync方法 宾语。在发生异步处理的情况下,请求对象保持不变 在AsyncContext上调用完成之前有效。容器通常是回收的 请求对象以避免请求对象的性能开销 创建。 开发人员必须意识到维护对请求对象的引用 没有在上述范围之外调用startAsync的情况 建议因为它可能有不确定的结果。
答案 0 :(得分:1)
由websphere启动的请求处理器线程是否永远保留在线程池中?
大多数ThreadPoolExecutor实例允许线程在一些延长的空闲时间后死亡。这当然是可选的,我不确定websphere如何管理其工作线程。但是,线程不依赖于生成它们以保持它们存活的线程。线程是使JVM保持活动并且每个都是独立的实体。
在那种情况下,我的后台线程不应继续工作吗?即使请求处理器死了,是不是因为后台线程是一个守护进程线程,它应该继续执行?
制作一个线程守护程序仅用于通知JVM,如果该线程仍处于活动状态,它可能会退出。 JVM将继续执行,直到所有非守护程序线程终止。在你的情况下,它与问题无关,因为websphere不会在没有被告知关闭的情况下退出。通常,使Thread守护程序与您想要的完全相反。你希望这个线程的活力让你的JVM保持活力。
当然,这些答案都不能解决您的问题。如何创建和启动Thread的代码片段会有所帮助。许多人会建议你研究使用ExecutorService
而不是制作新的主题。
答案 1 :(得分:1)
不鼓励在j2ee容器中创建线程,请参阅:Why spawning threads in J2EE container is discouraged?
使用Websphere,您可以使用Asynchronous Beans和WorkManager,也可以使用JMS和MDB来完成工作。
答案 2 :(得分:0)
过去,我在使用Quartz创建一个'非阻塞工作线程',同时响应HTTPRequest。
您可以将工作传递给Quartz-thread / job并返回响应,然后在后续请求期间与Quartz-thread / job进行交互。
您可以下载并详细了解Quartz Scheduler here
您可以使用Spring抽象简化流程
有关信息,请查看有关计划的Spring文档。
我希望这会有所帮助 - 如果您需要进一步的指导,请告诉我。