我有一个在 Tomcat 7 上运行的 Spring 3.0 WebMVC 应用程序。在应用程序启动时,我启动了一个后台线程来加载一个包含数据库记录的内存缓存。该线程通常需要一个多小时才能从数据库加载所有数据。在同一个应用程序中,我有一个 @Controller 注释类,它公开一个 REST 接口,客户端可以通过该接口从加载的缓存中获取对象。
我们的要求之一是在数据加载完成之前发出的任何 REST 请求都将立即向客户端返回 SERVICE_UNAVAILABLE (503) HTTP 代码。为了实现这一点,我设置了一个简单的布尔标志检查,控制器中的每个请求方法在执行任何工作之前都会生成该标志。如果值为 false,则该方法应立即返回 503 代码。一旦加载完成,加载器线程将把标志设置为真,以允许请求方法正常运行。
问题是后台线程似乎导致发送到我的控制器的所有 HTTP 请求在 30 秒后超时,而不是点击标志并立即向客户端返回 503 代码。我不是 Tomcat 线程问题方面的专家,我想知道在创建长时间运行的后台线程时我是否做错了什么?我基本上使用“implements Runnable”方法来创建这个问题中描述的线程,并在包含bean初始化时启动线程。有没有更好的方法在 Tomcat 中启动一个不干扰请求处理的长时间运行的后台线程?还是我还缺少其他东西?