在计划任务中使用Flux

时间:2017-10-16 02:45:54

标签: project-reactor spring-webflux

我正在开发一个Spring Webflux项目,并且遇到了尝试在计划任务中发布和使用Flux的问题。

@Scheduled(fixedRate = 20*1000)
fun updateNews() {
    try {
        logger.info("Automatic Update at: ${LocalDateTime.now()}")
        articleRepository.saveAll(
                sourceRepository.findAll().publishOn(Schedulers.parallel())
                        .map { source -> source.generate() }
                        .flatMap { it?.read() ?: Flux.empty() })
                        .timeout(Duration.ofSeconds(20)
        ).subscribeOn(Schedulers.parallel())
    } catch(e: Throwable) {
        logger.log(Level.SEVERE, "Error in Scheduler", e)
    }
}

我配置的计划程序:

ConcurrentTaskScheduler(Executors.newScheduledThreadPool(3))

除非我故意阻止结束,否则此任务永远不会完成:

.then().block()

我最初没有直接引用发布/订阅调度程序,我已经尝试了所有看似合理但没有效果的选项。

我的日志事件发生了,但似乎当调度程序中的此任务的线程死亡时,通量也是垃圾;一旦我指定了publishOn和subscribeOn行为,它们应该在自己的线程池中吗?

我想让这个行动完全被动,任何建议都会受到赞赏。

1 个答案:

答案 0 :(得分:2)

@Scheduled未与Flux集成,因此如果您将其归还Flux,它将不知道如何处理。将其与Reactor(以及一般的Reactive Streams)中的事实相结合,在您subscribe()之前通常不会发生任何事情,并且您可以开始看到出了什么问题。

block()实际上是subscribe()的一种形式,这就是为什么一旦将其添加到代码中它就可以工作的原因。它实际上可能是最好的选择,因为你需要将一段被动的代码(从ReactiveRepository)桥接到命令式阻塞世界(你的@Scheduled fun)。