0


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><metahttp-equiv="Content-Type"content="text/html; charset=UTF-8"></head><body><divid="main"style="width: 200px;height: 200px;background-color: antiquewhite;"><divid="message"></div></div></body><scriptsrc="./js/jquery.js"></script><!-- stomp协议的客户端脚本 --><scriptsrc="./js/stomp.js"></script><!-- SockJS的客户端脚本 --><scriptsrc="./js/sockjs.js"></script><scripttype="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 =newWebSocket('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秒以内.
   */// 定义连接成功回调函数varon_connect=function(x){//data.body是接收到的数据
        client.subscribe("/topic/E.WebAPI.ImageIsTakeV2.#",function(data){var msg = data.body;
            console.log("收到数据:"+ msg);//$("#message").append("收到数据:" + msg);});};// 定义错误时回调函数varon_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>

本文转载自: https://blog.csdn.net/phker/article/details/127553627
版权归原作者 走错路的程序员 所有, 如有侵权,请联系我们删除。

“Rabbitmq WebSocket 自动断开问题的解决方案”的评论:

还没有评论