Exemple #1
0
            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);
            }
        }