Beispiel #1
0
        public Task PublishAsync(string topicName, byte[] message, CancellationToken cancellationToken = default)
        {
            if (string.IsNullOrEmpty(topicName))
            {
                throw new ArgumentException("TopicName is null or empty", nameof(topicName));
            }

            var tcs = new TaskCompletionSource <bool>();

            lock (_publisherAsyncLock)
            {
                if (_publisherChannel == null)
                {
                    var connection = _connection.GetConnection();
                    _publisherChannel = connection.CreateModel();
                    _publisherChannel.ConfirmSelect();
                    _publisherChannel.BasicAcks  += (sender, ea) => ExecuteUnconfirmedActions(_publisherUnconfirmedActions, ea.DeliveryTag, ea.Multiple, true);
                    _publisherChannel.BasicNacks += (sender, ea) => ExecuteUnconfirmedActions(_publisherUnconfirmedActions, ea.DeliveryTag, ea.Multiple, false);
                }

                var props = _publisherChannel.CreateBasicProperties();
                props.DeliveryMode = 2; // persistent delivery mode
                var nextPublishSeqNo = _publisherChannel.NextPublishSeqNo;

                RegisterUnconfirmedAction(_publisherUnconfirmedActions, tcs, nextPublishSeqNo, cancellationToken);

                var routingKey = RabbitMapper.GetRoutingKey(topicName);
                _publisherChannel.BasicPublish(_rabbitOptions.Exchange, routingKey, props, message);
                _logger.LogDebug("Published message with topic [{}]", topicName);
            }

            return(tcs.Task);
        }
Beispiel #2
0
        public RabbitConsumer(IRabbitFactoryConnection connection,
                              string serviceName, string topicName,
                              Func <GateContext, CancellationToken, Task> messageHandler,
                              Action abortedHandler,
                              bool autoDelete,
                              int maxConcurrentMessages,
                              RabbitOptions options, ILogger logger)
        {
            ServiceName = string.IsNullOrEmpty(serviceName) ?
                          throw new ArgumentException("ServiceName null or empty", nameof(serviceName)) : serviceName;
            TopicName = string.IsNullOrEmpty(topicName) ?
                        throw new ArgumentException("TopicName null or empty", nameof(topicName)) : topicName;
            AutoDelete            = autoDelete;
            MaxConcurrentMessages = maxConcurrentMessages;
            _messageHandler       = messageHandler ?? throw new ArgumentNullException(nameof(messageHandler));

            if (abortedHandler == null)
            {
                throw new ArgumentNullException(nameof(abortedHandler));
            }

            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }
            _logger = logger ?? throw new ArgumentNullException(nameof(logger));

            var queueName  = RabbitMapper.GetQueueName(ServiceName, TopicName);
            var routingKey = RabbitMapper.GetRoutingKey(TopicName);

            _consumer = new RabbitInternalConsumer(connection, options.Exchange, queueName, routingKey, AutoDelete, (ushort)MaxConcurrentMessages, HandleMessage,
                                                   abortedHandler);
        }