Java ExecuteCompletionService从不同线程获取.get()

Java ExecuteCompletionService从不同线程获取.get(),java,concurrency,java.util.concurrent,Java,Concurrency,Java.util.concurrent,在Java中,我有一个web服务,它可以在不同的线程上启动一些长时间运行的进程,这样我就可以返回http状态,而无需连接超时 我的问题涉及创建一个长时间运行的线程,该线程只需运行ExecuteCompletionService.take.get()即可获取已完成的线程并完成对它们的处理 如果在主线程中创建了完成服务,那么在该独立线程中运行get finished objects是否可以 例如 主线 创建完成服务 接受请求并创建长时间运行的流程 向完成服务提交可调用的 如果一切顺利,返回HTTP状

在Java中,我有一个web服务,它可以在不同的线程上启动一些长时间运行的进程,这样我就可以返回http状态,而无需连接超时

我的问题涉及创建一个长时间运行的线程,该线程只需运行ExecuteCompletionService.take.get()即可获取已完成的线程并完成对它们的处理

如果在主线程中创建了完成服务,那么在该独立线程中运行get finished objects是否可以

例如

主线

  • 创建完成服务
  • 接受请求并创建长时间运行的流程
  • 向完成服务提交可调用的
  • 如果一切顺利,返回HTTP状态200
  • 监视线程

  • 存储对在主线程中创建的完成服务的引用
  • 运行completionservice.take.get()
  • 为已完成的任务生成报告
  • 重复

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

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

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


    如果您不需要并行运行所有请求,那么对于您的用例,JMS将是最佳选择。为了避免长时间运行流程的请求超时,我们可以将作业放置在JMS中,稍后您可以通过
    JMSlistener(Message Listener/MDB)
    使用作业,并逐个处理。

    因此您将拥有一个完成服务,可以接受多个请求并提交。在另一个线程中,您正在按顺序处理它们(通过调用get()-get()将等待当前线程,直到作业完成)。您是否正在尝试重新发明JMS?JMS?我将进一步研究这个问题。非常感谢。另外,不,我只是尝试不阻止webservice线程,这样启动进程的put请求就不会超时。是的,只要保留完成服务的单个实例,我看不出您的方法有任何问题。JMS/MDB可以用来解决这类问题。假设您提交了100个请求,并完成了其中的5个请求。现在服务器已关闭/崩溃。在你的方法中,所有铰孔请求都消失了。如果您使用JMS,您不必担心,它将被重新交付,您不需要使用JVM来存储请求。谢谢您提供的信息。如果你想把它作为一个答案,我将接受它,并感谢你提供的JMS信息,我将对此进行更多的研究。非常感谢你的所有帮助。:)