当前位置: 首页 > 知识库问答 >
问题:

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

赵禄
2023-03-14

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

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

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

共有1个答案

方昊
2023-03-14

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

  1. 查看是否要使用外部缓存。在过去,我使用伏地魔项目取得了一些成功(http://www.project-voldemort.com/voldemort/),还有其他选择
  2. 如果将缓存外部化,则重新启动Tomcat将不需要重新加载缓存
  3. 构建一个单独的应用程序,其任务是加载缓存
  4. 如果要查找的条目在缓存中不可用,请通过直接从数据库中查找来查看是否要处理该请求
  5. 不要在像Tomcat这样的应用程序容器中使用自己的线程。Tomcat内置了自己的线程管理逻辑,创建用户线程是个大问题
 类似资料:
  • 我们有一个应用程序接口实现在裸骨Scala Akka HTTP中--一对路由前面的大量计算(CPU和内存密集)。没有集群-所有运行在一个强壮的机器上。计算量相当大--一个独立请求可能需要60多秒才能完成。我们并不那么在意速度。没有阻塞IO,只是大量的CPU处理。 当我开始对它进行性能测试时,出现了一个有趣的模式:假设请求A1、A2、...、A10通过。它们会大量使用资源,结果Akka会为溢出的请求

  • 我对Python和Django相当陌生,所以请让我知道是否有更好的方法来做到这一点。我想做的是拥有每个设备(从模型继承。Model)启动一个长时间运行的后台线程,该线程不断检查该设备的运行状况。然而,当我运行代码时,它似乎不像守护进程那样执行,因为服务器缓慢且不断超时。这个后台线程将(在大多数情况下)运行程序的生命周期。 下面是我代码的简化版本: 这似乎是线程的一个非常简单的用法,但每次我寻找解决

  • 经过长时间的调查,问题似乎是长时间运行的请求超时,并且在NodeJS中再次调用endpoint。没有来自浏览器的新网络请求。我做了一些测试,2分钟后再次调用endpoint。我读到NodeJS中http请求的默认超时时间为2分钟。 https://nodejs.org/docs/latest-v12.x/api/http.html#http_server_timeout 我使用的是NestJS(有

  • 我有一个压缩图像的任务,它在图像中使用了许多循环: 我在普通线程中运行此方法,如下所示: 或者在后台工作线程中运行 问题是:这种方法有时会出错,在接收无效输入时会导致无限循环。在这种情况下,它将永远运行,并损害CPU,即使当设备的屏幕关闭时,这会增加设备的温度(如果我使用工作线程,它还会阻止等待队列中的其他任务)。 我想我需要设置一个超时来终止长时间运行的任务。在正常Java线程中实现这一点的最佳

  • 我有一个Spring Boot应用程序,我想实现的是,当我的Rest控制器需要更长的时间来处理请求时,只需发送错误而不继续处理请求。这可能吗?我如何以某种方式实现它,而无需在控制器级别进行修改,而是在应用程序级别进行修改。这是在最新的Spring启动

  • 我使用前端Spring云应用程序(微服务)作为Zuul代理()将请求从外部源路由到使用Spring云编写的其他内部微服务(Spring boot) Zuul服务器直接来自示例部分中的应用程序 我在本地运行了这组服务,这一切似乎都工作正常,但如果我在网络上运行它有一些负载,或通过VPN,然后我开始看到Zuul转发错误,我在日志中看到客户端超时。 有没有办法改变Zuul转发的超时时间,这样我就可以从眼