Пример #1
0
        public async Task <OperateResult> SendAsync(TransportMessage transportMessage)
        {
            try
            {
                Connect();

                var message = new Microsoft.Azure.ServiceBus.Message
                {
                    MessageId     = transportMessage.GetId(),
                    Body          = transportMessage.Body,
                    Label         = transportMessage.GetName(),
                    CorrelationId = transportMessage.GetCorrelationId()
                };

                foreach (var header in transportMessage.Headers)
                {
                    message.UserProperties.Add(header.Key, header.Value);
                }

                await _topicClient.SendAsync(message);

                _logger.LogDebug($"Azure Service Bus message [{transportMessage.GetName()}] has been published.");

                return(OperateResult.Success);
            }
            catch (Exception ex)
            {
                var wrapperEx = new PublisherSentFailedException(ex.Message, ex);

                return(OperateResult.Failed(wrapperEx));
            }
        }
        public async Task <OperateResult> SendAsync(TransportMessage message)
        {
            var producer = _connectionPool.RentProducer();

            try
            {
                var headers = new Confluent.Kafka.Headers();

                foreach (var header in message.Headers)
                {
                    headers.Add(header.Value != null
                        ? new Header(header.Key, Encoding.UTF8.GetBytes(header.Value))
                        : new Header(header.Key, null));
                }

                var result = await producer.ProduceAsync(message.GetName(), new Message <string, byte[]>
                {
                    Headers = headers,
                    Key     = message.GetId(),
                    Value   = message.Body
                });

                if (result.Status == PersistenceStatus.Persisted || result.Status == PersistenceStatus.PossiblyPersisted)
                {
                    _logger.LogDebug($"kafka topic message [{message.GetName()}] has been published.");

                    return(OperateResult.Success);
                }

                var ex = new PublisherSentFailedException("kafka message persisted failed!");

                return(OperateResult.Failed(ex));
            }
            catch (Exception ex)
            {
                var wapperEx = new PublisherSentFailedException(ex.Message, ex);

                return(OperateResult.Failed(wapperEx));
            }
            finally
            {
                var returned = _connectionPool.Return(producer);
                if (!returned)
                {
                    producer.Dispose();
                }
            }
        }
Пример #3
0
        public async Task <OperateResult> SendAsync(TransportMessage message)
        {
            var connection = _connectionPool.RentConnection();

            try
            {
                var msg = new Msg(message.GetName(), message.Body);
                foreach (var header in message.Headers)
                {
                    msg.Header[header.Key] = header.Value;
                }

                var js = connection.CreateJetStreamContext(_jetStreamOptions);

                var builder = PublishOptions.Builder().WithMessageId(message.GetId());

                var resp = await js.PublishAsync(msg, builder.Build());

                if (resp.Seq > 0)
                {
                    _logger.LogDebug($"NATS stream message [{message.GetName()}] has been published.");

                    return(OperateResult.Success);
                }

                throw new PublisherSentFailedException("NATS message send failed, no consumer reply!");
            }
            catch (Exception ex)
            {
                var warpEx = new PublisherSentFailedException(ex.Message, ex);

                return(OperateResult.Failed(warpEx));
            }
            finally
            {
                _connectionPool.Return(connection);
            }
        }
Пример #4
0
        public async Task <OperateResult> SendAsync(TransportMessage message)
        {
            var producer = _connectionPool.RentProducer();

            try
            {
                var headers = new Confluent.Kafka.Headers();

                foreach (var header in message.Headers)
                {
                    headers.Add(header.Value != null
                        ? new Header(header.Key, Encoding.UTF8.GetBytes(header.Value))
                        : new Header(header.Key, null));
                }

                var result = await producer.ProduceAsync(message.GetName(), new Message <string, byte[]>
                {
                    Headers = headers,
                    Key     = message.Headers.TryGetValue(KafkaHeaders.KafkaKey, out string kafkaMessageKey) && !string.IsNullOrEmpty(kafkaMessageKey) ? kafkaMessageKey : message.GetId(),
                    Value   = message.Body
                });

                if (result.Status == PersistenceStatus.Persisted || result.Status == PersistenceStatus.PossiblyPersisted)
                {
                    _logger.LogDebug($"kafka topic message [{message.GetName()}] has been published.");

                    return(OperateResult.Success);
                }

                throw new PublisherSentFailedException("kafka message persisted failed!");
            }
Пример #5
0
        public Task <OperateResult> SendAsync(TransportMessage message)
        {
            IModel channel = null;

            try
            {
                channel = _connectionChannelPool.Rent();

                channel.ConfirmSelect();

                var props = channel.CreateBasicProperties();
                props.DeliveryMode = 2;
                props.Headers      = message.Headers.ToDictionary(x => x.Key, x => (object)x.Value);

                channel.ExchangeDeclare(_exchange, RabbitMQOptions.ExchangeType, true);

                channel.BasicPublish(_exchange, message.GetName(), props, message.Body);

                channel.WaitForConfirmsOrDie(TimeSpan.FromSeconds(5));

                _logger.LogInformation("CAP message '{0}' published, internal id '{1}'", message.GetName(), message.GetId());

                return(Task.FromResult(OperateResult.Success));
            }
            catch (Exception ex)
            {
                var wrapperEx = new PublisherSentFailedException(ex.Message, ex);
                var errors    = new OperateError
                {
                    Code        = ex.HResult.ToString(),
                    Description = ex.Message
                };

                return(Task.FromResult(OperateResult.Failed(wrapperEx, errors)));
            }
            finally
            {
                if (channel != null)
                {
                    _connectionChannelPool.Return(channel);
                }
            }
        }