Exemplo n.º 1
0
            public override void HandleBasicDeliver(string consumerTag, ulong deliveryTag, bool redelivered, string exchange, string routingKey, R.IBasicProperties properties, byte[] body)
            {
                var envelope          = new Envelope(deliveryTag, redelivered, exchange, routingKey);
                var messageProperties = _container.MessagePropertiesConverter.ToMessageProperties(properties, envelope, EncodingUtils.Utf8);

                messageProperties.ConsumerTag   = consumerTag;
                messageProperties.ConsumerQueue = Queue;
                var message = new Message(body, messageProperties);

                _logger?.LogDebug(this + " received " + message);
                _container.UpdateLastReceive();

                if (TransactionManager != null)
                {
                    try
                    {
                        ExecuteListenerInTransaction(message, deliveryTag);
                    }

                    // catch (WrappedTransactionException e)
                    // {
                    //    if (e.InnerException instanceof Error) {
                    //        throw (Error)e.getCause();
                    //    }
                    // }
                    catch (Exception)
                    {
                        // empty
                    }
                    finally
                    {
                        if (IsRabbitTxManager)
                        {
                            ConsumerChannelRegistry.UnRegisterConsumerChannel();
                        }
                    }
                }
                else
                {
                    try
                    {
                        CallExecuteListener(message, deliveryTag);
                    }
                    catch (Exception e)
                    {
                        // NOSONAR
                    }
                }
            }
Exemplo n.º 2
0
            private void ExecuteListenerInTransaction(Message message, ulong deliveryTag)
            {
                if (IsRabbitTxManager)
                {
                    ConsumerChannelRegistry.RegisterConsumerChannel(Model, ConnectionFactory);
                }

                if (TransactionTemplate == null)
                {
                    TransactionTemplate = new TransactionTemplate(TransactionManager, TransactionAttribute);
                }

                TransactionTemplate.Execute <object>(s =>
                {
                    var resourceHolder = ConnectionFactoryUtils.BindResourceToTransaction(new RabbitResourceHolder(Model, false), ConnectionFactory, true);
                    if (resourceHolder != null)
                    {
                        resourceHolder.AddDeliveryTag(Model, deliveryTag);
                    }

                    // unbound in ResourceHolderSynchronization.beforeCompletion()
                    try
                    {
                        CallExecuteListener(message, deliveryTag);
                    }
                    catch (Exception e1)
                    {
                        _container.PrepareHolderForRollback(resourceHolder, e1);
                        throw;
                    }

                    // catch (Throwable e2)
                    // {
                    //    //NOSONAR ok to catch Throwable here because we re-throw it below
                    //    throw new WrappedTransactionException(e2);
                    // }
                    return(null);
                });
            }