/// <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); }
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); }
/// <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); } }