如何在 RSocket-JS 中执行无限 requestStream()?当 subscription.request() 用完时会发生什么?

问题描述

我正在尝试创建一个 RSocket JS 客户端侦听 Spring Boot 服务器的情况。当服务器有客户端的一些数据时,它发送它并且客户端 onNext() 触发并开始处理/显示该数据。够简单了吧?

我看过很多例子,包括来自官方 RSocket-JS 存储库的一个,提出了这种设置:

socket
      .requestStream({
        data: new Buffer('request-stream'),metadata: null,})
      .subscribe({
        onNext: value => console.log('%s',value.data),onSubscribe: sub => sub.request(2147483647),});

此处 sub.request(2147483647) 请求 n 数据实例,其中 n 是最大 int32。但是,n 不是无限的。当服务器发送了 2147483647 个数据实例时会发生什么?客户端会停止接受新数据吗?如果是这样,当这种情况发生时你会怎么做,你如何知道它何时发生?另外,如果需要,您如何停止这个无限请求循环?

我想出了这个:

var subscription: ISubscription = null;
socket
    .requestStream({
        data: new Buffer('request-stream'),})
    .subscribe({
        onNext: value => {
            console.log('%s',value.data)
            someDataProcessing()
            subscription.request(1)
        },onSubscribe: sub => {
            sub.request(1)
            subscription = sub
        },});

然而,在测试时我遇到了另一个问题——出于某种原因,在几次请求之后,请求循环结束。我不确定为什么会发生这种情况,但我猜这可能是因为 someDataProcessing() 可能会阻塞(例如遍历数据),这反过来会导致客户端“错过”新数据.我们可以通过将 1 增加到例如 5 来解决这个问题,但这会导致请求堆积如山,所以我不确定这是否是最佳解决方案。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)