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); }
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); }