Exemple #1
0
        static async void OnIncomingMessage(object sender, IncomingRabbitMqMessageEventArgs ea)
        {
            Console.WriteLine($"------> In the event Message='{RabbitMqEndpoint.ConvertMessageToString(ea.Message)}' sent='{ea.MessageSentUtc.ToLocalTime()}'");
            var message = RabbitMqEndpoint.ConvertMessageToString(ea.Message);

            if (ea.RequiresAck)
            {
                Console.WriteLine("------> Sending a basic Ack");
                await((RabbitMqEndpoint)sender).SendAck(ea.DeliveryTag);
            }

            if (ea.IsRpc)
            {
                var reply = "Dunno what to say...";
                if (message.StartsWith("My name is "))
                {
                    var name = message.Replace("My name is ", "");
                    reply = $"Hello to you, {name}!";
                }

                var me1 = (RabbitMqEndpoint)sender;
                await me1.ReplyAsync <string>(reply, null);
            }
        }
Exemple #2
0
        protected virtual async Task OnIncomingMessageAsync(object sender, BasicDeliverEventArgs ea)
        {
            await Task.Delay(0, LocalCancellationToken);

            var ackMode     = ((ConsumerParameters)ChannelParameters).AutoAckMode;
            var isRpc       = false;
            var requiresAck = false;

            VerboseLoggingHandler.Log($"Event OnIncomingMessageAsync triggered For tag='{ea.DeliveryTag}', exchange='{ea.Exchange}', routingKeyOrTopicName='{ea.RoutingKey}', consumerTag='{ea.ConsumerTag}', deliveryTag='{ea.DeliveryTag}', redelivered='{ea.Redelivered}'");

            var messageType = ea.BasicProperties.Type;

            if (!ea.BasicProperties.IsCorrelationIdPresent())
            {
                var e = new InvalidOperationException($"Missing correlationId in message from exchange={ea.Exchange} deliveryTag=${ea.DeliveryTag}");
                VerboseLoggingHandler.Log(e);
                throw e;
            }

            VerboseLoggingHandler.Log($"MessageType='{messageType}'");

            if (messageType.Contains(MessageTypeFragmentsRequestAmqAck))
            {
                if (ackMode == ConsumerParameters.AutoAckModeEnum.OnReceipt)
                {
                    Channel.BasicAck(ea.DeliveryTag, false);
                }
                if (ackMode == ConsumerParameters.AutoAckModeEnum.Manual)
                {
                    requiresAck = true;
                }
            }

            if ((messageType.Contains(MessageTypeFragmentsRequestAck) || messageType.Contains(MessageTypeFragmentsRequestReply) && ea.BasicProperties.IsReplyToPresent()))
            {
                isRpc            = true;
                EndpointType     = EndpointTypeEnum.RpcConsumer;
                ReplyToQueueName = ea.BasicProperties.ReplyTo;
                VerboseLoggingHandler.Log($"Reply requested to '{ReplyToQueueName}'");

                if (ea.BasicProperties.IsHeadersPresent())
                {
                    VerboseLoggingHandler.Log($"Headers found");

                    var headers = ea.BasicProperties.Headers;
                    if (headers.ContainsKey(DictionaryKey_PassedQueueTtl))
                    {
                        var ttl = Convert.ToInt32(headers[DictionaryKey_PassedQueueTtl]);
                        VerboseLoggingHandler.Log($"ttl='{ttl}'");

                        if (QueueTtlValues.ContainsKey(ReplyToQueueName))
                        {
                            QueueTtlValues[ReplyToQueueName] = ttl;
                        }
                        else
                        {
                            QueueTtlValues.Add(ReplyToQueueName, ttl);
                        }

                        ea.BasicProperties.Headers.Remove(DictionaryKey_PassedQueueTtl);
                    }
                }

                // Handle basic message acknowledgement here.
                if (messageType.Contains(MessageTypeFragmentsRequestAck) && ConvertMessageToString(ea.Body) == MessageContent_Ping)
                {
                    VerboseLoggingHandler.Log($"Ack'ing the Ping");
                    await ReplyAsync(MessageContent_PingResponse, null);
                }
            }

            VerboseLoggingHandler.Log($"Delegate check - does messageType have '{MessageTypeFragmentsRequestReply}'?");
            if (messageType.Contains(MessageTypeFragmentsRequestReply))
            {
                VerboseLoggingHandler.Log($"Confirmed. Fire delegate");
                var args = new IncomingRabbitMqMessageEventArgs(isRpc, requiresAck, ea);
                await Task.Run(() => IncomingMessage?.Invoke(this, args), LocalCancellationToken);
            }
        }