0

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

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

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

4

1 回答 1

0

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

  1. 看看是否要使用外部缓存。过去,我使用 Project Voldemort ( http://www.project-voldemort.com/voldemort/ ) 取得了一些成功,还有其他选择。
  2. 如果将缓存外部化,则重新启动 Tomcat 将不需要重新加载缓存。
  3. 构建一个单独的应用程序,其工作是加载缓存。
  4. 查看是否要处理请求,如果您要查找的条目在缓存中不可用,请直接从 DB 中查看。
  5. 不要在 Tomcat 等应用程序容器中使用您自己的线程。Tomcat 内置了自己的线程管理逻辑,创建用户线程是一件大事。
于 2013-06-29T09:19:59.303 回答