Project reactor 在反应堆水槽中。许多()相当于EmitterProcessor onCancel的是什么

Project reactor 在反应堆水槽中。许多()相当于EmitterProcessor onCancel的是什么,project-reactor,Project Reactor,我以前有密码 EmitterProcessor<String> emitter = EmitterProcessor.create(); FluxSink<String> sink = emitter.sink(FluxSink.OverflowStrategy.LATEST); sink.onCancel(() -> { cancelSink(id, request); }); 将知道Flux订户被取消(当浏览器关闭时),这将调用onCancel句柄 使用

我以前有密码

EmitterProcessor<String> emitter = EmitterProcessor.create();
FluxSink<String> sink = emitter.sink(FluxSink.OverflowStrategy.LATEST);

sink.onCancel(() -> {
  cancelSink(id, request);
});
将知道Flux订户被取消(当浏览器关闭时),这将调用
onCancel
句柄

使用
Sinks.Many()
我已经实现了

Many<String> sink = Sinks.many().unicast().onBackpressureBuffer();

sink.asFlux().doOnCancel(() -> {
    cancelSink(id, request);
});

Flux<String> out = Flux
    .from(sink.asFlux()
    .log(log.getName()));
Many sink=Sinks.Many().unicast().onBackpressureBuffer();
sink.asFlux().doOnCancel(()->{
取消接收(id,请求);
});
通量输出=通量
.from(sink.asFlux())
.log(log.getName());
字符串通过浏览器的流量发布,但是当客户端关闭会话时,不再需要
onCancel
来进行整理

看起来是这样,但我不明白解决办法。请问是什么?

sink.asFlux().doOnCancel(…)
sink.asFlux()
是两个不同的实例。您没有重用设置了取消处理逻辑的那一个,这就是为什么您没有在
out
变量上观察
cancelSink
清理

做一些更像:

Many<String> sink = Sinks.many().unicast().onBackpressureBuffer();

Flux<String> fluxWithCancelSupport = sink.asFlux().doOnCancel(() -> {
    cancelSink(id, request);
});

Flux<String> out = fluxWithCancelSupport
    .log(log.getName()));
Many sink=Sinks.Many().unicast().onBackpressureBuffer();
通量fluxWithCancelSupport=sink.asFlux().doOnCancel(()->{
取消接收(id,请求);
});
通量输出=通量带取消支持
.log(log.getName());

(注:您不需要使用
Flux.from(sink.asFlux())
,因为后者已经为您提供了
Flux
)。

谢谢,因此使用案例是使用sink(或Flux?)从另一个队列发送随机更新。它使用
tryEmitNext(String)
将队列消息发送(或发布?)给flux订户。是否有
Many
sink使用的
Flux
等效于
tryEmitNext
?谢谢…或者,正如我现在所做的,推荐使用sink
tryEmitNext
来处理队列,然后将
asFlux
转换为发布回调用者…我认为第二种方法,如果我理解正确的话。我的回答只是想说,您的代码片段基本上忽略了sink.asFlux().doOnCancel(…)的结果,因此其中的runnable将永远不会被调用。是的,谢谢,这太好了,我现在有了流程,但我遇到了我仍然缺少关于flux生命周期的一些东西?
Many<String> sink = Sinks.many().unicast().onBackpressureBuffer();

Flux<String> fluxWithCancelSupport = sink.asFlux().doOnCancel(() -> {
    cancelSink(id, request);
});

Flux<String> out = fluxWithCancelSupport
    .log(log.getName()));