public byte[] Encode(BaseMessage message)
        {
            var bytes = message.GetBytes();

            var sendBytes = new byte[BaseMessage.HeaderLength + bytes.Length];

            Array.Copy(BitConverter.GetBytes(bytes.Length), sendBytes, sizeof(int));
            Array.Copy(bytes, 0, sendBytes, BaseMessage.HeaderLength, bytes.Length);

            return sendBytes;
        }
Beispiel #2
0
        private async Task SendData(string data, string method)
        {
            var message = new BaseMessage
            {
                Success = true,
                Data    = data,
                Method  = method
            };

            var bytes = await message.GetBytes();

            int count  = 1024;
            int offset = 0;

            do
            {
                await _stream.WriteAsync(bytes, offset, count);

                offset += count;
            } while (offset < bytes.Length);
        }
        public async Task <BaseMessage> CallAsync(BaseMessage message, CancellationToken cToken)
        {
            cToken.ThrowIfCancellationRequested();

            var coId  = Guid.NewGuid().ToString();
            var props = _channel.CreateBasicProperties();

            props.CorrelationId = coId;
            props.ReplyTo       = _replyQueueName;

            var tcs = new TaskCompletionSource <BaseMessage>();

            _callbackMapper.TryAdd(coId, tcs);

            _channel.BasicPublish(
                exchange: "",
                routingKey: "rpc_queue",
                basicProperties: props,
                body: message.GetBytes()
                );

            _channel.BasicConsume(
                consumer: _consumer,
                queue: _replyQueueName,
                autoAck: true
                );

            cToken.Register(() => _callbackMapper.TryRemove(coId, out var _));

            tcs.Task.Wait(cToken);

            var response = await tcs.Task;

            Console.WriteLine(response.GenerateLog());

            return(response);
        }