@RequestMapping(value = "/try",
method = RequestMethod.GET)
@ResponseBody
public String demo(){
List<String>data=new ArrayList<>();
data.add("A1");
data.add("A2");
data.add("A3");
data.add("A4");
Flux.fromIterable(data).subscribe(s->printStatement(s));
return "done";
}
public void printStatement(String s){
long i;
for(i=0;i<1000000000;i++)
{}
LOGGER.info(s+"------"+Thread.currentThread().getId());
}
在上面的示例中,我希望胎面ID不同(跳跃异步执行)。从日志中我可以看到相同的胎面正在执行整个过程
日志:
2018-05-02 03:24:42.387 INFO 29144 --- [nio-8080-exec-1] c.n.p.s.p.reactorDemo : A1------26
2018-05-02 03:24:44.118 INFO 29144 --- [nio-8080-exec-1] c.n.p.s.p.reactorDemo : A2------26
2018-05-02 03:24:44.418 INFO 29144 --- [nio-8080-exec-1] c.n.p.s.p.reactorDemo : A3------26
2018-05-02 03:24:44.717 INFO 29144 --- [nio-8080-exec-1] c.n.p.s.p.reactorDemo : A4------26
我如何确保其异步执行。
答案 0 :(得分:0)
Reactor
的执行模型是大多数操作符不会为您更改线程(除非涉及时间)。该库提供了两个允许切换到线程的运算符publishOn
(最常见)和subscribeOn
。
例如Flux.fromIterable(data).publishOn(Schedulers.newSingle("example")).subscribe(...)
就是这里的方式。
请注意,WebFlux的模型是它开始处理Netty
个线程中的链,您看到的这些nio
个线程。因此,非常重要的是,您不要阻止这些线程(这将阻止完全处理其他传入请求)。
Schedulers
为各种Scheduler
风格提供工厂方法,这是一种Reactor抽象(或多或少在ExecutorService
之上)。