コード例 #1
0
        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);
        }
コード例 #2
0
        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");
                }
            }
        }
コード例 #3
0
        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);
            }
        }