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