Пример #1
0
        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);
            }
        }
Пример #2
0
        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);
            }
        }