static void Main(string[] args) { var rmqMessageConsumer = new RmqMessageConsumer(HOSTNAME, QUEUE_NAME); rmqMessageConsumer.MessageReceived += (message) => Console.WriteLine($"Message received: {message}"); rmqMessageConsumer.StartMessageConsumer(); Console.WriteLine("Press [enter] to exit"); Console.ReadLine(); rmqMessageConsumer.StopMessageConsumer(); }
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 ); }