2017-01-12 14 views
2

私は春にWebソケットサーバーとクライアントを作成しました。コードは以下のとおりです。サーバーにメッセージを送信するコードが動作しますが、sesssion.subscribeメソッドはサーバーからメッセージを受信できません。私は多くの文書を検索し、自分のコードをチェックします。私はなぜそれがうまくいかないのではない。ここでMessageConversion(Spring websocket client)の使い方とカスタマイズ方法

は私のクライアントのコードです:ここで

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"); 
    } 
} 

それは例外である:

org.springframework.messaging.converter.MessageConversionException:いいえ、適切なコンバーター、payloadType =クラスjava.lang.String、handlerType =クラスcom.example.hello.MyStompSessionHandler at org.springframework.messaging.simp.stomp.D org.springframework.web.socket.messaging.WebSocketStompClient $ WebSocketTcpConnectionHandlerAdapter.handleMessageでorg.springframework.messaging.simp.stomp.DefaultStompSession.handleMessage(DefaultStompSession.java:373) でefaultStompSession.invokeHandler(DefaultStompSession.java:419) ( WebSocketStompClient.java:342)org.springframework.web.socket.sockjs.client.AbstractClientSockJsSession.handleFrameでorg.springframework.web.socket.sockjs.client.AbstractClientSockJsSession.handleMessageFrame(AbstractClientSockJsSession.java:267) で (AbstractClientSockJsSession。 (WebSocketTransport.java:162) at org.springframework.web.socket.handler.AbstractWebSocketHandler.handleMessage(A bstractWebSocketHandler.java:43)org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter.access $ 000(StandardWebSocketHandlerAdapterでorg.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter.handleTextMessage(StandardWebSocketHandlerAdapter.java:110) で に.java:42) at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter $ 3.onMessage(StandardWebSocketHandlerAdapter.java:81) at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter $ 3.onMessage(StandardWebSocketHandlerAdapter .java:78) at org.apache.tomcat.websocket.WsFrameBase.sendMessageText(WsFrameBase.java:399) at org.apache.tomcat.websocket.WsFrameBase.processDataText(WsFrameBase.java:500) at org.apache .tomcat.web (WsFrameBase.java:131) (org.apache.tomcat.websocket.WsFrameClient.processSocketRead(WsFrameBase.java:131) 73) at org.apache.tomcat.websocket.WsFrameClient.access $ 300(WsFrameClient.java:31) at org.apache.tomcat.websocket.WsFrameClient $ WsFrameClientCompletionHandler.completed(WsFrameClient.java:131) at org.apache .tomcat.websocket.WsFrameClient $ WsFrameClientCompletionHandler.completed(WsFrameClient.java:114) at sun.nio.ch.Invoker.invokeUnchecked(Invoker.java:126) at sun.nio.ch.Invoker $ 2.run(Invoker。 java:218) at 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(スレッド。 java:745)

+0

私はsession.subscribe( "/ user/queue/position-updates"、...)とsession.subscribe( "/ queue/position-updates"、...)を使用していますが、両方とも動作しません。 –

+0

例外: –

+0

Webソケット設定でorg.springframework.messaging.converter.MessageConverterを設定していないようです。 – Reva

答えて

-1

クライアントにStringMessageConverterを追加すると動作します。

WebSocketStompClient stompClient = new WebSocketStompClient(webSocketClient); 
stompClient.setMessageConverter(new StringMessageConverter()); 

しかし、独自のMessageConverterをカスタマイズするにはどうすればよいですか?記事はありますか?

+0

これは機能しません。それは適切なコンバータは言いません。 – Sanjeev

0

Webソケット設定でorg.springframework.messaging.converter.MessageConverterを設定していないようです。 クラスパスにjackson jarがある場合、自動的にjson変換のためにピックアップされます。他のコンバータの場合は、WebSocket Configファイルで設定する必要があります。

@Configuration 
@EnableWebSocketMessageBroker 
@ComponentScan(SpringScanPackageNames) 
    public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { 
@Override 
public boolean configureMessageConverters(List<MessageConverter> arg0) { 

    StringMessageConverter strConvertor = new StringMessageConverter(); 
    arg0.add(strConvertor); 
    return true; 
} 
// Other config 
関連する問題