我从实时数据源中读取了@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确实会启动并且订阅有效。
答案 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
。