public async Task Subscribe_HandlerThrows_DisposesReader( string topic, byte[] message, IDisposableBlockingRawMessageReader <IPollingOptions> reader, [Frozen] IPollingOptions options, [Frozen] IRawMessageHandler rawMessageHandler, [Frozen] IBlockingRawMessageReaderFactory <IPollingOptions> factory, BlockingReaderRawMessageHandlerSubscriber <IPollingOptions> sut) { // Arrange factory.Create(topic, options).Returns(reader); var disposeEvent = new ManualResetEventSlim(); reader.When(r => r.Dispose()).Do(r => disposeEvent.Set()); reader.TryGetMessage(out var _, options) .Returns(r => { r[0] = message; return(true); }); rawMessageHandler.Handle(topic, message, Arg.Any <CancellationToken>()) .Throws <ArgumentNullException>(); // Act await sut.Subscribe(topic, rawMessageHandler, None); // Assert Assert.True(disposeEvent.Wait(1000)); }
public void Handle(IRawMessage rawMessage) { try { _rawMessageHandler.Handle(rawMessage); } catch (Exception ex) { var encodedMessage = Convert.ToBase64String(rawMessage.Payload); var format = "Failed to process message: {message}"; _logger.LogError(0, ex, format, encodedMessage); } }
/// <summary> /// Starts receiving syslog messages /// </summary> /// <param name="token">CancellationToken to stop the server</param> /// <returns></returns> public Task Start(CancellationToken token) { return(Task.Run(async() => { using (var udpClient = _updClientFactory()) { while (!token.IsCancellationRequested) { var received = await udpClient.ReceiveAsync() .WithCancellation(token) .ConfigureAwait(false); _rawMessageHandler.Handle( new RawMessage(received.RemoteEndPoint, received.Buffer)); } token.ThrowIfCancellationRequested(); } }, token)); }