Example #1
0
        /// <summary>
        /// 接收消息
        /// </summary>
        /// <param name="exchange">交换机</param>
        /// <param name="queue">队列名称</param>
        /// <param name="routingKey">路由</param>
        /// <param name="isProperties">是否持久化</param>
        /// <param name="handler">消费处理</param>
        /// <param name="isDeadLetter"></param>
        internal void Subscribe(string exchange, string queue, string routingKey, bool isProperties, Action <string, MqDirectKey> handler, bool isDeadLetter)
        {
            //队列声明
            var channel = GetModel(exchange, queue, routingKey, isProperties);

            var consumer = new EventingBasicConsumer(channel);

            consumer.Received += (model, ea) =>
            {
                var         body      = ea.Body;
                var         msgStr    = body.DeserializeUtf8();
                MqDirectKey directKey = GetDirectKey(exchange, queue, routingKey);
                try
                {
                    handler(msgStr, directKey);
                }
                catch (Exception ex)
                {
                    //ex.GetInnestException().WriteToFile("队列接收消息", "RabbitMq");
                    if (!isDeadLetter)
                    {
                        PublishToDead <DeadLetterQueue>(queue, msgStr, ex);
                    }
                }
                finally
                {
                    channel.BasicAck(ea.DeliveryTag, false);
                }
            };
            channel.BasicConsume(queue, false, consumer);
        }
Example #2
0
        internal MqDirectKey GetDirectKey(string exchange, string queueName, string routingKey)
        {
            int         key       = MergeRoutingInfo(exchange, queueName, routingKey).GetHashCode();
            MqDirectKey directKey = null;

            if (RabbitMqMessageRoutingkeyValue.ContainsKey(key))
            {
                directKey = RabbitMqMessageRoutingkeyValue[key];
            }
            else
            {
                directKey = new MqDirectKey()
                {
                    ExchangeName = exchange,
                    QueueName    = queueName,
                    RoutingKey   = routingKey
                };
                RabbitMqMessageRoutingkeyValue[key] = directKey;
            }
            return(directKey);
        }
Example #3
0
        /// <summary>
        /// 获取消息
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="exchange"></param>
        /// <param name="queue"></param>
        /// <param name="routingKey"></param>
        /// <param name="handler">消费处理</param>
        internal void Pull(string exchange, string queue, string routingKey, Action <string, MqDirectKey> handler)
        {
            var channel = GetModel(exchange, queue, routingKey);

            MqDirectKey directKey = GetDirectKey(exchange, queue, routingKey);
            var         result    = channel.BasicGet(queue, false);

            if (ObjectExtension.IsNull(result))
            {
                return;
            }
            var msg = result.Body.DeserializeUtf8();

            try
            {
                handler(msg, directKey);
            }
            finally
            {
                channel.BasicAck(result.DeliveryTag, false);
            }
        }