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