Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringWebFlux WebSocket客户端-如何处理不同的消息结构?_Java_Spring_Client_Reactive Programming_Spring Webflux - Fatal编程技术网

Java SpringWebFlux WebSocket客户端-如何处理不同的消息结构?

Java SpringWebFlux WebSocket客户端-如何处理不同的消息结构?,java,spring,client,reactive-programming,spring-webflux,Java,Spring,Client,Reactive Programming,Spring Webflux,我面临的挑战是,一个现有的web服务返回一个调用2条消息,但具有不同的结构/类型 我如何在春季使用WebFlux ReactorNettyWebSocketClient处理这个问题?i、 e.如何连接2个不同的映射器或通过多个订户处理它 这里假设这两条响应消息的顺序始终相同,因此第一条消息将由“info”映射器解析,第二条消息由“auth”映射器解析 第二条消息是订户的信息。然后,服务器将继续在通道“0”上发送多条消息。当我收到第二条消息时,如何与我的客户订阅这些信息 客户: WebSocket

我面临的挑战是,一个现有的web服务返回一个调用2条消息,但具有不同的结构/类型

我如何在春季使用WebFlux ReactorNettyWebSocketClient处理这个问题?i、 e.如何连接2个不同的映射器或通过多个订户处理它

这里假设这两条响应消息的顺序始终相同,因此第一条消息将由“info”映射器解析,第二条消息由“auth”映射器解析

第二条消息是订户的信息。然后,服务器将继续在通道“0”上发送多条消息。当我收到第二条消息时,如何与我的客户订阅这些信息

客户:

WebSocketClient client = new ReactorNettyWebSocketClient();
client.execute(uri, session -> session.send(Mono.just(session.textMessage(authCommand)))
                .thenMany(session.receive().take(2).doOnNext(message -> {
                    System.out.println(message.getPayloadAsText());
                })).then()).block();
第一次从服务器返回:

{"event":"info","version":2,"serverId":"20df78274661","platform":{"status":1}}
{"event":"auth","status":"OK","chanId":0,"userId":2256812}
 
在服务器发出两条消息之后发送的通道消息:

[0,"wu",["funding","USD",11041.78713953,0,8.090876180000123,null,null]]
[0,"wu",["funding","BTC",0.25495514,0,4.000000003445692e-8,null,null]]
[0,"wu",["funding","EUR",2139.03965717,0,0.00965717000008226,null,null]]

感谢您提前提出建议和想法。

在研究了一些关于WebFlux和反应堆的材料后,我采用了以下方法。我使用的处理器可以连接多个订阅者。然后将该处理器连接到WebSocketClient中

关于不同处理器的一个很好的总结可以在这里找到

使用这种方法,我将能够动态添加订户。因此,当我检测到频道消息时,我可以使用过滤器为该频道号向处理器添加一个新订户。下面的伪代码说明了该行为

ReplayProcessor<String> output = ReplayProcessor.create();
output.filter(msg -> msg.startsWith("{")).subscribe(msg -> {
    System.out.println(msg);
    JSONObject json = new JSONObject(msg); 
    if (json.has("event") && json.get("event").equals("auth")) {
        if (json.has("chanId")) {
            int chanId = json.getInt("chanId");
            // add new subscriber for that channel number, receives only messages from that channel
            output.filter(t -> t.startsWith("[" + chanId)).subscribe( t -> System.err.println(t));
        }
    }
});
        
client.execute(uri, session -> 
        // send message
        session.send(Mono.just(session.textMessage(authCommand)))
        .thenMany(session.receive()
            .map(message -> message.getPayloadAsText())
            .subscribeWith(output))
        .then()).block();

ReplayProcessor输出=ReplayProcessor.create();
output.filter(msg->msg.startsWith(“{”).subscribe(msg->{
System.out.println(msg);
JSONObject json=新的JSONObject(msg);
if(json.has(“event”)&&json.get(“event”).equals(“auth”)){
if(json.has(“chanId”)){
int chanId=json.getInt(“chanId”);
//为该频道号码添加新订户,仅接收来自该频道的消息
output.filter(t->t.startsWith(“[”+chanId)).subscribe(t->System.err.println(t));
}
}
});
执行(uri,会话->
//发送消息
send(Mono.just(session.textMessage(authCommand)))
.thenMany(session.receive())
.map(message->message.getPayloadAsText())
.th(输出))
.then()).block();