Ejemplo n.º 1
0
        public async Task Send(DMessage message, bool flush = true)
        {
            var buffer = await _messageEncoder.EncodeAsync(message, _gzip);

            if (_webSocket == null || _webSocket.State != WebSocketState.Open)
            {
                throw ErrorCodes.SystemError.CodeException($"WebSocket连接已关闭");
            }
            await _webSocket.SendAsync(new ReadOnlyMemory <byte>(buffer), WebSocketMessageType.Binary, flush,
                                       CancellationToken.None);
        }
Ejemplo n.º 2
0
        public async Task Send(DMessage message, bool flush = true)
        {
            if (!(message is MessageResult result))
            {
                return;
            }
            var data = await _encoder.EncodeAsync(result, _gzip);

            var contentLength = data.Length;

            _response.Headers.Add("Content-Type", "application/json");
            _response.Headers.Add("Content-Length", contentLength.ToString());
            await _response.Body.WriteAsync(data, 0, data.Length);

            if (flush)
            {
                await _response.Body.FlushAsync();
            }
        }
Ejemplo n.º 3
0
    public async Task PublishMessageAsync(MotorCloudEvent <TOutput> motorCloudEvent, CancellationToken token = default)
    {
        byte[] bytes, encodedBytes;
        using (new AutoObserveStopwatch(() => _messageSerialization))
        {
            bytes = _messageSerializer.Serialize(motorCloudEvent.TypedData);
        }

        using (new AutoObserveStopwatch(() => _messageEncoding))
        {
            encodedBytes = await _messageEncoder.EncodeAsync(bytes, token);
        }

        var bytesEvent = motorCloudEvent.CreateNew(encodedBytes, true);

        bytesEvent.SetMotorVersion();

        if (!_encodingOptions.IgnoreEncoding)
        {
            bytesEvent.SetEncoding(_messageEncoder.Encoding);
        }

        await _bytesMessagePublisher.PublishMessageAsync(bytesEvent, token);
    }
        /// <summary>
        /// Create engine
        /// </summary>
        public DataFlowProcessingEngine(IMessageTrigger messageTrigger, IMessageEncoder encoder,
                                        IMessageSink messageSink, IEngineConfiguration engineConfiguration, ILogger logger,
                                        IIdentity identity)
        {
            _config         = engineConfiguration;
            _messageTrigger = messageTrigger;
            _messageSink    = messageSink;
            _messageEncoder = encoder;
            _logger         = logger;
            _identity       = identity;

            if (_config.BatchSize.HasValue && _config.BatchSize.Value > 1)
            {
                _dataSetMessageBufferSize = _config.BatchSize.Value;
            }
            if (_config.MaxMessageSize.HasValue && _config.MaxMessageSize.Value > 0)
            {
                _maxEncodedMessageSize = _config.MaxMessageSize.Value;
            }

            _diagnosticInterval        = _config.DiagnosticsInterval.GetValueOrDefault(TimeSpan.Zero);
            _batchTriggerInterval      = _config.BatchTriggerInterval.GetValueOrDefault(TimeSpan.Zero);
            _diagnosticsOutputTimer    = new Timer(DiagnosticsOutputTimer_Elapsed);
            _batchTriggerIntervalTimer = new Timer(BatchTriggerIntervalTimer_Elapsed);
            _maxOutgressMessages       = _config.MaxOutgressMessages.GetValueOrDefault(4096); // = 1 GB

            _encodingBlock = new TransformManyBlock <DataSetMessageModel[], NetworkMessageModel>(
                async input => {
                try {
                    if (_dataSetMessageBufferSize == 1)
                    {
                        return(await _messageEncoder.EncodeAsync(input, _maxEncodedMessageSize).ConfigureAwait(false));
                    }
                    else
                    {
                        return(await _messageEncoder.EncodeBatchAsync(input, _maxEncodedMessageSize).ConfigureAwait(false));
                    }
                }
                catch (Exception e) {
                    _logger.Error(e, "Encoding failure");
                    return(Enumerable.Empty <NetworkMessageModel>());
                }
            },
                new ExecutionDataflowBlockOptions());

            _batchDataSetMessageBlock = new BatchBlock <DataSetMessageModel>(
                _dataSetMessageBufferSize,
                new GroupingDataflowBlockOptions());

            _batchNetworkMessageBlock = new BatchBlock <NetworkMessageModel>(
                _networkMessageBufferSize,
                new GroupingDataflowBlockOptions());

            _sinkBlock = new ActionBlock <NetworkMessageModel[]>(
                async input => {
                if (input != null && input.Any())
                {
                    _logger.Debug("Sink block in engine {Name} triggered with {count} messages",
                                  Name, input.Length);
                    await _messageSink.SendAsync(input).ConfigureAwait(false);
                }
                else
                {
                    _logger.Warning("Sink block in engine {Name} triggered with empty input",
                                    Name);
                }
            },
                new ExecutionDataflowBlockOptions());
            _batchDataSetMessageBlock.LinkTo(_encodingBlock);
            _encodingBlock.LinkTo(_batchNetworkMessageBlock);
            _batchNetworkMessageBlock.LinkTo(_sinkBlock);

            _messageTrigger.OnMessage      += MessageTriggerMessageReceived;
            _messageTrigger.OnCounterReset += MessageTriggerCounterResetReceived;

            if (_diagnosticInterval > TimeSpan.Zero)
            {
                _diagnosticsOutputTimer.Change(_diagnosticInterval, _diagnosticInterval);
            }
        }
Ejemplo n.º 5
0
 /// <summary> 编码 </summary>
 /// <param name="encoder"></param>
 /// <param name="message"></param>
 /// <param name="gzip"></param>
 /// <returns></returns>
 public static byte[] Encode(this IMessageEncoder encoder, object message, bool gzip = true)
 {
     return(encoder.EncodeAsync(message, gzip).ConfigureAwait(false).GetAwaiter().GetResult());
 }
Ejemplo n.º 6
0
        protected async Task <IByteBuffer> GetByteBuffer(DMessage message, bool gzip)
        {
            var data = await _messageEncoder.EncodeAsync(message, gzip);

            return(Unpooled.WrappedBuffer(data));
        }