public async Task Should_be_asynchronous() { var shutdown = new CancellationTokenSource(); var inputAddress = new Uri("loopback://localhost/input_queue"); var transport = new InMemoryTransport(inputAddress, Environment.ProcessorCount); TaskCompletionSource <int> received = GetTask <int>(); IPipe <ReceiveContext> receivePipe = Pipe.New <ReceiveContext>(x => { x.UseFilter(new DelegateFilter <ReceiveContext>(context => { Console.WriteLine("Message: {0}", context.TransportHeaders.Get("MessageId", "N/A")); received.TrySetResult(1); })); }); ReceiveTransportHandle receiveHandle = ((IReceiveTransport)transport).Start(receivePipe); var sendEndpoint = new SendEndpoint(transport, new JsonMessageSerializer(), inputAddress, inputAddress); await sendEndpoint.Send(new A(), TestCancellationToken); await received.Task; shutdown.Cancel(); await receiveHandle.Stop(); }
public async Task Should_be_asynchronous() { var shutdown = new CancellationTokenSource(); var inputAddress = new Uri("loopback://localhost/input_queue"); var transport = new InMemoryTransport(inputAddress, Environment.ProcessorCount); TaskCompletionSource<int> received = GetTask<int>(); IPipe<ReceiveContext> receivePipe = Pipe.New<ReceiveContext>(x => { x.UseFilter(new DelegateFilter<ReceiveContext>(context => { Console.WriteLine("Message: {0}", context.TransportHeaders.Get("MessageId", "N/A")); received.TrySetResult(1); })); }); ReceiveTransportHandle receiveHandle = ((IReceiveTransport)transport).Start(receivePipe); var sendEndpoint = new SendEndpoint(transport, new JsonMessageSerializer(), inputAddress, inputAddress, new SendPipe(new MessageTypeSendFilter(), Pipe.Empty<SendContext>())); await sendEndpoint.Send(new A(), TestCancellationToken); await received.Task; shutdown.Cancel(); await receiveHandle.Stop(); }
private async Task MessageRecieved(object sender, BasicDeliverEventArgs e) { ReadOnlyMemory <byte> body = null; try { body = e.Body; var message = JsonSerializer.Deserialize <SendEmailMessage>(body.Span); string[] recipients = new string[] { }; if (message.To != null) { recipients = message.To.Select(recipient => recipient?.Email).ToArray(); } _logger.LogInformation( $"Recieved message to send to recipients: { string.Join(", ", recipients) }" + $" with subject: \"{ message.Subject }\", with { message.Attachments?.Count ?? 0 } attachments"); if (message.EventPayload == null) { message.Payload = new EmailPayload(); } var payload = new SendPayload { Messages = new[] { message }, SandboxMode = _sandboxMode }; for (var i = 0; i < _retriesCount; i++) { _logger.LogInformation($"Sending email { message.Payload.Id } { i + 1 }/{ _retriesCount }"); try { var response = await _sendEndpoint.Send(payload); _logger.LogInformation("Response:\n" + JsonSerializer.Serialize(response)); break; } catch (Exception exc) { _logger.LogError(exc, exc.Message); await Task.Delay(_retryDelay); if (i >= _retriesCount - 1) { var statusUpdateMessage = new UpdateStoredEmailStatusMessage { ErrorInfo = "SendWorker unable to send message to MailJet", EventPayload = new EmailPayload { Id = message.Payload.Id, Trackable = true }, Status = MailEventType.bounce, RecievedAt = DateTime.Now }; _channel.QueueDeclare(_statusUpdateQueueId, true, false, false, null); var serializedMessage = JsonSerializer.Serialize(statusUpdateMessage); var statusUpdateBody = Encoding.UTF8.GetBytes(serializedMessage); var properties = _channel.CreateBasicProperties(); properties.Persistent = true; _channel.BasicPublish("", _statusUpdateQueueId, false, properties, statusUpdateBody); } continue; } } } finally { _logger.LogInformation("Free message from queue"); _channel.BasicAck(e.DeliveryTag, false); } }