Search code examples
masstransit

Masstransit: GetSendEndpoint


I have a producer, which send more than 1000 messages in a minute to a specific endpoint. I’m using Microsoft DI and I’ve configured the send Endpoint as described here https://masstransit-project.com/usage/producers.html#send .

   // Masstransit setup
    serviceCollection.AddMassTransit(mt =>
    {
        mt.UsingAzureServiceBus((ctx, cfg) =>
        {
            cfg.Host(massTransitSettings.TestServiceBusConnectionString);
            cfg.ReceiveEndpoint("mytestmessage", e =>
            {
                e.MaxDeliveryCount = 3; //How many times the transport will redeliver the message on negative acknowledgment
            });
        });
    });
    serviceCollection.AddTransient<ITestMessageProducer, TestMessageProducer>();

  // Producer setup
    public class TestMessageProducer : ITestMessageProducer
    {
        private readonly ISendEndpointProvider _testEndpoint;

        public TestMessageProducer(ISendEndpointProvider testEndpoint)
        {
            _testEndpoint = testEndpoint;
        }

        public async Task SendTestMessage(ITestMessage testmessage)
        {
            var endpoint = await _testEndpoint.GetSendEndpoint(new Uri("queue:mytestmessage"));
            await endpoint.Send(testmessage);
        }
    }

Query:

  • The SendTestMessage function has been called very frequently as mention above. Will it be ok to call “GetSendEndpoint” everytime? I have read somewhere that GetSendEndpoint creates a new instance of ISendEndpoint everytime.

  • Will the MaxDeliveryCount still be worked on my sendendpoint?

Thank you.


Solution

    1. Send endpoints are cached by address, only a single instance will be created.
    2. MaxDeliveryCount is a receive endpoint concern, but you should not configure a receive endpoint without consumers as all messages will be moved to the _skipped queue.