Esempio n. 1
0
        public IModel Configure()
        {
            var channel = _consumerConnection.CreateModel();

            // configure this context as consumer
            _consumer.Configure(channel);

            var consumer = new EventingBasicConsumer(channel);

            // add my event handler to Received event in rmq
            consumer.Received += (model, ea) =>
            {
                // bytes to string
                string body = Encoding.UTF8.GetString(ea.Body);

                // string to JObject
                JObject jBody = JObject.Parse(body);

                bool isProcessed = false;

                // txs must be share with domain event handler dispatched following
                using (var scope = new TransactionScope())
                {
                    RmqConsumeMessage processedMessage = _consumedMessageStore.GetByMessageId(Guid.Parse((string)jBody["messageId"]));

                    // if message already exists, this means the message processed before
                    if (processedMessage != null)
                    {
                        isProcessed = true;
                    }
                }

                if (isProcessed)
                {
                    // return ack to delete redelivered message in queue
                    channel.BasicAck(ea.DeliveryTag, false);
                }
                else
                {
                    // get type of event
                    DomainEventTypeConstants eventType = (DomainEventTypeConstants)(int)jBody["domainEventType"];

                    // get event from domain event factory
                    IDomainEvent targetDomainEvent = _domainEventFactory.Get(eventType, jBody["content"].ToObject <JObject>());

                    // publish target event with mediator
                    _mediator.Publish(targetDomainEvent);

                    // acknowledge the delivery
                    channel.BasicAck(ea.DeliveryTag, false);
                }
            };

            // sign to this channel start service as consumers
            channel.BasicConsume(queue: _consumer.GetQueueName(),
                                 autoAck: false,
                                 consumer: consumer);

            return(channel);
        }
Esempio n. 2
0
 public void Update(RmqConsumeMessage updatedMessage)
 {
     _session.Update(updatedMessage);
 }
Esempio n. 3
0
 public Guid Create(RmqConsumeMessage message)
 {
     return((Guid)_session.Save(message));
 }