0
votes

Please don't ask why, I'm doing what I'm told. I am sending a Message from Azure Service bus. I am looking to consume this message using Mass Transit. I am am able to consume messages from Mass Transit using Azure Service Bus but not the other way around. I am able to send and receive message using Mass Transit only easily but not from Azure Service Bus to Mass Transit. Does anyone know how I can achive this?

Here is my implementation:

Azure Service Bus Send Message:

  queueClient = new QueueClient("Endpoint=sb:", AzureQueueName);

    var murrr = new MainMessage()
                        {
                            ConsignmentReference = DateTime.Now.Ticks.ToString(),
                            CustomerId = "MOOOOOOOOOOOOOOOOOO",
                            OtherProperty = 123,
                            WantMeToFail = false,

                        };

                        var json = JsonConvert.SerializeObject(murrr);
                        var message2 = new Message(Encoding.UTF8.GetBytes(json));


                        // Send the message to the queue
                        await queueClient.SendAsync(message2);

In Mass Transit to consume the message:

  var bus = CreateAzureBus(ConfigurationManager.AppSettings["AzureQueueName"], ConfigurationManager.AppSettings["AzureNamespace"], ConfigurationManager.AppSettings["AzureKey"], ConfigurationManager.AppSettings["AzureKeyName"], configurator =>
            {
                configurator.Subscribe(s =>
                {
                    s.Consumer<Consumer>().Permanent();
                    s.Consumer<RetryConsumer>().Permanent();
                    s.Consumer<SBConsumer>().Permanent();  

                });

                configurator.SetCreateMissingQueues(true);
            });


    private static IServiceBus CreateAzureBus(string azureQueueName, string azureNamespace, string azureKey,
            string azureKeyName, Action<ServiceBusConfigurator> config = null)
        {
            var queueUrl = $"azure-sb://{azureNamespace}/{azureQueueName}";
            return ServiceBusFactory.New(x =>
            {
                x.UseAzureServiceBus(r => r.ConfigureNamespace(azureNamespace, h =>
                {
                    h.SetKey(azureKey);
                    h.SetKeyName(azureKeyName);
                }));

                x.ReceiveFrom(queueUrl);
                x.UseJsonSerializer();

                x.UseAzureServiceBusRouting();
                x.SetCreateMissingQueues(true);

                config?.Invoke(x);
            });
        }

This is the consumer that I am looking to consume the message, I have tried the object I am using and the Azure Service Bus Object Message

 public class SBConsumer : Consumes<Message>.All
    {
        public void Consume(Message message)
        {
            AzureProcessor.DoSomethingWithOurMessage(message);
        }
    }

I've also tried this one:

 public class Consumer : Consumes<MainMessage>.All
    {
        public void Consume(MainMessage message)
        {
            Processor.DoSomethingWithOurMessage(message, 0);
        }

    }
1

1 Answers

1
votes

MassTransit has a specific message format, which is required by the message deserializer.

http://masstransit-project.com/MassTransit/advanced/interoperability.html

If you want to consume an arbitrary message, you'd need to write your own deserializer.