【问题标题】:In Reactor Sinks.Many() what is equivalent to EmitterProcessor onCancel在 Reactor Sinks.Many() 中相当于 EmitterProcessor onCancel
【发布时间】:2021-03-03 21:04:27
【问题描述】:

here我曾经有代码

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

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

例如,当使用rSocket 时,浏览器打开会话并请求一些数据,当客户端关闭浏览器时调用EmitterProcessor publisher 之类的

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

会知道 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()));

字符串通过通量发布到浏览器,但是当客户端关闭会话时,不再有 onCancel 来处理一些整理工作。

看起来这是discussed herehere,但我不明白解决方案。请问是什么?

【问题讨论】:

  • 我看到你不再用新的方式指定溢出策略了,你知道怎么设置吗?

标签: project-reactor


【解决方案1】:

sink.asFlux().doOnCancel(...)sink.asFlux() 是两个不同的实例。您没有重复使用已设置取消处理逻辑的那个,这就是为什么您没有观察到 cancelSinkout 变量的清理。

做一些类似的事情:

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

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

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

(PS:你不需要Flux.from(sink.asFlux()),因为后者已经给了你Flux)。

【讨论】:

  • 谢谢,所以用例是使用接收器(或通量?)发送来自另一个队列的随机更新。它使用tryEmitNext(String) 向通量订阅者发出(或发布?)队列消息。是否有 Flux&lt;String&gt; 相当于 tryEmitNext 所使用的 Many&lt;String&gt; sink ?谢谢...
  • 或者,就像我现在所做的那样,推荐使用接收器tryEmitNext 来处理队列然后 投射asFlux 以发布回调用方...
  • 我认为第二种方法,如果我理解正确的话。我的回答只是想说您的 sn-p 基本上忽略了sink.asFlux().doOnCancel(...) 的结果,因此永远不会调用其中的可运行对象。
  • 是的,非常感谢,我现在的流程可以正常工作,但我遇到了this,我仍然缺少关于助焊剂生命周期的一些信息?
猜你喜欢
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-14
  • 2013-07-18
相关资源
最近更新 更多