我在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中长时间运行的后台线程,它不会干扰请求处理?或者还有其他我缺少的东西?
答案 0 :(得分:0)
如果我是你,我会做一些不同的事情: