Java 实现Stomp WebSocket 接收

1、StompClient.java 类

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

import org.springframework.messaging.converter.StringMessageConverter;
import org.springframework.messaging.simp.stomp.StompSessionHandler;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.web.socket.client.WebSocketClient;
import org.springframework.web.socket.client.standard.StandardWebSocketClient;
import org.springframework.web.socket.messaging.WebSocketStompClient;
import org.springframework.web.socket.sockjs.client.SockJsClient;
import org.springframework.web.socket.sockjs.client.Transport;
import org.springframework.web.socket.sockjs.client.WebSocketTransport;

import com.xxxx.xxxx.util.ConfigUtils;

 /**
 * StompClient
 * [@author](https://my.oschina.net/arthor) shuidao
 * [@date](https://my.oschina.net/u/2504391) 2018年4月19日下午6:57:41
 */  
public class StompClient {
	 public static void main(String[] args) {  
	        final CountDownLatch latch = new CountDownLatch(1);  
	        List<Transport> transports = new ArrayList<>(1);  
	        transports.add(new WebSocketTransport(new StandardWebSocketClient()));  
	        WebSocketClient transport = new SockJsClient(transports);  
	        WebSocketStompClient stompClient = new WebSocketStompClient(transport);  
	        stompClient.setMessageConverter(new StringMessageConverter());
	        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();  
	        taskScheduler.afterPropertiesSet();  
	        //for heartbeats 
	        stompClient.setTaskScheduler(taskScheduler);  
		    String url = ConfigUtils.getProp("rtls.websocket.url");
	        StompSessionHandler customHandler = new CustomStompSessionHandler(latch);  
	        stompClient.connect(url, customHandler);  
	        try {  
	            latch.await(31536000, TimeUnit.SECONDS); 
	            //latch.await(3, TimeUnit.SECONDS);  
	        }  
	        catch (InterruptedException e) {  
	            e.printStackTrace();  
	        }  
	    }  
}
2、CustomStompSessionHandler.java 类

import java.lang.reflect.Type;
import java.util.Map;
import java.util.concurrent.CountDownLatch;

import org.springframework.messaging.simp.stomp.StompCommand;
import org.springframework.messaging.simp.stomp.StompFrameHandler;
import org.springframework.messaging.simp.stomp.StompHeaders;
import org.springframework.messaging.simp.stomp.StompSession;
import org.springframework.messaging.simp.stomp.StompSessionHandlerAdapter;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import com.xxxx.xxxx.util.ConfigUtils;
/**
* StompSession Handler
* [@author](https://my.oschina.net/arthor) shuidao
* [@date](https://my.oschina.net/u/2504391) 2018年4月20日上午8:40:23
*/
public class CustomStompSessionHandler extends StompSessionHandlerAdapter{
	private CountDownLatch latch;

	public CustomStompSessionHandler(CountDownLatch latch) {
		this.latch = latch;
	}

	[@Override](https://my.oschina.net/u/1162528)
	public void afterConnected(final StompSession session, StompHeaders connectedHeaders) {
		System.out.println("StompHeaders: " + connectedHeaders.toString());
		String destination = ConfigUtils.getProp("rtls.websocket.subscribes");
		session.subscribe(destination, new StompFrameHandler() {
			@Override
			public Type getPayloadType(StompHeaders headers) {
				return String.class;
			}
			@Override
			public void handleFrame(StompHeaders headers, Object payload) {
				JSONObject receiveData = JSON.parseObject(payload.toString());
				Map<String,Object> dataMap = Maps.newHashMap();
				Map<String,Object> sendMap = Maps.newHashMap();
				dataMap.put("x", receiveData.get("localX"));
				dataMap.put("y", receiveData.get("localY"));
				dataMap.put("z", receiveData.get("localZ"));
				sendMap.put("id", receiveData.get("tagEuid"));
				sendMap.put("data",dataMap);
				JSONObject sendData = JSONObject.parseObject(JSON.toJSONString(sendMap));
				System.out.println(sendData.toJSONString());
				//关闭通道断开连接
				//latch.countDown();	
				//session.disconnect();
			}
		}); 
	}

	@Override
	public void handleException(StompSession session, StompCommand command, StompHeaders headers, byte[] payload,
			Throwable exception) {
		    System.out.println(exception.getMessage());
	}

	@Override
	public void handleTransportError(StompSession session, Throwable exception) {
		  System.out.println("transport error.");
	}
}
3、ConfigUtils.java

package com.xxxx.xxxx.util;
import com.sinfotek.xxxx.xxxx.Prop;
import com.sinfotek.xxxx.xxxx.PropKit;

/**
* 加载配置文件
* @author shuidao
* @date 2018年4月20日下午1:50:17
*/
public class ConfigUtils {
   //初始化配置文件
   private static Prop prop = PropKit.use("config.properties");
   /**
    * 根据配置文件的键返回对应值
    * @param key
    * @return
    */
   public static String getProp(String key){
	   return prop.get(key);
   }
}
4、config.properties

#websocket setting start
rtls.websocket.url= http://127.0.0.1:8080/websocketDemo/sockjs
rtls.websocket.subscribes=/queue/position
5、pom.xml

<!-- websocket client receive start -->
	<dependency>  
            <groupId>org.springframework</groupId>  
            <artifactId>spring-websocket</artifactId>  
            <version>${spring.version}</version>  
        </dependency> 
        <dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-messaging</artifactId>
		<version>${spring.version}</version>
	</dependency>
       <dependency>  
            <groupId>org.webjars</groupId>  
            <artifactId>stomp-websocket</artifactId>  
            <version>2.3.3</version>  
       </dependency>
       <dependency>
	   <groupId>org.glassfish.tyrus.bundles</groupId>
	    <artifactId>tyrus-standalone-client</artifactId>
	    <version>1.3</version>
	</dependency>
	<dependency>  
            <groupId>org.webjars</groupId>  
            <artifactId>sockjs-client</artifactId>  
            <version>1.0.2</version>  
        </dependency>  
        <!-- websocket client receive end -->

转载于:https://my.oschina.net/zhxwang/blog/1808093

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值