public T Execute <T>(ClientSessionCallbackDelegate <T> action) { AssertUtils.ArgumentNotNull(action, "Callback object must not be null"); IClient clientToClose = null; IClientSession sessionToClose = null; try { IClientSession channelToUse = ClientFactoryUtils .DoGetTransactionalSession(ClientFactory, this.transactionalResourceFactory); if (channelToUse == null) { clientToClose = CreateClient(); sessionToClose = CreateChannel(clientToClose); channelToUse = sessionToClose; } if (logger.IsDebugEnabled) { logger.Debug("Executing callback on RabbitMQ Channel: " + channelToUse); } return(action(channelToUse)); } catch (Exception ex) { throw; //TOOD convertRabbitAccessException(ex) ? } finally { QpidUtils.CloseChannel(sessionToClose); ClientFactoryUtils.ReleaseConnection(clientToClose, ClientFactory); } }
protected virtual void DoSend(IClientSession channel, string exchange, string routingKey, IMessageCreator messageCreator, MessageCreatorDelegate messageCreatorDelegate) { AssertUtils.IsTrue((messageCreator == null && messageCreatorDelegate != null) || (messageCreator != null && messageCreatorDelegate == null), "Must provide a MessageCreatorDelegate or IMessageCreator instance."); Message message; if (messageCreator != null) { message = messageCreator.CreateMessage(); } else { message = messageCreatorDelegate(); } if (exchange == null) { // try to send to default exchange exchange = this.exchange; } if (routingKey == null) { // try to send to default routing key routingKey = this.routingKey; } /* org.apache.qpid.client.IMessage message = new org.apache.qpid.client.Message(); * message.ClearData(); * message.AppendData(Encoding.UTF8.GetBytes("That's all, folks!")); * session.MessageTransfer("amq.direct", "routing_key", message); * session.Sync(); * */ org.apache.qpid.client.IMessage qpidMessage = new org.apache.qpid.client.Message(); qpidMessage.AppendData(message.Body); qpidMessage.DeliveryProperties = QpidUtils.ExtractDeliveryProperties(message); qpidMessage.DeliveryProperties.SetRoutingKey(routingKey); qpidMessage.DeliveryProperties.SetExchange(exchange); qpidMessage.DeliveryProperties.SetImmediate(this.immediatePublish); //TODO where to set mandetoryPublish? channel.MessageTransfer(exchange, routingKey, qpidMessage); channel.Sync(); // TODO: should we be able to do (via wrapper) something like: // channel.getTransacted()? if (ChannelTransacted && ChannelLocallyTransacted(channel)) { // Transacted channel created by this template -> commit. QpidUtils.CommitIfNecessary(channel); } }