示例#1
0
        /// <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);
            }
        }
示例#2
0
        /// <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);
        }
示例#3
0
        /// <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);
        }
示例#4
0
        /// <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));
        }
示例#5
0
        /// <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));
        }
示例#6
0
        /// <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());
        }
示例#7
0
        /// <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());
        }
示例#8
0
        /// <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
        }
示例#9
0
        /// <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);
            }
        }
示例#10
0
        /// <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);
        }
示例#11
0
 /// <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);
 }
示例#12
0
 /// <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);
 }