总线未能启动时RabbitMQ通道泄漏

时间:2017-07-08 08:23:08

标签: c# rabbitmq masstransit

我遇到MassTransit问题(使用MassTransit 3.5.7(通过Nuget),RabbitMQ 3.6.10,Erlang 19.0)

当总线无法启动时,看起来MassTransit没有清除RabbitMQ通道。

这是我的测试程序

using System;
using System.Threading;
using MassTransit;

namespace TestSubscriber
{
  class Program
  {
        static void Main()
        {
            IBusControl busControl = null;
            var failCount = 0;
            var busNotInitialised = true;

            //Keep RabbitMQ switched off for a few iterations of this loop, then switch it on.
            while (busNotInitialised)
            {
                busControl = Bus.Factory.CreateUsingRabbitMq(sbc =>
                {
                    var host = sbc.Host(new Uri("rabbitmq://localhost/"), h =>
                    {
                        h.Username("guest");
                        h.Password("guest");
                    });

                    sbc.ReceiveEndpoint(host, "some_queue", endpoint =>
                    {
                        endpoint.Handler<string>(async context =>
                        {
                            await Console.Out.WriteLineAsync($"Received: {context.Message}");
                        });
                    });
                });

                try
                {
                    busControl.Start();
                    busNotInitialised = false;            
                }
                catch (Exception)
                {
                    Console.WriteLine($"Attempt:{++failCount} failed.");

                    //wait some time
                    Thread.Sleep(5000);
                }
            }

            //At this point, using RabbitMq's management web page, you will see failCount + 1 channels.
            busControl.Stop();
            //At this point, using RabbitMq's management web page, you will see failCount channels.

            Console.ReadLine();
    }
  }
}

它不断尝试创建一个使用RabbitMQ的服务总线。 一旦成功创建服务总线,程序就会跳出循环。 运行程序几分钟(停止RabbitMQ)并在断点处停止后,我可以看到很多工作线程(每个失败的服务总线创建尝试一个)。 在启动RabbitMQ之后,所有这些&#34;悬挂&#34; connect threads将连接到RabbitMQ。

如果我尝试关闭总线,则会关闭最新的连接(属于成功创建的总线)。所有其他悬空连接仍然连接到RabbitMQ。

这里的问题是那些悬空线程在连接时从队列中读取数据会导致数据丢失。

有没有办法解决这个问题?

0 个答案:

没有答案