Прежде всего, извините за мой английский, это очень плохо.Я использую MassTransit с Azure Service Bus для асинхронной связи между микросервисами.По их собственному определению и во избежание генерации зависимостей между ними сообщения, отправляемые между различными микросервисами, определяются в каждом из них, то есть являются частью разных пространств имен.Автоматическое управление MassTransit приводит к тому, что очереди и разделы управляются типом объекта, что предотвращает получение сообщениями, отправленными издателем микросервиса, микросервисам, использующим сообщение.То же самое происходит с двумя классами с одинаковыми свойствами в одном пространстве имен, но с другим именем класса.
Есть ли способ решить эту проблему?У меня возникли следующие варианты:
- Удалить пространство имен из конечной точки адреса назначения, указав в нем только имя класса.
- То, что MassTransit может управлятьсоздание очередей и тем на основе сериализации объекта, а не управления им на основе типа объекта (возможно, с помощью какого-либо объекта обтекания?)
Я оставляю пример, который, я надеюсь, может помочьВы в понимании проблемы.
//FIRST PROGRAM - MESSAGE CONSUMER
namespace Consumer
{
public class Example
{
public string PropOne { get; set; }
public string PropTwo { get; set; }
}
public class ExampleConsumer :
IConsumer<Example>
{
public List<Example> ConsumedTestObjectList { get; } = new List<Example>();
//THIS METHOD NEVER CALL !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
public Task Consume(ConsumeContext<ExampleConsumer> context)
{
ConsumedTestObjectList.Add(context.Message);
return Task.CompletedTask;
}
}
public class ConsumerProgram
{
public static void Main()
{
var bus = Bus.Factory.CreateUsingAzureServiceBus(sbc =>
{
var host = sbc.Host("connectionString", h => {});
});
sbc.ReceiveEndpoint(host, e =>
{
e.Consumer<ConsumerProgram.Example>(context =>
{
return Console.Out.WriteLineAsync($"Message Received: {JsonConvert.SerializeObject(context.Message)}");
});
});
bus.Start(); // This is important!
Console.WriteLine("Press any key to exit");
Console.ReadKey();
bus.Stop();
}
}
}
//SECOND PROGRAM - MESSAGE PUBLISHER
namespace Publisher
{
public class Example
{
public string PropOne { get; set; }
public string PropTwo { get; set; }
}
public class PublisherProgram
{
public static void Main()
{
var bus = Bus.Factory.CreateUsingAzureServiceBus(sbc =>
{
var host = sbc.Host("connectionString", h => {});
});
bus.Start(); // This is important!
//send new instance of Publisher.Example
var example = new Example() { PropOne = "1", PropTwo = "2" };
bus.Publish(example);
Console.WriteLine("Press any key to exit");
Console.ReadKey();
bus.Stop();
}
}
}
Большое спасибо.
С уважением
Борха