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"/>

以上是 Spring MVC如何获得运行异步任务的进度 的全部内容, 来源链接: utcz.com/qa/423969.html

回到顶部