gpt4 book ai didi

spring - 如何使用和自定义MessageConversion(Spring websocket客户端)

转载 作者:行者123 更新时间:2023-12-02 02:48:43 30 4
gpt4 key购买 nike

我用 spring 编写了一个 Web 套接字服务器和一个客户端。代码如下。向服务器发送消息的代码可以工作,但 session.subscribe 方法无法从服务器接收消息。我搜索了很多文档并检查了我的代码。我不明白为什么它不能工作。

这是我的客户端代码:

public class Test {

public static void main(String[] args) {

Thread thread = new Thread(new WebsocketThread());
thread.start();
Thread.sleep(5000);
}
}

class MyStompSessionHandler extends StompSessionHandlerAdapter {

@Override
public void afterConnected(StompSession session, StompHeaders connectedHeaders) {
session.send("/app/messages", "{'payload3':2222}".getBytes());
session.subscribe("/user/queue/position-updates", new StompFrameHandler() {

@Override
public Type getPayloadType(StompHeaders headers) {
return String.class;
}

@Override
public void handleFrame(StompHeaders headers, Object payload) {
System.out.println("test:" + payload);
}

});
}
}

class WebsocketThread implements Runnable{
@Override
public void run() {
List<Transport> transports = new ArrayList<>(1);
transports.add(new WebSocketTransport( new StandardWebSocketClient()) );
WebSocketClient webSocketClient = new SockJsClient(transports);
WebSocketStompClient stompClient = new WebSocketStompClient(webSocketClient);

String url = "ws://127.0.0.1:8860/orders";
StompSessionHandler sessionHandler = new MyStompSessionHandler();
ListenableFuture<StompSession> future = stompClient.connect(url, sessionHandler);
}
}

这是我的服务器代码:

@Controller
public class TestController {

@Autowired
private SimpMessagingTemplate simpMessagingTemplate;

@MessageMapping("/messages")
public void sendUserMsg(String messages) throws IOException {
System.out.println("webSocket:" + messages);
simpMessagingTemplate.convertAndSend("/queue/position-updates", "This is return message");
}
}

这是异常(exception):

org.springframework.messaging.converter.MessageConversionException:没有合适的转换器,payloadType = class java.lang.String,handlerType = class com.example.hello.MyStompSessionHandler 在org.springframework.messaging.simp.stomp.DefaultStompSession.invokeHandler(DefaultStompSession.java:419) 在 org.springframework.messaging.simp.stomp.DefaultStompSession.handleMessage(DefaultStompSession.java:373) 在 org.springframework.web.socket.messaging.WebSocketStompClient$WebSocketTcpConnectionHandlerAdapter.handleMessage(WebSocketStompClient.java:342) 在 org.springframework.web.socket.sockjs.client.AbstractClientSockJsSession.handleMessageFrame(AbstractClientSockJsSession.java:267) 在 org.springframework.web.socket.sockjs.client.AbstractClientSockJsSession.handleFrame(AbstractClientSockJsSession.java:200) 在 org.springframework.web.socket.sockjs.client.WebSocketTransport$ClientSockJsWebSocketHandler.handleTextMessage(WebSocketTransport.java:162) 在 org.springframework.web.socket.handler.AbstractWebSocketHandler.handleMessage(AbstractWebSocketHandler.java:43) 在 org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter.handleTextMessage(StandardWebSocketHandlerAdapter.java:110) 在 org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter.access$000(StandardWebSocketHandlerAdapter.java:42) 在 org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter$3.onMessage(StandardWebSocketHandlerAdapter.java:81) 在 org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter$3.onMessage(StandardWebSocketHandlerAdapter.java:78) 在 org.apache.tomcat.websocket.WsFrameBase.sendMessageText(WsFrameBase.java:399) 在 org.apache.tomcat.websocket.WsFrameBase.processDataText(WsFrameBase.java:500) 在 org.apache.tomcat.websocket.WsFrameBase.processData(WsFrameBase.java:295) 在 org.apache.tomcat.websocket.WsFrameBase.processInputBuffer(WsFrameBase.java:131) 在 org.apache.tomcat.websocket.WsFrameClient.processSocketRead(WsFrameClient.java:73) 在org.apache.tomcat.websocket.WsFrameClient.access$300(WsFrameClient.java:31) 在 org.apache.tomcat.websocket.WsFrameClient$WsFrameClientCompletionHandler.completed(WsFrameClient.java:131) 在 org.apache.tomcat.websocket.WsFrameClient$WsFrameClientCompletionHandler.completed(WsFrameClient.java:114) 在 sun.nio.ch.Invoker.invokeUnchecked(Invoker.java:126) 在 sun.nio.ch.Invoker$2.run(Invoker.java:218) 在 sun.nio.ch.AsynchronousChannelGroupImpl$1.run(AsynchronousChannelGroupImpl.java:112) 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:745)

最佳答案

就我而言,服务器在不同的 channel 上发送 jsonraw string 消息。为了能够处理这两种情况,我浏览了 MessageConverter 实现并找到了 CompositeMessageConverter,它允许在客户端上设置多个转换器。

代码:

List<MessageConverter> converters = new ArrayList<MessageConverter>();
converters.add(new MappingJackson2MessageConverter()); // used to handle json messages
converters.add(new StringMessageConverter()); // used to handle raw strings

client.setMessageConverter(new CompositeMessageConverter(converters));

然后,StompFrameHandler 将根据 getPayloadType() 返回的内容决定使用哪个转换器。

关于spring - 如何使用和自定义MessageConversion(Spring websocket客户端),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41604828/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com