我想从控制器内启动异步任务像从春天文档下面的代码sniplet。
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());
}
}
后来在annother请求(在的情况下任务运行时)我需要检查任务的进度。 Basicaly得到CN的价值。
什么是Spring MVC中最好的形式给出一个如何避免syncronisation问题。
谢谢
佩帕走
你看在@Async
在注释Spring参考文档 ?
首先,为您的异步任务一个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"/>
一种解决方案可能是:在你的异步线程,写入数据库,并让您检查代码检查数据库表中的进展。 你得到持续性能数据,供以后分析的额外好处。
此外,只需使用@Async
注释揭开序幕异步线程-让生活更轻松,是一个春天的方式来做到这一点。
忽略同步问题,你可以这样做:
private class MessagePrinterTask implements Runnable {
private int cn;
public int getCN() {
return cn;
}
...
}
public class TaskExecutorExample {
MessagePrinterTask printerTask;
public void printMessages() {
printerTask = new MessagePrinterTask();
taskExecutor.execute(printerTask);
}
...
}
勾选此GitHub的来源,它给赶上在使用Spring MVC的@Async后台作业的状态非常简单的方式。
https://github.com/frenos/spring-mvc-async-progress/tree/master/src/main/java/de/codepotion/examples/asyncExample