首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RSocket Js客户端不获取从Spring服务器生成的元素

RSocket Js客户端不获取从Spring服务器生成的元素
EN

Stack Overflow用户
提问于 2020-05-31 16:53:26
回答 1查看 1.4K关注 0票数 2

https://github.com/codependent/rsocket-rating-service上提供的示例项目

Spring服务器消息映射需要一个requestResponse请求,返回一个简单的POJO:

代码语言:javascript
复制
    @MessageMapping("request-rating")
    fun getRatingWebSocket(ratingRequest: RatingRequest): Mono<Rating> {
        return Mono.just(Rating(ratingRequest.songId, (0..10).random())).log()
                .doOnNext {
                    logger.info("Next {}", it)
                }
                .doOnCancel {
                    logger.info("Cancel")
                }
                .doOnSuccess {
                    logger.info("Success {}", it)
                }
                .doOnError { throwable ->
                    logger.error("Error {}", throwable)
                }
                .doOnTerminate { logger.info("Terminate") }
    }

在客户端,我有以下JS代码来连接到RSocket服务器并请求一个值:

代码语言:javascript
复制
const {
    RSocketClient,
    JsonSerializer,
    IdentitySerializer,
} = require('rsocket-core');
const RSocketWebSocketClient = require('rsocket-websocket-client').default;
const route = 'request-rating';
let client = undefined;
let rSocket = undefined;

function main() {
    if (client !== undefined) {
        client.close();
    }
    client = new RSocketClient({
        serializers: {
            data: JsonSerializer,
            metadata: IdentitySerializer
        },
        setup: {
            // ms btw sending keepalive to server
            keepAlive: 60000,
            // ms timeout if no keepalive response
            lifetime: 180000,
            // format of `data`
            dataMimeType: 'application/json',
            // format of `metadata`
            metadataMimeType: 'message/x.rsocket.routing.v0',
        },
        transport: new RSocketWebSocketClient({
            url: 'ws://localhost:8080/rating-ws'
        }),
    });

    // Open the connection
    client.connect().subscribe({
        onComplete: socket => {
            // socket provides the rsocket interactions fire/forget, request/response,
            // request/stream, etc as well as methods to close the socket.
            rSocket = socket;
        },
        onError: error => {
            console.log("Connection has been refused due to ", error);
        },
        onSubscribe: cancel => {
            /* call cancel() to abort */
        }
    });
    document.getElementById('sendButton').addEventListener('click', requestRating);
}

function requestRating() {
    rSocket.requestResponse({
        data: {
            'songId': document.getElementById("songId").value
        },
        metadata: String.fromCharCode(route.length) + route
    }).subscribe({
        onComplete: () => {
            console.log('Complete')
        },
        onError: error => {
            console.log("Connection has been closed due to " + error);
        },
        onNext: payload => {
            console.log(payload.data);
        },
        onSubscribe: subscription => {
            //subscription.request(1)
            console.log("Subscribed")
        }
    });
}

document.addEventListener('DOMContentLoaded', main);

index.html

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Rating Service</title>
    <link href="/webjars/bootstrap/css/bootstrap.min.css" rel="stylesheet">
    <script src="/webjars/jquery/jquery.min.js"></script>
    <script src="/webjars/stomp-websocket/stomp.min.js"></script>
    <script src="bundle.js"></script>
</head>
<body>
<div>Request your rating</div>
<div>
    <label> ClientId:
        <input id="songId" type="text" name="songId"/>
    </label>
</div>
<div><input id="sendButton" type="button" name="send" value="Send"/></div>
</body>
</html>

访问http://localhost:8080/index.html后,输入一些文本并推送。

请求到达记录正确生成onNext值的服务器:

代码语言:javascript
复制
[ctor-http-nio-6] reactor.Mono.Just.1                      : | onSubscribe([Synchronous Fuseable] Operators.ScalarSubscription)
[ctor-http-nio-6] reactor.Mono.Just.1                      : | request(1)
[ctor-http-nio-6] reactor.Mono.Just.1                      : | onNext(Rating(songId=asdfas, value=0))
[ctor-http-nio-6] c.c.r.r.c.RatingServiceRestController    : Next Rating(songId=asdfas, value=0)
[ctor-http-nio-6] c.c.r.r.c.RatingServiceRestController    : Success Rating(songId=asdfas, value=0)
[ctor-http-nio-6] c.c.r.r.c.RatingServiceRestController    : Terminate
[ctor-http-nio-6] reactor.Mono.Just.1                      : | onComplete()

但是在客户端

代码语言:javascript
复制
        onNext: payload => {
            console.log(payload.data);
        },

则浏览器日志只显示:

代码语言:javascript
复制
Subscribed
Complete

为什么它不从服务器获取生成的值?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-31 17:42:03

在RSocket JS中,与反应流不同的是,onComplete信号以requestResponse交互模式获取数据。

这似乎不符合协议规范(https://rsocket.io/about/protocol):

(C)omplete和(N)ext集合,意思是有效载荷包含数据和信号流完成。例如:一个可观察的流接收onNext(有效载荷),然后是onComplete()。只是(C)个完整集,意思是有效载荷不包含任何数据,只包含信号流完成。例如:接收onComplete()的可观察流。只是(N)ext集,意味着包含数据流的有效载荷没有完成。例如:接收onNext(有效载荷)的可观测流。

为了解决这个问题,我必须将回调函数修改为:

代码语言:javascript
复制
        onComplete: completeData => {
            console.log('Complete '+ completeData.data)
        },
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62119541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档