public async Task Send(UnicastTransportOperation operation, CancellationToken cancellationToken) { var dispatchDecision = await shouldSend(operation, cancellationToken).ConfigureAwait(false); if (dispatchDecision == false) { return; } // The destination might be in a queue@destination format var destination = operation.Destination; var queue = QueueAddress.Parse(destination); var connectionString = addressing.Map(queue); var sendClient = createQueueClients.Create(connectionString); var q = addressGenerator.GetQueueName(queue.QueueName); var sendQueue = sendClient.GetQueueReference(q); if (!await ExistsAsync(sendQueue).ConfigureAwait(false)) { throw new QueueNotFoundException { Queue = queue.ToString() }; } var toBeReceived = operation.GetTimeToBeReceived(); var timeToBeReceived = toBeReceived.HasValue && toBeReceived.Value < TimeSpan.MaxValue ? toBeReceived : null; if (timeToBeReceived != null && timeToBeReceived.Value == TimeSpan.Zero) { var messageType = operation.Message.Headers[Headers.EnclosedMessageTypes].Split(',').First(); logger.WarnFormat("TimeToBeReceived is set to zero for message of type '{0}'. Cannot send operation.", messageType); return; } // user explicitly specified TimeToBeReceived that is not TimeSpan.MaxValue - fail if (timeToBeReceived != null && timeToBeReceived.Value > CloudQueueMessageMaxTimeToLive && timeToBeReceived != TimeSpan.MaxValue) { var messageType = operation.Message.Headers[Headers.EnclosedMessageTypes].Split(',').First(); throw new InvalidOperationException($"TimeToBeReceived is set to more than 30 days for message type '{messageType}'."); } if (timeToBeReceived.HasValue) { var seconds = Convert.ToInt64(Math.Ceiling(timeToBeReceived.Value.TotalSeconds)); if (seconds <= 0) { throw new Exception($"Message cannot be sent with a provided delay of {timeToBeReceived.Value.TotalMilliseconds} ms."); } timeToBeReceived = TimeSpan.FromSeconds(seconds); } var wrapper = BuildMessageWrapper(operation, queue); await Send(wrapper, sendQueue, timeToBeReceived ?? CloudQueueMessageMaxTimeToLive).ConfigureAwait(false); }
Task SendMessage(UnicastTransportOperation transportOperation) { Logger.Debug("Send to " + transportOperation.Destination); var toBeReceived = transportOperation.GetTimeToBeReceived(); var timeToBeReceived = toBeReceived.HasValue && toBeReceived.Value < TimeSpan.MaxValue ? toBeReceived : null; if (timeToBeReceived != null && timeToBeReceived.Value == TimeSpan.Zero) { var messageType = transportOperation.Message.Headers[Headers.EnclosedMessageTypes].Split(',').First(); Logger.WarnFormat("TimeToBeReceived is set to zero for message of type '{0}'. Cannot send operation.", messageType); return(Task.FromResult(0)); } // TimeToBeReceived was not specified on message - go for maximum set by SDK if (timeToBeReceived == TimeSpan.MaxValue) { timeToBeReceived = null; } var messageWrapper = BuildMessageWrapper(transportOperation, toBeReceived, transportOperation.Destination); var topic = producerFactory.GetProducer().Topic(transportOperation.Destination); var messageStream = new MemoryStream(); KafkaTransportInfrastructure.GetSerializer().Serialize(messageWrapper, messageStream); return(topic.Produce(messageStream.ToArray())); }