【问题标题】:Spring rest api application with backgorund worker thread具有后台工作线程的 Spring Rest api 应用程序
【发布时间】:2016-08-12 21:56:27
【问题描述】:

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

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

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
    }

}

我没有尝试过与 spring 结合使用。

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

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

感谢您的想法。

【问题讨论】:

    标签: java spring multithreading rest


    【解决方案1】:

    您可以使用 BlockingQueue 执行此操作 https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/BlockingQueue.html

    我不确定您的系统限制,但是具有嵌入式队列的解决方案不会很好地扩展。如果您的服务受到限制,您需要运行多个实例,您可能会遇到调用一个服务器比调用另一个服务器花费更长的时间的情况。

    如果您要结合 Spring 执行此操作,您需要将 BlockingQueue 创建为 Bean,以便您可以将其注入您的工作人员和控制器中

    【讨论】:

    • 好的,这实际上很有帮助,谢谢,但我需要的是创建将从(或保留)该队列(或任何其他)的工作线程。也许我没有把我的问题告诉别人,应该重新写一遍?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    相关资源
    最近更新 更多