助焊剂阻碍Netty的启动

时间:2019-03-14 07:31:54

标签: java spring-webflux project-reactor

我从实时数据源中读取了@Repository。我正在使用Flux.create() { sink->sink.next() }

使数据可用

@Service正在执行以下操作;

@Autowired MyRepository myRepository;

@PostConstruct() public void startUp() {
  ConnectableFlux<Object> cf = myRepository.flux.publish();
  cf.subscribe(System.out::println);
  cf.connect();
}

可以正常工作并打印数据,但是我确实在日志中获得“ Netty启动”,并且@Controllers没有响应。如果我省略cf.connect(),Netty将启动。因此,我假设cf.connect()正在阻止Netty。

理想情况下,我希望订阅自动启动。在connect()中使用@PostConstuct太早了吗?我应该听“ Netty Started”事件,然后connect(),还是订阅完全错误?

编辑:如果connect在守护程序Thread中运行,则Netty确实会启动并且订阅有效。

1 个答案:

答案 0 :(得分:0)

@EnableAsync放在Spring Boot的主Application类上,并将@Async放在上述方法上似乎可行。

编辑: 我在Connectable Flux blocks on toIterator.forEach, while Flux does not. #1549找到了更好的解决方案。所以我的代码现在看起来像这样;

Flux<MyClass> flux = Flux.create(
   sink -> {
       while(condition) {
          sink.next(nextValueFromDataSource);
       }
       sink.complete();
    }
)
.publish()
.autoConnect(1);

也由于autoConnect(1),因此不需要@Async