Spring4.3.3 WebSocket-STOMP協議整合 (2.1)-WebSocket-stomp子協議通訊小栗子
阿新 • • 發佈:2019-01-31
上一篇中說到:stomp - jsp之間的通訊,是通過stomp,socket.js/stomp.js實現的通訊。如果覺得寫jsp或者js麻煩,或者不怎麼會js,不是太懂,可以用webSocketStomp的client來測試。下面看程式碼:
pom.xml依賴:
<!-- stompclient test--> <dependency> <groupId>org.glassfish.tyrus.bundles</groupId> <artifactId>tyrus-standalone-client</artifactId> <version>1.13</version> </dependency>
JunitTest方法如下:具體和WebSocket的junit相似,不多解釋了,老衲告退....
/** * 連線js endpoint端點 * @throws ExecutionException * @throws InterruptedException */ // @Test public void testSocketJsEndpoint() throws InterruptedException, ExecutionException { //js url String jsUrl = "ws://localhost:18080/JeeSite/hello"; //for js endpoint wrap List<Transport> transports = Lists.newArrayList(); transports.add(new WebSocketTransport(new StandardWebSocketClient())); WebSocketClient transport = new SockJsClient(transports); //js endpoint end WebSocketStompClient stompClient = new WebSocketStompClient(transport); stompClient.setMessageConverter(new StringMessageConverter()); //stompsession 使用必須配置Receiptable ThreadPoolTaskScheduler task = new ThreadPoolTaskScheduler(); task.initialize(); stompClient.setTaskScheduler(task); StompSessionHandler sessionHandler = new MyStompSessionHandler(); ListenableFuture<StompSession> ret = stompClient.connect(jsUrl, sessionHandler); ret.addCallback(new ListenableFutureCallback<StompSession>() { @Override public void onSuccess(StompSession session) { session.subscribe("/app/subscribeme", new StompFrameHandler() { @Override public void handleFrame(StompHeaders headers, Object payload) { System.out.println(payload); } @Override public Type getPayloadType(StompHeaders headers) { return String.class; } }); session.subscribe("/topic/hi", new StompFrameHandler() { @Override public void handleFrame(StompHeaders headers, Object payload) { System.out.println("subscribe message : "); System.out.println(payload); } @Override public Type getPayloadType(StompHeaders headers) { return Object.class; } }); } @Override public void onFailure(Throwable ex) { ex.printStackTrace(); } }); StompSession sess = ret.get(); //跟蹤傳送訊息返回狀態,必須啟用該項 sess.setAutoReceipt(true); Receiptable recpt = sess.send("/app/hi", "i'm js monkey stanthem."); recpt.addReceiptTask(new Runnable() { @Override public void run() { System.out.println("js endpoint send msg success."); } }); } /** * java stomp client 連線client 端點。 * @throws InterruptedException * @throws ExecutionException */ // @Test public void testStompClientEndpoint() throws InterruptedException, ExecutionException { String clientUrl = "ws://localhost:18080/JeeSite/client"; WebSocketClient client = new StandardWebSocketClient(); WebSocketStompClient stompClient = new WebSocketStompClient(client); stompClient.setMessageConverter(new StringMessageConverter()); stompClient.setReceiptTimeLimit(300); //配置心跳頻率,預設就是下面這個間隔 stompClient.setDefaultHeartbeat(new long[]{10000l,10000l}); //stompsession 使用必須配置Receiptable, taskScheduler作用是 //Configure a scheduler to use for heartbeats and for receipt tracking. //為配置心跳頻率和跟蹤傳送狀態 準備的執行緒池 ThreadPoolTaskScheduler task = new ThreadPoolTaskScheduler(); task.initialize(); stompClient.setTaskScheduler(task); StompSessionHandler sessionHandler = new MyStompSessionHandler(); ListenableFuture<StompSession> ret = stompClient.connect(clientUrl, sessionHandler); ret.addCallback(new ListenableFutureCallback<StompSession>() { @Override public void onSuccess(StompSession session) { session.subscribe("/app/subscribeme", new StompFrameHandler() { @Override public void handleFrame(StompHeaders headers, Object payload) { System.out.println("subscribe message : "); System.out.println(payload); } @Override public Type getPayloadType(StompHeaders headers) { return String.class; } }); session.subscribe("/topic/hi", new StompFrameHandler() { @Override public void handleFrame(StompHeaders headers, Object payload) { System.out.println(payload); } @Override public Type getPayloadType(StompHeaders headers) { return Object.class; } }); } @Override public void onFailure(Throwable ex) { ex.printStackTrace(); } }); StompSession sess = ret.get(); //跟蹤傳送訊息返回狀態,必須啟用該項 sess.setAutoReceipt(true); //發一個訊息 Receiptable recpt = sess.send("/app/hi", "i'm java stomp client monkey stanthem."); recpt.addReceiptTask(new Runnable() { @Override public void run() { System.out.println("java client endpoint send msg success."); } }); }
class MyStompSessionHandler extends StompSessionHandlerAdapter { @Override public void afterConnected(StompSession session, StompHeaders connectedHeaders) { Map<String, String> headers = connectedHeaders.toSingleValueMap(); for (Entry<String, String> kv : headers.entrySet()) { System.out.println(kv.getKey() + " - " + kv.getValue()); } System.out.println("connected session : "+session.getSessionId()); } }