Java 反应堆:功能创建Monos到通量

Java 反应堆:功能创建Monos到通量,java,project-reactor,Java,Project Reactor,基本上,我在Spring Boot中制作了一个队列处理器,并希望使用Reactor实现异步。我已经做了一个函数需要永远循环,因为它是从队列中提取的函数,然后将该项标记为已处理 这是一个阻塞版本,它的工作原理是Subscribe返回一个Mono while(true) { manager.Subscribe().block() } 我不知道如何将其转化为流量,我已经查看了间隔、生成、创建等,如果不调用block()我无法使任何东西工作 这是我尝试过的一个例子 Flux.generate(

基本上,我在Spring Boot中制作了一个队列处理器,并希望使用Reactor实现异步。我已经做了一个函数需要永远循环,因为它是从队列中提取的函数,然后将该项标记为已处理

这是一个阻塞版本,它的工作原理是Subscribe返回一个Mono

while(true) {
    manager.Subscribe().block()
}
我不知道如何将其转化为流量,我已经查看了间隔、生成、创建等,如果不调用block()我无法使任何东西工作

这是我尝试过的一个例子

Flux.generate(() -> manager,
    (state, sink) -> {
        state.Subscribe().block();
        sink.next("done");
        return state;
    }));
作为反应堆的新手,我还没有找到任何关于无阻塞地同步循环和处理Monos的东西

下面是Subscribe方法使用AWS Java SDK v2所做的工作:

public Mono Subscribe() {
    return Mono.fromFuture(_client.receiveMessage(ReceiveMessageRequest.builder()
            .waitTimeSeconds(10)
            .queueUrl(_queueUrl)
            .build()))
            .filter(x -> x.messages() != null)
            .flatMap(x -> Mono.when(x.messages()
                    .stream()
                    .map(y -> {
                        _log.warn(y.body());
                        return Mono.fromFuture(_client.deleteMessage(DeleteMessageRequest.builder()
                                .queueUrl(_queueUrl)
                                .receiptHandle(y.receiptHandle())
                                .build()));
                    }).collect(Collectors.toList())));
}
基本上,我只是轮询一个SQS队列,删除消息,然后我想再做一次。这一切对我来说只是试探性的


谢谢

您需要两件事:一种是在循环中订阅的方法,另一种是确保在每次迭代中有效地调用
subscribe()
方法(因为需要重新创建
未来的

repeat()
是一个预处理操作符,一旦源代码完成,它将重新订阅源代码。如果源错误,重复循环停止。最简单的变体继续这样做
Long.MAX\u VALUE

唯一的问题是,在您的情况下,必须在每次迭代中重新创建来自
Subscribe()
Mono

为此,您可以将
Subscribe()
调用包装为
defer
:它将在每次新订阅发生时重新调用该方法,包括每次重复尝试:

Flux<Stuff> repeated = Mono
    .defer(manager::Subscribe)
    .repeat();
Flux repeated=Mono
.defer(经理::订阅)
.重复();

管理器对象是什么?它来自哪里?你能给我看完整的课程吗?谢谢你的回答。它由Spring Boot DI管理。我不确定它做了什么,除了它返回一个Mono之外,我想在再次运行它之前确保它是完整的。我添加了一些SubscribeWorks的细节,非常完美,谢谢!我不知道为什么我没有注意到API文档中的重复。