RabbitMQ.EventBus.AspNetCore icon indicating copy to clipboard operation
RabbitMQ.EventBus.AspNetCore copied to clipboard

死信对列在哪实现的

Open ming2882 opened this issue 2 years ago • 2 comments

Configuration.MessageTTL,没看到有哪个地方用到这个

ming2882 avatar Nov 02 '23 02:11 ming2882

5.0的版本前实现过在这里

https://github.com/ojdev/RabbitMQ.EventBus.AspNetCore/blob/7fd1f37e5d615e12a8b4be743a04d8d0bee5dcd8/src/RabbitMQ.EventBus.AspNetCore/DefaultRabbitMQEventBus.cs#L85C27-L85C27

升级6.0后这部分业务中没使用,就没继续实现,然后就离职了,就没再维护

ojdev avatar Nov 14 '23 13:11 ojdev

                   #region snippet
                    var arguments = new Dictionary<string, object>();

                    #region 死信队列设置
                    if (_persistentConnection.Configuration.DeadLetterExchange.Enabled)
                    {
                        string deadExchangeName = $"{_persistentConnection.Configuration.DeadLetterExchange.ExchangeNamePrefix}{_persistentConnection.Configuration.DeadLetterExchange.CustomizeExchangeName ?? attr.Exchange}{_persistentConnection.Configuration.DeadLetterExchange.ExchangeNameSuffix}";
                        string deadQueueName = $"{_persistentConnection.Configuration.DeadLetterExchange.ExchangeNamePrefix}{queue}{_persistentConnection.Configuration.DeadLetterExchange.ExchangeNameSuffix}";
                        IModel dlxChannel;
                        try
                        {
                            dlxChannel = _persistentConnection.ExchangeDeclare(exchange: deadExchangeName, type: type);
                            dlxChannel.QueueDeclarePassive(deadQueueName);
                        }
                        catch
                        {
                            dlxChannel = _persistentConnection.ExchangeDeclare(exchange: deadExchangeName, type: type);
                            dlxChannel.QueueDeclare(queue: deadQueueName,
                                                durable: true,
                                                exclusive: false,
                                                autoDelete: false,
                                                arguments: null);
                        }
                        dlxChannel.QueueBind(deadQueueName, deadExchangeName, attr.RoutingKey, null);
                        arguments.Add("x-dead-letter-exchange", deadExchangeName);
                    }
                    #endregion

                    try
                    {
                        channel = _persistentConnection.ExchangeDeclare(exchange: attr.Exchange, type: type);
                        channel.QueueDeclarePassive(queue);
                    }
                    catch
                    {
                        channel = _persistentConnection.ExchangeDeclare(exchange: attr.Exchange, type: type);
                        if (_persistentConnection.Configuration.MessageTTL != null && _persistentConnection.Configuration.MessageTTL > 0)
                        {
                            arguments.Add("x-message-ttl", _persistentConnection.Configuration.MessageTTL);
                        }
                        channel.QueueDeclare(queue: queue,
                                             durable: true,
                                             exclusive: false,
                                             autoDelete: false,
                                             arguments: arguments);
                    }
                    #endregion

死信队列就是一个消息队列,只是用参数声明死信交换机arguments.Add("x-dead-letter-exchange", deadExchangeName);,和队列的存活时间 arguments.Add("x-message-ttl", _persistentConnection.Configuration.MessageTTL);,就可以成为死信队列了。

ojdev avatar Nov 14 '23 13:11 ojdev