C# 总线启动失败时RabbitMQ通道泄漏

C# 总线启动失败时RabbitMQ通道泄漏,c#,rabbitmq,masstransit,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 Ma

我对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();
    }
  }
}
使用系统;
使用系统线程;
使用大众运输;
命名空间TestSubscriber
{
班级计划
{
静态void Main()
{
IBusControl总线控制=空;
var故障计数=0;
var BusNotInitialized=真;
//在该循环的几个迭代中保持RabbitMQ关闭,然后将其打开。
while(未初始化)
{
busControl=Bus.Factory.CreateUsingRabbitMq(sbc=>
{
var host=sbc.host(新Uri(“rabbitmq://localhost/,h=>
{
h、 用户名(“客人”);
h、 密码(“客人”);
});
sbc.ReceiveEndpoint(主机,“一些队列”,端点=>
{
Handler(异步上下文=>
{
wait Console.Out.WriteLineAsync($“Received:{context.Message}”);
});
});
});
尝试
{
busControl.Start();
BusNotInitialized=false;
}
捕获(例外)
{
WriteLine($“尝试:{++failCount}失败。”);
//等一会儿
睡眠(5000);
}
}
//此时,使用RabbitMq的管理网页,您将看到failCount+1通道。
busControl.Stop();
//此时,使用RabbitMq的管理网页,您将看到failCount通道。
Console.ReadLine();
}
}
}
它不断尝试创建使用RabbitMQ的服务总线。 一旦服务总线成功创建,程序就会中断循环。 在运行程序几分钟(使用停止的RabbitMQ)并在断点上停止之后,我可以看到很多工作线程(每个失败的服务总线创建尝试对应一个)。 启动RabbitMQ后,所有这些“悬空”连接线程都将连接到RabbitMQ

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

这里的问题是,这些挂起的线程在连接时会从队列中读取数据,从而导致数据丢失


有什么办法可以解决这个问题吗?

RabbitMQ是现有基础设施中最可靠的一部分。多年来,我们一直在生产中的单个节点上运行它,每天处理数百万条消息。你想解决什么问题?@AlexeyZimarev,我们在Masstransit行为方面的问题,而不是RabbitMq。inI如果在启动服务总线期间出现连接问题(例如),我们的应用程序将重试。如果启动成功,则会有额外的开放通道(从启动失败的try开始),该通道从队列读取数据,但无法处理数据。我们无法从应用程序关闭此频道。这就是我们的问题。对我来说,这似乎是在解决不存在的问题。但这只是我自己使用RabbitMQ运行MT服务的拙劣经验,多年来消耗了数百万条消息。RabbitMQ是现有基础设施中最可靠的一部分。多年来,我们一直在生产中的单个节点上运行它,每天处理数百万条消息。你想解决什么问题?@AlexeyZimarev,我们在Masstransit行为方面的问题,而不是RabbitMq。inI如果在启动服务总线期间出现连接问题(例如),我们的应用程序将重试。如果启动成功,则会有额外的开放通道(从启动失败的try开始),该通道从队列读取数据,但无法处理数据。我们无法从应用程序关闭此频道。这就是我们的问题。对我来说,这似乎是在解决不存在的问题。但这只是我自己使用RabbitMQ运行MT服务的拙劣经验,多年来消耗了数百万条消息。