public virtual async Task PublishAsync(object message, Dictionary <string, string> headers, CancellationToken cancellationToken = default) { await CheckMessage(message, cancellationToken); var transportMsg = await _serializer.SerializeAsync(new Message(headers, message)); await _transport.SendAsync(transportMsg, cancellationToken); }
private async Task ListenRpc(IConsumer <string, string> consumer, CancellationToken cancellationToken) { while (!cancellationToken.IsCancellationRequested) { try { var msg = consumer.Consume(cancellationToken); var replayToHeader = msg.Message.Headers.FirstOrDefault(x => x.Key == "ReplayTo")?.GetValueBytes(); if (replayToHeader != null) { if (OnRpcRequest != null) { foreach (var inv in OnRpcRequest.GetInvocationList()) { var result = await(Task <string>) inv.DynamicInvoke(msg.Message.Value, msg.Topic); if (result != null) { await _transportSender.SendAsync(Encoding.UTF8.GetString(replayToHeader), result, false); break; } } } _logger.LogInformation($"{DateTime.Now} Processed"); } } catch (Exception e) { _logger.LogError(e, "Error while processing rpc request"); } } }
private async Task WritePacketAsync(SendPacket packet) { _connectedEvent.WaitOne(); try { // determine if we know the payload length and end if (!packet.IsLengthKnown) { var count = await packet.Payload.ReadAsync(_sendContentBuffer, 0, TransportConstants.MaxPayloadLength).ConfigureAwait(false); packet.Header.PayloadLength = count; packet.Header.End = count == 0; } int length; var headerLength = HeaderSerializer.Serialize(packet.Header, _sendHeaderBuffer, 0); // Send: Packet Header length = await _sender.SendAsync(_sendHeaderBuffer, 0, headerLength).ConfigureAwait(false); if (length == 0) { throw new TransportDisconnectedException(); } var offset = 0; // Send content in chunks if (packet.Header.PayloadLength > 0 && packet.Payload != null) { // If we already read the buffer, send that // If we did not, read from the stream until we've sent that amount if (!packet.IsLengthKnown) { // Send: Packet content length = await _sender.SendAsync(_sendContentBuffer, 0, packet.Header.PayloadLength).ConfigureAwait(false); if (length == 0) { throw new TransportDisconnectedException(); } } else { do { var count = Math.Min(packet.Header.PayloadLength - offset, TransportConstants.MaxPayloadLength); // copy the stream to the buffer count = await packet.Payload.ReadAsync(_sendContentBuffer, 0, count).ConfigureAwait(false); // Send: Packet content length = await _sender.SendAsync(_sendContentBuffer, 0, count).ConfigureAwait(false); if (length == 0) { throw new TransportDisconnectedException(); } offset += count; }while (offset < packet.Header.PayloadLength); } } if (packet.SentCallback != null) { Background.Run(() => packet.SentCallback(packet.Header)); } } #pragma warning disable CA1031 // Do not catch general exception types catch (Exception e) #pragma warning restore CA1031 // Do not catch general exception types { var disconnectedArgs = new DisconnectedEventArgs() { Reason = e.Message, }; Disconnect(disconnectedArgs); } }