Spring MVC如何获得运行异步任务的进度


问题内容

我想从控制器内部启动一个异步任务,如Spring文档中的以下代码片段所示。

import org.springframework.core.task.TaskExecutor;

public class TaskExecutorExample {

  private class MessagePrinterTask implements Runnable {

    private int cn;

    public MessagePrinterTask() {

    }

    public void run() { 
//dummy code 
for (int i = 0; i < 10; i++) { 
cn = i; 
} 
}

}

private TaskExecutor taskExecutor;

public TaskExecutorExample(TaskExecutor taskExecutor) { 
    this.taskExecutor = taskExecutor; 
  }

  public void printMessages() {

      taskExecutor.execute(new MessagePrinterTask());

  } 
}

之后在另一个请求中(如果任务正在运行),我需要检查任务的进度。基本上得到cn的值。

Spring MVC中最好的方法是如何避免同步问题。

谢谢

佩帕·普罗恰兹卡


问题答案:

您是否已查看Spring参考文档中的@Async注释?

首先,为您的异步任务创建一个bean:

@Service
public class AsyncServiceBean implements ServiceBean {

    private AtomicInteger cn;

    @Async
    public void doSomething() { 
        // triggers the async task, which updates the cn status accordingly
    }

    public Integer getCn() {
        return cn.get();
    }
}

接下来,从控制器调用它:

@Controller
public class YourController {

    private final ServiceBean bean;

    @Autowired
    YourController(ServiceBean bean) {
        this.bean = bean;
    }

    @RequestMapping(value = "/trigger")
    void triggerAsyncJob() {
        bean.doSomething();
    }

    @RequestMapping(value = "/status")
    @ResponseBody
    Map<String, Integer> fetchStatus() {
        return Collections.singletonMap("cn", bean.getCn());
    }        
}

记住要相应地配置一个执行器,例如

<task:annotation-driven executor="myExecutor"/>
<task:executor id="myExecutor" pool-size="5"/>