JAVA调用mq时做心跳检测_RabbitMQ心跳检测与掉线重连

usingRabbitMQ.Client;usingRabbitMQ.Client.Events;usingSystem;usingSystem.Collections.Generic;usingSystem.IO;usingSystem.Linq;usingSystem.Text;usingSystem.Threading;usingSystem.Threading.Tasks;usingRabbitMQ.Client.Exceptions;namespaceMQ_Receive

{///

///RabbitMq消息监听器///

public classRabbitMqListener

{privateConnectionFactory _factory;privateIConnection _con;privateIModel _channel;privateEventingBasicConsumer _consumer;private readonly string_rabbitMqUri;private readonly string_exchangeType;private readonly string_exchangeName;private readonly string_queueName;private readonly string_routeKey;private Func_messageHandler;///

///RabbitMQ消息监听器,若指定的队列不存在,则自动创建队列。并在消息交换机上绑定指定的消息路由规则(路由key)///

/// 连接串,如 amqp://guest:guest@localhost:5672/

/// 消息交换机

/// 交换机类型,如 ExchangeType.Direct

/// 要监听的队列

/// 消息路由key

public RabbitMqListener(string rabbitMqUri, string exchangeName, string exchangeType, string queueName, string routeKey = "")

{this._rabbitMqUri =rabbitMqUri;this._exchangeName =exchangeName;this._exchangeType =exchangeType;this._queueName =queueName;this._routeKey =routeKey;

}///

///创建连接///

private voidCreateConnection()

{

_factory= newConnectionFactory

{

Uri= newUri(_rabbitMqUri),

RequestedHeartbeat= 20,

AutomaticRecoveryEnabled= true,

TopologyRecoveryEnabled= true,

NetworkRecoveryInterval= TimeSpan.FromSeconds(10)

};

_con=_factory.CreateConnection();

_con.ConnectionShutdown+= (_sender, _e) => ReMessageListen();//掉线重新连接并监听队列消息

}///

///创建信道///

private voidCreateChannel()

{

_channel=_con.CreateModel();

_channel.ExchangeDeclare(_exchangeName, _exchangeType,true, false, null);

_channel.QueueDeclare(_queueName,true, false, false, null); //创建一个消息队列,用来存储消息

_channel.QueueBind(_queueName, _exchangeName, _routeKey, null);

_channel.BasicQos(0, 3, true); //在非自动确认消息的前提下,如果一定数目的消息(通过基于consume或者channel设置Qos的值)未被确认前,不进行消费新的消息

}///

///监听队列消息///

/// 消息处理器,当监测到队列消息时回调该处理器

/// 监听状态

public bool MessageListen(FuncmessageHandler)

{try{this.CreateConnection();this.CreateChannel();

_consumer= new EventingBasicConsumer(_channel); //基于事件的消息推送方式

_consumer.Received += (_sender, _e) =>{string msg =Encoding.UTF8.GetString(_e.Body);if (messageHandler != null)

{this._messageHandler =messageHandler;try{var isOk = this._messageHandler(msg);if(isOk)

{

_channel.BasicAck(_e.DeliveryTag,false);

}

}catch(Exception ex)

{

LoggerManager.ErrorLog.Error("消息处理器执行异常:" +ex.Message, ex);

}

}

};

_channel.BasicConsume(_queueName,false, _consumer); //手动确认

return true;

}catch(Exception ex)

{

LoggerManager.ErrorLog.Error("尝试监听队列消息出现错误:" +ex.Message, ex);

}return false;

}public voidReMessageListen()

{try{//清除连接及频道

CleanupResource();var mres = new ManualResetEventSlim(false); //初始化状态为false

while (!mres.Wait(3000)) //每3秒监测一次状态,直到状态为true

{if(MessageListen(_messageHandler))

{

mres.Set();//设置状态为true并跳出循环

}

}

}catch(Exception ex)

{

LoggerManager.ErrorLog.Error("尝试连接RabbitMQ服务器出现错误:" +ex.Message, ex);

}

}///

///清理资源///

private voidCleanupResource()

{if (_channel != null &&_channel.IsOpen)

{try{

_channel.Close();

}catch(Exception ex)

{

LoggerManager.ErrorLog.Error("尝试关闭RabbitMQ信道遇到错误", ex);

}

_channel= null;

}if (_con != null &&_con.IsOpen)

{try{

_con.Close();

}catch(Exception ex)

{

LoggerManager.ErrorLog.Error("尝试关闭RabbitMQ连接遇到错误", ex);

}

_con= null;

}

}

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RabbitMQ使用心跳机制来检测客户端与服务器之间的连接状态。当客户端与服务器之间的网络连接断开RabbitMQ会通过心跳消息检测到,并且会触发掉线重连的机制。 在 RabbitMQ 中,默认的心跳超间为60秒。当客户端在60秒内没有向服务器发送任何消息,服务器会发送一个心跳消息给客户端,以确认连接是否正常。如果客户端在一定间内没有收到心跳消息,就会认为与服务器之间的连接已经断开,并触发掉线重连操作。 掉线重连的实现可以通过 RabbitMQ 客户端提供的机制来完成。不同的客户端库可能会有不同的具体实现方式,但一般可以通过以下步骤来实现掉线重连: 1. 监听连接状态:通过注册连接状态的回调函数或者事件处理函数,来监听与 RabbitMQ 服务器之间的连接状态变化。 2. 检测到掉线:当连接状态变为断开状态,即可判断为掉线。可以通过捕获异常、检查错误码或者其他方式来确认掉线状态。 3. 重连操作:在掉线后,需要重新建立与 RabbitMQ 服务器的连接。可以根据具体需求选择不同的重连策略,比如指数退避重连、固定间间隔重连等。 4. 恢复消息传递:在重新建立连接后,需要重新订阅队列、重新发送未确认的消息等,以确保消息的可靠传递。 需要注意的是,掉线重连操作可能会对系统的性能产生一定的影响,所以在实际应用中需要根据具体情况权衡是否需要开启掉线重连功能。另外,还应该考虑网络稳定性、服务器负载等因素来优化掉线重连的策略。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值