/// <summary> /// 拉取消息 /// </summary> /// <typeparam name="T">消息类型</typeparam> /// <param name="actionHandle">处理该类型消息的方法</param> /// <param name="errorActionHandle">处理消息时发生错误时处理方法</param> /// <param name="routingKey">路由关键字</param> /// <param name="memberName">调用成员信息</param> /// <param name="loggerName">记录器名字</param> public void Pull <T>(Action <T> actionHandle, Action <T, Exception> errorActionHandle = null, string routingKey = null, string memberName = null, string loggerName = null) { var mqAttribute = MQAttribute.GetMQAttribute <T>(); routingKey.IsNotNullAndNotWhiteSpaceThenExcute(() => mqAttribute.RoutingKey = routingKey); CreateExchangeAndQueue(mqAttribute, isConsumer: true); var result = Channel.BasicGet(mqAttribute.QueueName, false); if (result.IsNull()) { return; } var message = _binarySerializer.Deserialize <T>(result.Body); try { actionHandle(message); } catch (Exception ex) { if (errorActionHandle != null) { ExceptionUtil.LogException(() => { errorActionHandle(message, ex); }, memberName: memberName, loggerName: loggerName); } } finally { Channel.BasicAck(result.DeliveryTag, false); } }
/// <summary> /// 订阅消息 /// </summary> /// <typeparam name="T">消息类型</typeparam> /// <param name="actionHandle">处理该类型消息的方法</param> /// <param name="errorActionHandle">处理消息时发生错误时处理方法</param> /// <param name="routingKey">路由关键字</param> /// <param name="memberName">调用成员信息</param> /// <param name="loggerName">记录器名字</param> public void Subscribe <T>(Action <T> actionHandle, Action <T, Exception> errorActionHandle = null, string routingKey = null, string memberName = null, string loggerName = null) { var mqAttribute = MQAttribute.GetMQAttribute <T>(); routingKey.IsNotNullAndNotWhiteSpaceThenExcute(() => mqAttribute.RoutingKey = routingKey); CreateExchangeAndQueue(mqAttribute, isConsumer: true); var consumer = new EventingBasicConsumer(Channel); consumer.Received += (model, ea) => { var body = ea.Body; var message = _binarySerializer.Deserialize <T>(body); try { actionHandle(message); } catch (Exception ex) { if (errorActionHandle != null) { ExceptionUtil.LogException(() => { errorActionHandle(message, ex); }, memberName: memberName, loggerName: loggerName); } } finally { Channel.BasicAck(ea.DeliveryTag, false); } }; Channel.BasicConsume(mqAttribute.QueueName, false, consumer); }
/// <summary> /// RPC服务端 /// </summary> /// <typeparam name="T">消息类型</typeparam> /// <param name="handler">处理该类型消息的方法</param> /// <param name="routingKey">路由关键字</param> /// <param name="memberName">调用成员信息</param> /// <param name="loggerName">记录器名字</param> public void RpcServer <T>(Func <T, T> handler, string routingKey = null, string memberName = null, string loggerName = null) { var mqAttribute = MQAttribute.GetMQAttribute <T>(); mqAttribute.NotNull("MQAttribute不能为空"); routingKey.IsNotNullAndNotWhiteSpaceThenExcute(() => mqAttribute.RoutingKey = routingKey); RpcServer(handler, mqAttribute.ExchangeName, mqAttribute.QueueName, mqAttribute.RoutingKey , exchangeType: mqAttribute.ExchangeType, durable: mqAttribute.Durable, autoDelete: mqAttribute.AutoDelete, exclusive: mqAttribute.Exclusive, arguments: mqAttribute.Arguments, memberName: memberName, loggerName: loggerName); }
/// <summary> /// RPC客户端 /// </summary> /// <typeparam name="T">消息类型</typeparam> /// <param name="command">消息内容</param> /// <param name="routingKey">路由关键字</param> /// <returns>处理之后的信息</returns> public T RpcClient <T>(T command, string routingKey = null) { var mqAttribute = MQAttribute.GetMQAttribute <T>(); routingKey.IsNotNullAndNotWhiteSpaceThenExcute(() => mqAttribute.RoutingKey = routingKey); mqAttribute.NotNull("MQAttribute不能为空"); return(RpcClient(command, mqAttribute.ExchangeName, mqAttribute.QueueName, mqAttribute.RoutingKey , exchangeType: mqAttribute.ExchangeType, durable: mqAttribute.Durable, autoDelete: mqAttribute.AutoDelete, exclusive: mqAttribute.Exclusive, arguments: mqAttribute.Arguments)); }
/// <summary> /// 发送消息 /// </summary> /// <typeparam name="T">消息类型</typeparam> /// <param name="command">消息内容</param> /// <param name="routingKey">路由关键字</param> public void Publish <T>(T command, string routingKey = null) { var mqAttribute = MQAttribute.GetMQAttribute <T>(); routingKey.IsNotNullAndNotWhiteSpaceThenExcute(() => mqAttribute.RoutingKey = routingKey); CreateExchangeAndQueue(mqAttribute); var properties = Channel.CreateBasicProperties(); properties.Persistent = true; Channel.BasicPublish(mqAttribute.ExchangeName, mqAttribute.RoutingKey, properties, _binarySerializer.Serialize(command)); }
/// <summary> /// 发送消息 /// </summary> /// <typeparam name="T">消息类型</typeparam> /// <param name="command">消息内容</param> /// <param name="routingKey">路由关键字</param> public void Publish <T>(T command, string routingKey = null) { var mqAttribute = MQAttribute.GetMQAttribute <T>(); if (routingKey.IsNotNullAndNotEmptyWhiteSpace()) { mqAttribute.RoutingKey = routingKey; } CreateExchangeAndQueue(mqAttribute); var properties = Channel.CreateBasicProperties(); properties.Persistent = true; Channel.BasicPublish(mqAttribute.ExchangeName, mqAttribute.RoutingKey, properties, command.ToJson().ToBytes()); }
/// <summary> /// 发布消息 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="command"></param> public void Pubish <T>(T command) { var mqAttribute = MQAttribute.GetMQAttribute <T>(); if (mqAttribute.IsNull()) { throw new ArgumentException(); } CreateExchangeAndQueue(mqAttribute); var properties = Channel.CreateBasicProperties(); properties.Persistent = true; Channel.BasicPublish(mqAttribute.ExchangeName, mqAttribute.RoutingKey, properties, command.ToJsonUTF8()); }
/// <summary> /// 发送消息 /// </summary> /// <typeparam name="T">消息类型</typeparam> /// <param name="command">消息内容</param> /// <param name="routingKey">路由关键字</param> public void Publish <T>(T command, string routingKey = null) { var mqAttribute = MQAttribute.GetMQAttribute <T>(); if (routingKey.IsNotNullAndNotEmptyWhiteSpace()) { mqAttribute.RoutingKey = routingKey; } CreateExchangeAndQueue(mqAttribute); var properties = Channel.CreateBasicProperties(); properties.Persistent = true; properties.DeliveryMode = 2; // Channel.c Channel.BasicPublish(mqAttribute.ExchangeName, mqAttribute.RoutingKey, properties, command.ToJson().ToBytes()); Channel.ConfirmSelect(); Channel.BasicAcks += (model, ea) => { LogUtil.Debug($"消息发送成功:{ea.DeliveryTag}{ea.Multiple}"); }; //Channel. //Channel.WaitForConfirms }
/// <summary> /// 拉取消息 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="actionHandle"></param> public void Pull <T>(Action <T> actionHandle) where T : class { var mqAttribute = MQAttribute.GetMQAttribute <T>(); CreateExchangeAndQueue(mqAttribute, isConsumer: true); var result = Channel.BasicGet(mqAttribute.QueueName, false); if (result.IsNull()) { return; } var body = result.Body; var messageStr = Encoding.UTF8.GetString(body); var message = messageStr.FromJson <T>(); try { actionHandle(message); } finally { Channel.BasicAck(result.DeliveryTag, false); } }
/// <summary> /// 订阅消息 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="actionHandle"></param> public void Subscribe <T>(Action <T> actionHandle) where T : class { var mqAttribute = MQAttribute.GetMQAttribute <T>(); CreateExchangeAndQueue(mqAttribute, isConsumer: true); var consumer = new EventingBasicConsumer(Channel); consumer.Received += (model, ea) => { var body = ea.Body; var messageStr = Encoding.UTF8.GetString(body); var message = messageStr.FromJson <T>(); try { actionHandle(message); } finally { Channel.BasicAck(ea.DeliveryTag, false); } }; Channel.BasicConsume(mqAttribute.QueueName, false, consumer); }
/// <summary> /// 声明一个交换机、队列,并绑定对应关系 /// </summary> /// <param name="mqAttribute">消息队列特性信息</param> private void CreateExchangeAndQueue(MQAttribute mqAttribute, bool isConsumer = false) { mqAttribute.NotNull("MQAttribute不能为空"); CreateExchangeAndQueue(mqAttribute.ExchangeName, mqAttribute.QueueName, mqAttribute.RoutingKey, exchangeType: mqAttribute.ExchangeType, durable: mqAttribute.Durable, exclusive: mqAttribute.Exclusive, autoDelete: mqAttribute.AutoDelete, arguments: mqAttribute.Arguments, isConsumer: isConsumer); }
/// <summary> /// 声明交换机和队列 /// </summary> /// <param name="mqAttribute"></param> /// <param name="arguments"></param> /// <param name="isConsumer"></param> private void CreateExchangeAndQueue(MQAttribute mqAttribute, IDictionary <string, object> arguments = null, bool isConsumer = false) { CreateExchangeAndQueue(mqAttribute.ExchangeName, mqAttribute.QueueName, mqAttribute.RoutingKey, mqAttribute.MQExchangeType, mqAttribute.Durable, mqAttribute.Exclusive, mqAttribute.AutoDelete, arguments, isConsumer); }