Ejemplo n.º 1
0
        public void Push(RabbitRequest request,
                         RabbitOption option, Action <ulong, bool> basicAckCall = null)
        {
            var correlationId = request.GetCorrelationId();

            if (!request.AllowDuplicatePublishing && _cacheStorage == null)
            {
                throw new Exception("不允许重复消费的队列需缓存对象");
            }
            if (!request.AllowDuplicatePublishing &&
                _cacheStorage.KeyExists(request.CacheDbIndex, correlationId))
            {
                return;
            }
            if (!request.AllowDuplicatePublishing)
            {
                var cacheModel = new Cache.Model.CacheUnitModel
                {
                    DataBaseIndex = request.CacheDbIndex,
                    Expire        = TimeSpan.FromDays(1),
                };
                _cacheStorage.SetAdd(cacheModel, correlationId, correlationId);
            }

            var pushed = RabbitObjFactory.CreatePushed(request.Header.PublishMethod);

            pushed.Factory = ConnectionFactory;

            pushed.Pushed(request, option, basicAckCall);
        }
Ejemplo n.º 2
0
        public bool PutLogistics(Able.Store.Model.OrdersDomain.Order order)
        {
            var option = new RabbitProductOption
            {
                AutoDelete      = true,
                Exclusive       = false,
                Durable         = false,
                PublishMethod   = PublishMethod.简单工作队列,
                AutoAck         = true,
                RoutingKey      = "queue.direct.undurable.placeorder",
                QueueNameOption = new RabbitQueueNameOption()
            };

            option.QueueNameOption.Add("queue.direct.undurable.placeorder");

            var body = LogisticsRequestFactory.CreatePlaceOrder(order);

            RabbitRequest request = new RabbitRequest();

            request.Header =
                new RabbitRequestHeader
            {
                BusinessId    = order.Id.ToString(),
                BusinessName  = PUTLOGISTICS,
                Module        = MODULE,
                PublishMethod = PublishMethod.简单工作队列,
            };
            request.Body = LockInventoryItemBody.ToBodys(order.Items);

            request.CacheDbIndex = OrderStaticResource.DBINDEX;

            _controller.Push(request, option);

            return(true);
        }
Ejemplo n.º 3
0
        public void Pushed(RabbitRequest request, RabbitOption option,
                           Action <ulong, bool> basicAckCall = null)
        {
            _basicAckCall = basicAckCall;

            var channel = Factory.CreatChannel();

            option.DeclareQueue(channel);

            var properties = channel.CreateBasicProperties();

            properties.Persistent = option.Durable;

            if (!option.AutoAck)
            {
                channel.ConfirmSelect();
                channel.BasicAcks  += Channel_BasicAcks;
                channel.BasicNacks += Channel_BasicNacks;
            }
            channel.BasicPublish(exchange: "",
                                 routingKey: option.RoutingKey,
                                 basicProperties: properties,
                                 body: request.GetData());
            if (option.AutoAck)
            {
                channel.Close();
            }
        }
Ejemplo n.º 4
0
        private void Consumer_Received(object sender, BasicDeliverEventArgs ea)
        {
            log.Debug($"Получено сообщение от {ea.RoutingKey}");
            Task.Run(() =>
            {
                var body                 = ea.Body;
                var props                = ea.BasicProperties;
                var replyProps           = channel.CreateBasicProperties();
                replyProps.CorrelationId = props.CorrelationId;

                try
                {
                    var message = Encoding.UTF8.GetString(body);
                    log.Debug($"Тело:\r\n{message}");
                    RabbitRequest rabbitRequest = JsonConvert.DeserializeObject <RabbitRequest>(message);

                    WorkflowProcessor processor = new WorkflowProcessor(rabbitRequest.MessageId, rabbitRequest.RequestCode);
                    processor.Run();

                    log.Debug($" [{QueueCode}] ({message})");
                    rabbitRequest.RequestCode++;
                }
                catch (Exception ex)
                {
                    log.Fatal($"[{QueueCode}] ({ex.Message})", ex);
                }
                finally
                {
                    if (CloseReason == null)
                    {
                        channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
                    }
                }
            });
        }
Ejemplo n.º 5
0
        public string Execute(int requestCode, Guid messageId)
        {
            RabbitRequest request = new RabbitRequest
            {
                MessageId   = messageId,
                RequestCode = requestCode
            };

            string message = JsonConvert.SerializeObject(request);

            byte[] messageBytes = Encoding.UTF8.GetBytes(message);

            string queueName = $"queue-{requestCode}-1";

            _channel.QueueDeclare(queue: queueName,
                                  durable: true,
                                  exclusive: false,
                                  autoDelete: false,
                                  arguments: null);

            IBasicProperties props = _channel.CreateBasicProperties();

            props.CorrelationId = _correlationId;
            string replyQueueName = _channel.QueueDeclare($"response-{requestCode}-1-{messageId.ToString()}").QueueName;

            props.ReplyTo = replyQueueName;



            _channel.BasicPublish(
                exchange: "",
                routingKey: queueName,
                basicProperties: props,
                body: messageBytes);

            EventingBasicConsumer consumer = new EventingBasicConsumer(_channel);

            consumer.Received += (model, ea) =>
            {
                var body     = ea.Body;
                var response = Encoding.UTF8.GetString(body);
                if (ea.BasicProperties.CorrelationId == _correlationId)
                {
                    _respQueue.Add(response);
                }
            };

            _channel.BasicConsume(
                consumer: consumer,
                queue: replyQueueName,
                autoAck: true);

            return(_respQueue.Take());
        }
Ejemplo n.º 6
0
        public void CreateOrderChangeCannotQty(RabbitRequest request)
        {
            var correlationId = request.GetCorrelationId();

            //判断是否重复推送
            if (_cacheService.ChangeQtyNumberExsist(correlationId))
            {
                return;
            }
            ChangeCannotQtyRequest requestBody = new ChangeCannotQtyRequest();

            requestBody.items = request.PaseBody <IList <ChangeCannotQtyItemRequest> >();

            var response = ChangeCannotQty(requestBody);

            _cacheService.NotifyChangeQtyNumber(request.Header, response.issuccess, response.message, response.errcode);
        }
Ejemplo n.º 7
0
        public void Pushed(RabbitRequest request,
                           RabbitOption option,
                           Action <ulong, bool> basicAckCall = null)
        {
            if (option.ExchangeOption == null)
            {
                throw new ArgumentNullException("未指定交换机信息");
            }

            var channel = Factory.CreatChannel();

            _basicAckCall = basicAckCall;

            //声明队列
            option.DeclareQueue(channel);

            //声明交换机
            option.ExchangeDeclare(channel);

            //将交换机和队列绑定
            option.BindQueue(channel);

            var properties = channel.CreateBasicProperties();

            properties.Persistent = option.Durable;

            if (!option.AutoAck && _basicAckCall != null)
            {
                channel.BasicAcks  += Channel_BasicAcks;
                channel.BasicNacks += Channel_BasicNacks;
            }
            channel.BasicPublish(exchange: option.ExchangeOption.ExchangeName,
                                 routingKey: option.RoutingKey,
                                 basicProperties: properties,
                                 body: request.GetData());
            if (option.AutoAck)
            {
                channel.Close();
            }
        }
Ejemplo n.º 8
0
        public void PublisSystemException(string actionName, int controllerHashCode,
                                          string controllerName, Exception exception)
        {
            RabbitProductController controller = AutofacHelper.Resolver <RabbitProductController>();

            var request = new RabbitRequest
            {
                Body   = exception,
                Header = new RabbitRequestHeader
                {
                    BusinessId   = string.Concat(actionName, controllerHashCode),
                    BusinessName = actionName,
                    Module       = controllerName,
                },
                AllowDuplicatePublishing = true
            };
            var productOption = new RabbitProductOption
            {
                AutoDelete     = true,
                Durable        = false,
                PublishMethod  = PublishMethod.发布订阅,
                Exclusive      = false,
                ExchangeOption = new RabbitExchangeOption
                {
                    AutoDelete   = true,
                    Durable      = false,
                    ChangeType   = ChangeType.Fanout,
                    ExchangeName = "exception.nodurable.fanout",
                    Exclusive    = false
                },
                AutoAck         = true,
                QueueNameOption = new RabbitQueueNameOption()
            };

            //通知系统
            productOption.QueueNameOption.Add("exception.nodurable.fanout.notifysys");
            //日志系统
            productOption.QueueNameOption.Add("exception.nodurable.fanout.logsys");
            controller.Push(request, productOption);
        }
Ejemplo n.º 9
0
        public void PullMessage(int requestCode, Guid messageId)
        {
            var factory = new ConnectionFactory()
            {
                HostName = _hostName, UserName = _userName, Password = _password
            };

            using (var connection = factory.CreateConnection())
            {
                using (var channel = connection.CreateModel())
                {
                    string queueName = $"queue-{requestCode}-0";

                    channel.QueueDeclare(queue: queueName,
                                         durable: true,
                                         exclusive: false,
                                         autoDelete: false,
                                         arguments: null);

                    var properties = channel.CreateBasicProperties();
                    properties.Persistent = true;

                    RabbitRequest request = new RabbitRequest()
                    {
                        MessageId   = messageId,
                        RequestCode = requestCode
                    };

                    string message = JsonConvert.SerializeObject(request);

                    var body = Encoding.UTF8.GetBytes(message);

                    channel.BasicPublish(exchange: "",
                                         routingKey: queueName,
                                         basicProperties: properties,
                                         body: body);
                    Console.WriteLine(" [x] Sent {0}", message);
                }
            }
        }