gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 23:43:12 25 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

关于multithreading - 长时间运行的后台线程导致 HTTP 请求超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17376736/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com