长时间运行的后台线程导致HTTP请求超时

时间:2013-06-29 04:35:01

标签: multithreading tomcat

我在Tomcat 7上运行了一个Spring 3.0 WebMVC应用程序。在应用程序启动时,我启动了一个后台线程来加载一个带有来自DB的记录的内存缓存。此线程通常需要一个多小时才能从DB加载所有数据。在同一个应用程序中,我有一个@Controller注释类,它暴露了一个REST接口,客户端可以通过该接口从加载的缓存中获取对象。

我们的一个要求是,在数据加载完成之前发出的任何REST请求都会立即向客户端返回SERVICE_UNAVAILABLE(503)HTTP代码。为了实现这一点,我设置了一个布尔标志的简单检查,控制器中的每个请求方法在进行任何工作之前都会进行。如果值为false,则该方法应立即返回503代码。一旦加载完成,加载程序线程将标志设置为true,以允许请求方法正常运行。

问题是后台线程似乎导致发送到我的控制器的所有HTTP请求在30秒后超时,而不是点击标志并立即向客户端返回503代码。我不是Tomcat线程问题的专家,我想知道在创建长时间运行的后台线程时我是否做错了什么?我基本上使用“implements Runnable”方法来创建this问题中描述的线程,并在包含bean初始化时启动线程。有没有更好的方法来启动Tomcat中长时间运行的后台线程,它不会干扰请求处理?或者还有其他我缺少的东西?

1 个答案:

答案 0 :(得分:0)

如果我是你,我会做一些不同的事情:

  1. 查看是否要使用外部缓存。在过去,我使用Project Voldemort(http://www.project-voldemort.com/voldemort/)取得了一些成功,还有其他选择。
  2. 如果您将缓存外部化,那么重新启动Tomcat将不需要重新加载缓存。
  3. 构建一个单独的应用程序,其任务是加载缓存。
  4. 查看您是否要处理请求,如果您要查找的条目在缓存中不可用,请直接从数据库查找。
  5. 不要在Tomcat等应用程序容器中使用自己的Thread。 Tomcat内置了自己的线程管理逻辑,创建用户线程是BIG-NO。
相关问题