RabbitMq Server is giving me the message "missed heartbeats from client"

2.2k Views Asked by At

The RabbitMQ Server is giving me the message: Missed heartbeats from client. I know this message occour when the cliente stop sending the heartbeat to server, then RabbitMq server close the connection. The problem is that I'm using RabbitMq in localhost, so I think it isn't about network blocking. My client uses the EasyNetQ(.Net 4.6.1 / Component Version: 6.3.1) component and it should had handled this heartbeat by itself.

Why the client wouldn't send the heartbeat even I'm using RabbitMq in localhost?

Bellow an example from my code:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using EasyNetQ;
using EasyNetQ.Topology;
using InteraxaFramework.Genesys.Common;
using log4net;


namespace Bridge.Genesys.Services
{
    public class RabbitProducer
    {
        private string _hostName;
        private int _port;
        private string _userName;
        private string _password;
        private IConnection _connection;
        private IModel _channel;
        private int _timeout;
        private IBus bus;
        private MessageProperties _msgProperties;
        private Dictionary<string, Exchange> _exchages;

        public RabbitProducer(string hostName, int port, string userName, string password, int timeout = 60)
        {
            _hostName = hostName;
            _port = port;
            _userName = userName;
            _password = password;
            _timeout = timeout;
            createConnection();
            _msgProperties = new MessageProperties();
            _exchages = new Dictionary<string, Exchange>();
        }

        private Exchange GetExchange(string exchange)
        {
            if (!_exchages.ContainsKey(exchange))
            {
                _exchages[exchange] = new Exchange(exchange);
            }

            return _exchages[exchange];
        }

        private void createConnection()
        {

            if (bus == null)
            {
                bus = RabbitHutch.CreateBus($"host={_hostName}:{_port};username={_userName};password={_password};timeout={_timeout}");
            }
        }

        public async Task PublishExchangeAsync(string exchange, byte[] body)
        {

            await bus.Advanced.PublishAsync(
                    GetExchange(exchange),
                    string.Empty,
                    false,
                   _msgProperties,
                   body);

        }

        public void Disconnect()
        {
            if (_exchages != null)
            {
                _exchages.Clear();
            }

            if (bus != null)
            {
                bus.Dispose();
            }
        }
    }
}

Other parts of my code uses this class as singleton. The program is a windows service that keeps always running and uses just one connection and one channel during the service lifetime.

The creation of singleton object:

this.rabbitProducer = new RabbitProducer("localhost", 5672, "guest", "guest", 60);

The utilization of the publisher:

var bf = new BinaryFormatter();
using (var ms = new MemoryStream())
{
   bf.Serialize(ms, JsonObj);
   var bytes = ms.ToArray();
   var bodyBytes = bytes;
   await rabbitProducer.PublishExchangeAsync(queueName, bodyBytes);
}
0

There are 0 best solutions below