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