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

博客讲述使用stompJS从web连接RabbitMQ时出现连接丢失报错。指出连接时设置心跳包参数很关键,填0或数值太大都不行,应在服务器主动断开前发送心跳包,且时间不超服务器默认自动断开时长,默认约10秒。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于报错,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>  
回答: WebSocket+RabbitMQ是一种在Java中使用WebSocketRabbitMQ进行通信的方法。WebSocket是一种在客户端和服务器之间进行双向通信的协议,而RabbitMQ是一个消息队列中间件,用于在应用程序之间传递消息。通过结合WebSocketRabbitMQ,可以实现实时的消息传递和通信。在Java中实现WebSocket+RabbitMQ,可以使用javax.websocket.server.ServerEndpoint注解来创建WebSocket服务器端,使用ConcurrentHashMap来管理连接对象,同时结合WebSocket的心跳机制来保持连接的稳定性。具体的实现可以参考引用\[1\]和引用\[2\]中的代码示例。同时,需要注意的是,如果在10分钟之内没有数据交互,WebSocket连接会自动断开,因此可以结合WebSocket的心跳激活机制来解决这个问题,具体方法可以参考引用\[3\]中的说明。 #### 引用[.reference_title] - *1* [SpringBoot集成websocket+Rabbitmq实现前端订阅mq消息](https://blog.youkuaiyun.com/weixin_43539126/article/details/123994227)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [springboot+webSocket+rabbitmq集群](https://blog.youkuaiyun.com/ke7025/article/details/109544839)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [WebSocket+RabbitMQ实现消息推送系统](https://blog.youkuaiyun.com/优快云2497242041/article/details/120359947)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值