Я использую MassTransit вместе с пакетами RabbitMQ.Client NuGet для публикации сообщений в своей очереди RabbitMQ. Это отлично работает уже несколько месяцев. Внезапно (без изменений кода) я больше не могу создавать ServiceBus. Вот код, который я использовал в течение нескольких месяцев:
public class RabbitBus
{
private IServiceBus bus;
public void Start(Action<ServiceBusConfigurator> moreInitialization)
{
const string host = "rabbitmq://localhost/testqueue";
bus = ServiceBusFactory.New(x =>
{
x.UseRabbitMq(r =>
{
r.ConfigureHost(new Uri("rabbitmq://localhost/testqueue"), h =>
{
h.SetUsername("user");
h.SetPassword("password");
});
});
x.ReceiveFrom(host);
moreInitialization(x);
});
}
public void Stop()
{
bus.Dispose();
}
public void Publish<T>(T message)
{
bus.Publish(message, x => { x.SetDeliveryMode(DeliveryMode.Persistent); });
}
}
И тогда я бы опубликовал такое сообщение:
var bus = new RabbitBus();
bus.Start((x) => {});
bus.Publish("Test");
bus.Stop();
Как я уже сказал, этот код прекрасно работал несколько месяцев. Буквально вчера я начал получать System.TypeInitializationException при создании моей ServiceBus с помощью вызова ServiceBusFactory.New
.
Произошло необработанное исключение типа «System.TypeInitializationException» в MassTransit.dll.
Дополнительная информация. Инициализатор типа MassTransit.Monitoring.ServiceBusPerformanceCounters вызвал исключение.
Попытка чтения или записи защищенной памяти. Это часто указывает на то, что другая память повреждена.
Вот трассировка стека:
- at Microsoft.Win32.Win32Native.RegQueryValueEx(SafeRegistryHandle hKey, String lpValueName, Int32[] lpReserved, Int32& lpType, Byte[] lpData, Int32& lpcbData)
- at Microsoft.Win32.RegistryKey.InternalGetValue(String name, Object defaultValue, Boolean doNotExpand, Boolean checkSecurity)
- в Microsoft.Win32.RegistryKey.GetValue (имя строки)
- в System.Diagnostics.PerformanceMonitor.GetData (строковый элемент)
- в System.Diagnostics.PerformanceCounterLib.GetPerformanceData (строковый элемент)
- в System.Diagnostics.PerformanceCounterLib.get_CategoryTable()
- в System.Diagnostics.PerformanceCounterLib.CounterExists (категория строк, счетчик строк, логическое значение и категория существует)
- в System.Diagnostics.PerformanceCounterLib.CounterExists (машина String, категория String, счетчик String)
- в System.Diagnostics.PerformanceCounterCategory.CounterExists (String counterName, String categoryName, String machineName)
- в System.Diagnostics.PerformanceCounterCategory.CounterExists(String counterName, String categoryName)
- в MassTransit.Monitoring.ServiceBusPerformanceCounters.b__1(счетчик RuntimePerformanceCounter) в d:\BuildAgent\work\aa063b4295dfc097\src\MassTransit\Monitoring\ServiceBusPerformanceCounters.cs:строка 151
- в System.Linq.Enumerable.WhereArrayIterator`1.MoveNext()
- в System.Linq.Enumerable.Count[TSource](источник IEnumerable`1)
- в MassTransit.Monitoring.ServiceBusPerformanceCounters.InitiatizeCategory() в d:\BuildAgent\work\aa063b4295dfc097\src\MassTransit\Monitoring\ServiceBusPerformanceCounters.cs:строка 150
- в MassTransit.Monitoring.ServiceBusPerformanceCounters..ctor() в d:\BuildAgent\work\aa063b4295dfc097\src\MassTransit\Monitoring\ServiceBusPerformanceCounters.cs:строка 91
- в MassTransit.Monitoring.ServiceBusPerformanceCounters..cctor() в d:\BuildAgent\work\aa063b4295dfc097\src\MassTransit\Monitoring\ServiceBusPerformanceCounters.cs:строка 30
Я часами копался в StackOverflow и других сайтах, но так и не продвинулся. Если у кого есть понимание, буду рад помощи. Спасибо!