/// <summary> /// Creates a consumer for the specified queue. /// </summary> /// <param name="subscription">The queue to connect to</param> /// <returns>IAmAMessageConsumer.</returns> public IAmAMessageConsumer Create(Subscription subscription) { RmqSubscription rmqSubscription = subscription as RmqSubscription; if (rmqSubscription == null) { throw new ConfigurationException("We expect an SQSConnection or SQSConnection<T> as a parameter"); } return(new RmqMessageConsumer( _rmqConnection, rmqSubscription.ChannelName, //RMQ Queue Name rmqSubscription.RoutingKey, rmqSubscription.IsDurable, rmqSubscription.HighAvailability, rmqSubscription.BufferSize, rmqSubscription.DeadLetterChannelName, rmqSubscription.DeadLetterRoutingKey, rmqSubscription.TTL, rmqSubscription.MaxQueueLength, subscription.MakeChannels)); }
public RMQMessageConsumerRetryDLQTests() { Guid correlationId = Guid.NewGuid(); string contentType = "text\\plain"; var channelName = $"Requeue-Limit-Tests-{Guid.NewGuid().ToString()}"; _topicName = $"Requeue-Limit-Tests-{Guid.NewGuid().ToString()}"; var routingKey = new RoutingKey(_topicName); //what do we send var myCommand = new MyDeferredCommand { Value = "Hello Requeue" }; _message = new Message( new MessageHeader(myCommand.Id, _topicName, MessageType.MT_COMMAND, correlationId, "", contentType), new MessageBody(JsonSerializer.Serialize((object)myCommand, JsonSerialisationOptions.Options)) ); var deadLetterQueueName = $"{_message.Header.Topic}.DLQ"; var deadLetterRoutingKey = $"{_message.Header.Topic}.DLQ"; var subscription = new RmqSubscription <MyCommand>( name: new SubscriptionName(channelName), channelName: new ChannelName(channelName), routingKey: routingKey, //after 2 retries, fail and move to the DLQ requeueCount: 2, //delay before re-queuing requeueDelayInMilliseconds: 50, deadLetterChannelName: new ChannelName(deadLetterQueueName), deadLetterRoutingKey: deadLetterRoutingKey, makeChannels: OnMissingChannel.Create ); var rmqConnection = new RmqMessagingGatewayConnection { AmpqUri = new AmqpUriSpecification(new Uri("amqp://*****:*****@localhost:5672/%2f")), Exchange = new Exchange("paramore.brighter.exchange"), DeadLetterExchange = new Exchange("paramore.brighter.exchange.dlq") }; //how do we send to the queue _sender = new RmqMessageProducer(rmqConnection, new RmqPublication()); //set up our receiver _channelFactory = new ChannelFactory(new RmqMessageConsumerFactory(rmqConnection)); _channel = _channelFactory.CreateChannel(subscription); //how do we handle a command IHandleRequests <MyDeferredCommand> handler = new MyDeferredCommandHandler(); //hook up routing for the command processor var subscriberRegistry = new SubscriberRegistry(); subscriberRegistry.Register <MyDeferredCommand, MyDeferredCommandHandler>(); //once we read, how do we dispatch to a handler. N.B. we don't use this for reading here _commandProcessor = new CommandProcessor( subscriberRegistry: subscriberRegistry, handlerFactory: new QuickHandlerFactory(() => handler), requestContextFactory: new InMemoryRequestContextFactory(), policyRegistry: new PolicyRegistry() ); //pump messages from a channel to a handler - in essence we are building our own dispatcher in this test IAmAMessageMapper <MyDeferredCommand> mapper = new MyDeferredCommandMessageMapper(_topicName); _messagePump = new MessagePumpBlocking <MyDeferredCommand>(_commandProcessor, mapper) { Channel = _channel, TimeoutInMilliseconds = 5000, RequeueCount = 3 }; _deadLetterConsumer = new RmqMessageConsumer( connection: rmqConnection, queueName: deadLetterQueueName, routingKey: deadLetterRoutingKey, isDurable: false, makeChannels: OnMissingChannel.Assume ); }