• 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;// 毫秒
    
    • 1
    • 2

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

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

    <html>  
        <head>  
            <title>WebSockettitle>  
            <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>
    	
    	<script src="./js/stomp.js">script>
    	
    	<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>  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
  • 相关阅读:
    CVE-2020-36189 jackson-databind java反序列化漏洞
    微服务项目:尚融宝(17)(后端搭建:数据字典)
    9月《中国数据库行业分析报告》已发布,47页干货带你详览 MySQL 崛起之路!
    ShardingSphere-Proxy基本使用
    计算机毕业设计Python+django网上咖啡商城(源码+系统+mysql数据库+Lw文档)
    【数据结构与算法】常见排序算法(Sorting Algorithm)
    CSS优先级
    数据结构 - 数组 - 青岛大学(王卓)
    string类详解
    数据可视化:理论与技术
  • 原文地址:https://blog.csdn.net/phker/article/details/127553627