如何在Reactor中更改执行线程

时间:2018-05-02 10:33:06

标签: reactive-programming project-reactor

@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

我如何确保其异步执行。

1 个答案:

答案 0 :(得分:0)

Reactor的执行模型是大多数操作符不会为您更改线程(除非涉及时间)。该库提供了两个允许切换到线程的运算符publishOn(最常见)和subscribeOn

例如Flux.fromIterable(data).publishOn(Schedulers.newSingle("example")).subscribe(...)就是这里的方式。

请注意,WebFlux的模型是它开始处理Netty个线程中的链,您看到的这些nio个线程。因此,非常重要的是,您不要阻止这些线程(这将阻止完全处理其他传入请求)。

Schedulers为各种Scheduler风格提供工厂方法,这是一种Reactor抽象(或多或少在ExecutorService之上)。