gpt4 book ai didi

Java ExecutionrCompletionService take.get() 从不同的线程

转载 作者:行者123 更新时间:2023-12-01 13:03:20 24 4
gpt4 key购买 nike

在 Java 中,我有一个 Web 服务,它在不同的线程上启动一些长时间运行的进程,以便我可以返回 http 状态而不会出现连接超时。

我的问题涉及创建一个长时间运行的线程,该线程将简单地运行 ExecuterCompletionService.take.get() 来获取已完成的线程并完成对它们的处理。

如果在主线程中创建完成服务,可以在该单独的线程中运行获取完成的对象吗?

EG。

主线程

  1. 创建完成服务
  2. 接受请求并创建长时间运行的流程
  3. 将 Callable 提交给完成服务
  4. 如果一切顺利,返回 HTTP 状态 200

监控线程

  1. 存储对主线程中创建的完成服务的引用。
  2. 运行completionservice.take.get()
  3. 生成已完成任务的报告
  4. 重复

有什么特别需要担心但我忽略了的事情吗?比如同步问题。我知道内部完成服务使用阻塞队列。

最佳答案

恕我直言,只要您保留一个用于提交多个可调用作业的 ExecutorCompletionService 实例,我认为您的方法没有问题。

在这种方法中,当服务器宕机/崩溃时,您将丢失正在运行的作业结果。您将使用 JVM 内存来保持作业的运行。同样,这取决于请求量和并行运行的作业数量以及完成任务所需的时间。

如果您不需要并行运行所有请求,那么对于您的用例,JMS 将是完美的选择。为了避免长时间运行的进程请求超时,我们可以将作业放在JMS中,稍后可以通过JMSlistener(消息监听器/MDB)消费该作业并一一处理。

关于Java ExecutionrCompletionService take.get() 从不同的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23392240/

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