Exemplo n.º 1
0
        protected override void OnInit()
        {
            OnDispose();
            _senders = new List <RedisMQConnection>();

            if (Config != null)
            {
                if (Config.ClientQueues != null)
                {
                    _clientQueues = Config.ClientQueues.FirstOf(
                        c => c.EnvironmentName?.SplitAndTrim(",").Contains(Core.EnvironmentName) == true && c.MachineName?.SplitAndTrim(",").Contains(Core.MachineName) == true,
                        c => c.EnvironmentName?.SplitAndTrim(",").Contains(Core.EnvironmentName) == true,
                        c => c.MachineName?.SplitAndTrim(",").Contains(Core.MachineName) == true,
                        c => c.EnvironmentName.IsNullOrWhitespace());
                }
                _senderOptions          = Config.RequestOptions?.ClientSenderOptions;
                _receiverOptions        = Config.ResponseOptions?.ClientReceiverOptions;
                _receiverOptionsTimeout = TimeSpan.FromSeconds(_receiverOptions?.TimeoutInSec ?? 20);
                UseSingleResponseQueue  = _receiverOptions?.Parameters?[ParameterKeys.SingleResponseQueue].ParseTo(true) ?? true;

                if (_clientQueues?.SendQueues?.Any() == true)
                {
                    foreach (var queue in _clientQueues.SendQueues)
                    {
                        Core.Log.LibVerbose("New Producer from QueueClient");
                        var redisConnection = new RedisMQConnection(queue);
                        _senders.Add(redisConnection);
                    }
                }
                if (_clientQueues?.RecvQueue != null && !SendOnly)
                {
                    _receiverConnection = new RedisMQConnection(_clientQueues.RecvQueue);
                    if (!UseSingleResponseQueue)
                    {
                        _receiverConnection.Name += "-" + Core.InstanceIdString;
                        Core.Log.InfoBasic("Using custom response queue: {0}", _receiverConnection.Name);
                    }
                    _receiverConnection.SubscribeAsync(new Action <RedisChannel, RedisValue>(ProcessReceivedMessage)).WaitAsync();
                }
            }

            Core.Status.Attach(collection =>
            {
                if (_senders != null)
                {
                    for (var i = 0; i < _senders.Count; i++)
                    {
                        collection.Add("Sender Path: {0}".ApplyFormat(i), _senders[i].Route);
                    }
                }
                if (_clientQueues?.RecvQueue != null)
                {
                    collection.Add("Receiver Path", _clientQueues.RecvQueue.Route);
                }
            });
        }
Exemplo n.º 2
0
        protected override async Task OnListenerTaskStartAsync(CancellationToken token)
        {
            _token      = token;
            _connection = new RedisMQConnection(Connection);
            await _connection.SubscribeAsync(_messageHandlerDelegate).ConfigureAwait(false);

            _monitorTask = Task.Run(_monitorDelegate, _token);
            await token.WhenCanceledAsync().ConfigureAwait(false);

            OnDispose();
            await _monitorTask.ConfigureAwait(false);
        }
Exemplo n.º 3
0
        private async Task MonitorProcess()
        {
            while (!_token.IsCancellationRequested)
            {
                try
                {
                    if (Interlocked.CompareExchange(ref _exceptionSleep, 0, 1) == 1)
                    {
                        OnDispose();
                        Core.Log.Warning("An exception has been thrown, the listener has been stopped for {0} seconds.", Config.RequestOptions.ServerReceiverOptions.SleepOnExceptionInSec);
                        await Task.Delay(Config.RequestOptions.ServerReceiverOptions.SleepOnExceptionInSec * 1000, _token).ConfigureAwait(false);

                        _connection = new RedisMQConnection(Connection);
                        await _connection.SubscribeAsync(_messageHandlerDelegate).ConfigureAwait(false);

                        Core.Log.Warning("The listener has been resumed.");
                    }

                    if (Counters.CurrentMessages >= Config.RequestOptions.ServerReceiverOptions.MaxSimultaneousMessagesPerQueue)
                    {
                        OnDispose();
                        Core.Log.Warning("Maximum simultaneous messages per queue has been reached, the message needs to wait to be processed, consider increase the MaxSimultaneousMessagePerQueue value, CurrentValue={0}.", Config.RequestOptions.ServerReceiverOptions.MaxSimultaneousMessagesPerQueue);

                        while (!_token.IsCancellationRequested && Counters.CurrentMessages >= Config.RequestOptions.ServerReceiverOptions.MaxSimultaneousMessagesPerQueue)
                        {
                            await Task.Delay(500, _token).ConfigureAwait(false);
                        }

                        _connection = new RedisMQConnection(Connection);
                        await _connection.SubscribeAsync(_messageHandlerDelegate).ConfigureAwait(false);

                        Core.Log.Warning("The listener has been resumed.");
                    }

                    await Task.Delay(1000, _token).ConfigureAwait(false);
                }
                catch (TaskCanceledException) { }
                catch (Exception ex)
                {
                    Core.Log.Write(ex);
                    if (!_token.IsCancellationRequested)
                    {
                        await Task.Delay(2000, _token).ConfigureAwait(false);
                    }
                }
            }
        }