Rabbitmq WebSocket 自动断开问题的解决方案

关于报错,Whoops! Lost connection to ws://XXX.XXX.XXX.XXX:15684/ws
在玩rabbitMQ时候,用stompJS从web连接ranbbitMQ时,报了标题的错误消息!

我把我这个html页面代码贴上

最主要的是这两个参数

	client.heartbeat.outgoing = 8000; // 毫秒
	client.heartbeat.incoming = 8000;// 毫秒

这两个参数, 填0是不行的, 0代表永不发送心跳包. Rabbitmq服务需要心跳包来维持正常状态.

填的数值太大也不行. 发送时间太长,导致服务器端认为连接已断开. 服务器端会主动断开连接 .
所以正确方式是在, 服务器主动断开之前发送一个心跳包. 这个时间不要超过服务器默认的自动断开连接时长. 服务器默认好像是10秒断开. 可以自己用秒表测试一下.

<html>  
    <head>  
        <title>WebSocket</title>  
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
    </head>  
    <body>  
    <div id="main" style="width: 200px;height: 200px;background-color: antiquewhite;">
        <div id="message"></div>  
    </div>  
    </body> 
	<script src="./js/jquery.js"></script>
	<!-- stomp协议的客户端脚本 -->
	<script src="./js/stomp.js"></script>
	<!-- SockJS的客户端脚本 -->
	<script src="./js/sockjs.js"></script>	
    <script type="text/javascript">
	
	/**
	/queue/queuename:使用默认转发器订阅/发布消息,默认由stomp自动创建一个持久化队列 

	/amq/queue/queuename:与/queue/queuename的区别在于队列不由stomp自动进行创建,队列不存在失败 

	/topic/routing_key:通过amq.topic转发器订阅/发布消息,订阅时默认创建一个临时队列,通过routing_key与topic进行绑定 

	/temp-queue/xxx:创建一个临时队列(只能在headers中的属性reply-to中使用),可用于发送消息后通过临时队列接收回复消息,接收通过client.onreceive 

	/exchange/exchangename/[routing_key]:通过转发器订阅/发布消息,转发器需要手动创建 

	client.subscribe(destination,callback,headers) :订阅消息 

	client.send(destination,headers,body):发布消息 

	client.unsubscribe(id):取消订阅,id为订阅时返回的编号 

	client.onreceive:默认接收回调从临时队列获取消息 
	
	*/

	
	
	var ws = new WebSocket('ws://192.168.1.123:15674/ws');
	// 获得Stomp client对象
	var client = Stomp.over(ws);

	// SockJS does not support heart-beat: disable heart-beats
	client.heartbeat.outgoing = 8000;
	client.heartbeat.incoming = 8000;
	/*如果
	client.heartbeat.outgoing = 2000;
	client.heartbeat.incoming = 2000;
    设置的太大, 会因为websocket本身的超时时间而自动关闭, 所以这里建议设置的不要太长. 最好是10秒以内.
   */

	// 定义连接成功回调函数
	var on_connect = function(x) {
      
      
		//data.body是接收到的数据
		client.subscribe("/topic/E.WebAPI.ImageIsTakeV2.#", function(data) {
      
      
			var msg = data.body;
			console.log("收到数据:"+ msg);
			//$("#message").append("收到数据:" + msg);
		});
	};

	// 定义错误时回调函数
	var on_error =  function() {
      
        
		console.log('error');
	};

	// 连接RabbitMQ
	client.connect('root', '123455', on_connect, on_error, '/');

	ws.onclose = function(e)
	{
      
        
		console.log(e); 
	}

	console.log(">>>连接上http://192.168.1.123:15674");
	/*

	setInterval(function(){ 
		console.log("ws发送心跳");
		ws.send('\r\n');//防止websocket自动close
	},2000)
	*/
	</script>  
 </html>  

猜你喜欢

转载自blog.csdn.net/phker/article/details/127553627