服务器发送事件弹簧webFlux与反应堆

时间:2017-12-15 18:54:13

标签: spring reactive-programming server-sent-events project-reactor

这可能是通过浏览器客户端分发常见主题信息的正确方法吗?

@RestController
public class GenvScriptHandler {

    DirectProcessor<String> topicData = DirectProcessor.create();
    FluxSink<String> sink;
    int test;


    @GetMapping(value = "/addTopic")
    public void addTopic() {
        if (sink == null) {
            sink = topicData.sink();
        }
        sink.next(String.valueOf(test++));
    }

    @GetMapping(value = "/getTopic", produces = "text/event-stream")
    public Flux<String> getTopic() {
        Flux<String> autoConnect = topicData.publish().autoConnect();

        return autoConnect;
    }
}

因为我使用DirectProcessor没有背压,我想知道通过sse发送时如何消耗通量。订户是否可以请求少于在通量中推送的数字元素?

http://projectreactor.io/docs/core/release/reference/#_directprocessor

  

因此,如果您通过它推送N个元素,但DirectProcessor向其订阅者发出IllegalStateException信号,但其中至少有一个订阅者请求的数量少于N.

1 个答案:

答案 0 :(得分:1)

订阅SSE请求,确实是 请求(1)而不是请求(Integer.MAX_VALUE)

因此,如果我下沉* 1000次,则会抛出Processor OverLoad并引发异常,即使它有订阅者:

reactor.core.Exceptions$OverflowException: Can't deliver value due to lack of requests

在我的案例中更安全地使用EmitterProcessor或ReplayProcessor