Пример #1
0
        /// <summary>
        /// Инициализирует новый экземпляр класса <see cref="Producer"/>.
        /// </summary>
        /// <param name="bus">
        /// Конечная точка, для которой создается отправитель.
        /// </param>
        /// <param name="label">
        /// Метка сообщения, которая будет использоваться при отправлении сообщений.
        /// </param>
        /// <param name="routeResolver">
        /// Определитель маршрутов, по которым можно отсылать и получать сообщения.
        /// </param>
        /// <param name="confirmationIsRequired">
        /// Если <c>true</c> - тогда отправитель будет ожидать подтверждения о том, что сообщение было сохранено в брокере.
        /// </param>
        public Producer(RabbitBus bus, MessageLabel label, IRouteResolver routeResolver, bool confirmationIsRequired)
        {
            this.Channel = bus.OpenChannel();
            this.Label = label;
            this.RouteResolver = routeResolver;
            this.ConfirmationIsRequired = confirmationIsRequired;

            if (this.ConfirmationIsRequired)
            {
                this.confirmationTracker = new DefaultPublishConfirmationTracker(this.Channel);
                this.Channel.EnablePublishConfirmation();
                this.Channel.OnConfirmation(this.confirmationTracker.HandleConfirmation);
            }

            this.Failed += _ => ((IBusAdvanced)bus).Panic();
        }
Пример #2
0
        /// <summary>
        /// Инициализирует новый экземпляр класса <see cref="Producer"/>.
        /// </summary>
        /// <param name="bus">
        /// Конечная точка, для которой создается отправитель.
        /// </param>
        /// <param name="label">
        /// Метка сообщения, которая будет использоваться при отправлении сообщений.
        /// </param>
        /// <param name="routeResolver">
        /// Определитель маршрутов, по которым можно отсылать и получать сообщения.
        /// </param>
        /// <param name="confirmationIsRequired">
        /// Если <c>true</c> - тогда отправитель будет ожидать подтверждения о том, что сообщение было сохранено в брокере.
        /// </param>
        public Producer(RabbitBus bus, MessageLabel label, IRouteResolver routeResolver, bool confirmationIsRequired)
        {
            this.Channel                = bus.OpenChannel();
            this.Label                  = label;
            this.RouteResolver          = routeResolver;
            this.ConfirmationIsRequired = confirmationIsRequired;

            if (this.ConfirmationIsRequired)
            {
                this.confirmationTracker = new DefaultPublishConfirmationTracker(this.Channel);
                this.Channel.EnablePublishConfirmation();
                this.Channel.OnConfirmation(this.confirmationTracker.HandleConfirmation);
            }

            this.Failed += _ => ((IBusAdvanced)bus).Panic();
        }
Пример #3
0
        /// <summary>
        /// Initializes a new instance of the <see cref="Producer"/> class.
        /// </summary>
        /// <param name="endpoint">
        /// The endpoint.
        /// </param>
        /// <param name="connection">
        /// Соединение с шиной сообщений
        /// </param>
        /// <param name="label">
        /// Метка сообщения, которая будет использоваться при отправлении сообщений.
        /// </param>
        /// <param name="routeResolver">
        /// Определитель маршрутов, по которым можно отсылать и получать сообщения.
        /// </param>
        /// <param name="confirmationIsRequired">
        /// Если <c>true</c> - тогда отправитель будет ожидать подтверждения о том, что сообщение было сохранено в брокере.
        /// </param>
        public Producer(IEndpoint endpoint, IRabbitConnection connection, MessageLabel label, IRouteResolver routeResolver, bool confirmationIsRequired)
        {
            this.endpoint = endpoint;

            this.Channel   = connection.OpenChannel();
            this.BrokerUrl = connection.ConnectionString;
            this.logger    = LogManager.GetLogger($"{this.GetType().FullName}(URL={this.BrokerUrl})");

            this.Label                  = label;
            this.RouteResolver          = routeResolver;
            this.ConfirmationIsRequired = confirmationIsRequired;

            if (this.ConfirmationIsRequired)
            {
                this.confirmationTracker = new DefaultPublishConfirmationTracker(this.Channel);
                this.Channel.EnablePublishConfirmation();
                this.Channel.OnConfirmation(this.confirmationTracker.HandleConfirmation);
            }
        }
Пример #4
0
        /// <summary>
        /// Запускает отправитель, после этого можно получать ответы на запросы.
        /// </summary>
        public void Start()
        {
            try
            {
                this.logger.Trace($"Starting producer [{this.GetHashCode()}] of [{this.Label}]");
                this.slimLock.EnterWriteLock();

                this.cancellationTokenSource = new CancellationTokenSource();
                var token = this.cancellationTokenSource.Token;

                this.Channel           = this.connection.OpenChannel(token);
                this.Channel.Shutdown += this.OnChannelShutdown;

                if (this.ConfirmationIsRequired)
                {
                    this.confirmationTracker = new PublishConfirmationTracker(this.Channel);
                    this.Channel.EnablePublishConfirmation();
                    this.Channel.OnConfirmation(this.confirmationTracker.HandleConfirmation);
                }

                this.CallbackListener?.StartConsuming();

                this.logger.Trace($"Producer of [{this.Label}] started successfully");
            }
            finally
            {
                try
                {
                    this.slimLock.ExitWriteLock();
                }
                catch (Exception)
                {
                    // Suppress all errors
                }
            }
        }
Пример #5
0
        /// <summary>
        /// Запускает отправитель, после этого можно получать ответы на запросы.
        /// </summary>
        public void Start()
        {
            lock (this.syncRoot)
            {
                this.logger.Trace($"Starting producer [{this.GetHashCode()}] of [{this.Label}]");

                this.cancellationTokenSource = new CancellationTokenSource();
                var token = this.cancellationTokenSource.Token;

                this.Channel           = this.connection.OpenChannel(token);
                this.Channel.Shutdown += this.OnChannelShutdown;

                if (this.ConfirmationIsRequired)
                {
                    this.confirmationTracker = new PublishConfirmationTracker(this.Channel);
                    this.Channel.EnablePublishConfirmation();
                    this.Channel.OnConfirmation(this.confirmationTracker.HandleConfirmation);
                }

                this.CallbackListener?.StartConsuming();

                this.logger.Trace($"Producer of [{this.Label}] started successfully");
            }
        }