Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带backgorund工作线程的Spring rest api应用程序_Java_Spring_Multithreading_Rest - Fatal编程技术网

Java 带backgorund工作线程的Spring rest api应用程序

Java 带backgorund工作线程的Spring rest api应用程序,java,spring,multithreading,rest,Java,Spring,Multithreading,Rest,我正在使用Spring用RESTAPI构建一个应用程序。我需要restapi方法将任务(仅仅是对象)添加到队列和后台工作线程中,这些线程将在队列为空时等待,或者在队列不为空时逐个执行任务。一个接一个地执行任务是绝对必要的,它们可能需要1到几分钟的时间。不需要等待并通过RESTAPI发送结果,只需要任务已启动的信息 基本上,我的想法是这样的(不是我将如何编写代码,我知道使用并发包和执行器可以更好地做到这一点……): 公共类工作程序实现可运行{ 专用队列; 公共addTask(…任务){ this.

我正在使用Spring用RESTAPI构建一个应用程序。我需要restapi方法将任务(仅仅是对象)添加到队列和后台工作线程中,这些线程将在队列为空时等待,或者在队列不为空时逐个执行任务。一个接一个地执行任务是绝对必要的,它们可能需要1到几分钟的时间。不需要等待并通过RESTAPI发送结果,只需要任务已启动的信息

基本上,我的想法是这样的(不是我将如何编写代码,我知道使用并发包和执行器可以更好地做到这一点……):

公共类工作程序实现可运行{
专用队列;
公共addTask(…任务){
this.queue.add(任务);
this.notify();
}
@凌驾
公开募捐{
检查任务队列
-如果为空,请等待()
-如果不为空,则执行任务
}
}
我尝试过的任何东西都不能与spring结合使用

我有一些java知识,并且我已经制作了一些使用并发的桌面应用程序,但是没有spring的经验,所以我只需要指出正确的方向

这可以使用异步方法(@Async)完成吗?或者可以创建同步线程(组件),定期检查队列


谢谢您的建议。

您可以使用阻止队列来完成此操作

我不确定您的系统约束,但带有嵌入式队列的解决方案不会很好地扩展。如果您的服务受到限制,您需要运行多个实例,您可以在对一台服务器的调用比对另一台服务器的调用耗时更长的情况下结束


如果要与Spring结合使用,则需要将BlockingQueue创建为Bean,以便将其注入到工作线程和控制器中

好的,这实际上是非常有用的,谢谢,但我需要的是创建一个工作线程,它将从该队列(或任何其他队列)中获取(或保留)。也许我没有把我的问题讲清楚,应该把它重新连接起来?
public class Worker implements Runnable {

    private Queue<...> queue;

    public addTask(... task) {
        this.queue.add(task);
        this.notify();
    }

    @Override
    public void run(){
        check task queue
           - wait() if empty
           - execute task if not empty
    }

}