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:
@Servicepublic 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();
}
}
接下来,从控制器调用它:
@Controllerpublic 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"/>
以上是 Spring MVC如何获得运行异步任务的进度 的全部内容, 来源链接: utcz.com/qa/423969.html