Spring MVC中如何获得运行异步任务的进度(Spring MVC how to get pro

2019-07-29 17:52发布

我想从控制器内启动异步任务像从春天文档下面的代码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问题。

谢谢

佩帕走

Answer 1:

你看在@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"/>


Answer 2:

一种解决方案可能是:在你的异步线程,写入数据库,并让您检查代码检查数据库表中的进展。 你得到持续性能数据,供以后分析的额外好处。

此外,只需使用@Async注释揭开序幕异步线程-让生活更轻松,是一个春天的方式来做到这一点。



Answer 3:

忽略同步问题,你可以这样做:

  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); 
    }
    ...
  }


Answer 4:

勾选此GitHub的来源,它给赶上在使用Spring MVC的@Async后台作业的状态非常简单的方式。

https://github.com/frenos/spring-mvc-async-progress/tree/master/src/main/java/de/codepotion/examples/asyncExample



文章来源: Spring MVC how to get progress of running async task