Пример #1
0
        /// <summary>Send message async
        /// </summary>
        public async ValueTask <ResponseMessage> SendMessageAsync(RequestMessage request, int timeoutMillis = 5000)
        {
            if (_clientChannel == null)
            {
                throw new ArgumentNullException("Socket client should connect first!");
            }
            if (!_clientChannel.IsWritable)
            {
                _manualResetEventSlim.Wait();
            }

            var sequence         = Interlocked.Increment(ref _sequence);
            var messageReqPacket = new MessageReqPacket()
            {
                Sequence = sequence,
                Code     = request.Code,
                Body     = request.Body,
            };
            var tcs            = new TaskCompletionSource <ResponseMessage>();
            var responseFuture = new ResponseFuture(request.Code, timeoutMillis, tcs);

            if (!_responseFutureDict.TryAdd(sequence, responseFuture))
            {
                throw new Exception($"Add 'ResponseFuture' failed. Sequence:{sequence}");
            }
            await _clientChannel.WriteAndFlushAsync(messageReqPacket);

            return(await tcs.Task);
        }
Пример #2
0
        public Task <RemotingResponse> InvokeAsync(RemotingRequest request, int timeoutMillis)
        {
            EnsureClientStatus();

            request.Type = RemotingRequestType.Async;
            var taskCompletionSource = new TaskCompletionSource <RemotingResponse>();
            var responseFuture       = new ResponseFuture(request, timeoutMillis, taskCompletionSource);

            if (!_responseFutureDict.TryAdd(request.Sequence, responseFuture))
            {
                throw new ResponseFutureAddFailedException(request.Sequence);
            }

            _clientSocket.QueueMessage(RemotingUtils.BuildRequestMessage(request));

            return(taskCompletionSource.Task);
        }
Пример #3
0
        internal virtual object Invoke(StateMachine stateMachine, System.Reflection.MethodInfo method, object arg)
        {
            if (method.Name.Equals("toString"))
            {
                return(_me.ToString());
            }

            if (method.Name.Equals("equals"))
            {
                return((( StateMachineProxyHandler )Proxy.getInvocationHandler(arg)).StateMachineProxyFactory.me.Equals(_me));
            }

            string conversationId = _conversations.NextConversationId;

            try
            {
                MessageType typeAsEnum = ( MessageType )Enum.valueOf(stateMachine.MessageType, method.Name);
//JAVA TO C# CONVERTER WARNING: Java wildcard generics have no direct equivalent in .NET:
//ORIGINAL LINE: org.neo4j.cluster.com.message.Message<?> message = org.neo4j.cluster.com.message.Message.internal(typeAsEnum, arg);
                Message <object> message = Message.@internal(typeAsEnum, arg);
                if (_me != null)
                {
                    message.SetHeader(Message.HEADER_CONVERSATION_ID, conversationId).setHeader(Message.HEADER_CREATED_BY, _me.ToString());
                }

                if (method.ReturnType.Equals(Void.TYPE))
                {
                    _stateMachines.process(message);
                    return(null);
                }
                else
                {
                    ResponseFuture future = new ResponseFuture(conversationId, typeAsEnum, _responseFutureMap);
                    _responseFutureMap[conversationId] = future;
                    _log.debug("Added response future for conversation id %s", conversationId);
                    _stateMachines.process(message);

                    return(future);
                }
            }
            catch (System.ArgumentException)
            {
                throw new System.InvalidOperationException("No state machine can handle the method " + method.Name);
            }
        }
        public async ValueTask <ResponseMessage> SendMessageAsync(RequestMessage request, int timeoutMillis = 3000)
        {
            var sequence         = Interlocked.Increment(ref _sequence);
            var messageReqPacket = new MessageReqPacket()
            {
                Sequence = sequence,
                Code     = request.Code,
                Body     = request.Body,
            };
            var tcs            = new TaskCompletionSource <ResponseMessage>();
            var responseFuture = new ResponseFuture(request.Code, timeoutMillis, tcs);

            if (!_responseFutureDict.TryAdd(sequence, responseFuture))
            {
                throw new Exception($"Add 'ResponseFuture' failed. Sequence:{sequence}");
            }

            //await _easyClient.SendAsync<MessageReqPacket>();

            //await _clientChannel.WriteAndFlushAsync(messageReqPacket);
            return(await tcs.Task);
        }
Пример #5
0
 public override bool Process <T1>(Message <T1> message)
 {
     if (_responseFutureMap.Count > 0)
     {
         if (!message.HasHeader(Message.HEADER_TO))
         {
             string         conversationId = message.GetHeader(Message.HEADER_CONVERSATION_ID);
             ResponseFuture future         = _responseFutureMap[conversationId];
             if (future != null)
             {
                 if (future.setPotentialResponse(message))
                 {
                     _responseFutureMap.Remove(conversationId);
                 }
             }
             else
             {
                 _log.warn("Unable to find the client (with the conversation id %s) waiting for the response %s.", conversationId, message);
             }
         }
     }
     return(true);
 }
Пример #6
0
 public virtual void CancelRequest()
 {
     // ResponseFuture.Cancel(true);
     ResponseFuture.Dispose();
     NotifyActionEvent(QQActionEventType.EVT_CANCELED, null);
 }
        public async Task <IResponse> RequestAsync(IRequest request, DeviceOperationScope scope, AsyncOperationInfo operationInfo)
        {
            IResponse result = null;

            await clearUnreadBytesAsync();

            var requestData   = request.Serialized.ToArray();
            var sendRequestOk = await tryWriteToPort(requestData, operationInfo);

            if (!sendRequestOk)
            {
                result = request.BuildErrorResponse(RequestStatus.CONNECTION_INTERFACE_ERROR);
            }
            else
            {
                await Logger.LogRequestAsync(requestData);

                try
                {
                    using (var future = new ResponseFuture(_port.Pipe, request.Timeout, operationInfo))
                    {
                        result = await request.DeserializeResponseAsync(future, operationInfo);
                    }
                }
                catch (TimeoutException)
                {
                    result = request.BuildErrorResponse(RequestStatus.READ_TIMEOUT);
                }
                catch (IOException)
                {
                    result = request.BuildErrorResponse(RequestStatus.CONNECTION_INTERFACE_ERROR);
                }
                catch (OperationCanceledException)
                {
                    result = request.BuildErrorResponse(RequestStatus.CONNECTION_INTERFACE_ERROR);
                }
                catch
                {
                    result = request.BuildErrorResponse(RequestStatus.UNKNOWN_ERROR);
                }
            }

            return(result);

            async Task clearUnreadBytesAsync()
            {
                var clearOperation = await CommonUtils.TryAsync(async() => await _port.Pipe.ClearReadBufferAsync(operationInfo));

                if (clearOperation.Ok)
                {
                    if (clearOperation.Result.BytesRead != 0)
                    {
                        Logger.LogWarning(null, $"Обнаружены несчитанные данные в буфере приема! Это означает, что устройство отправило больше данных чем предполагалось. -NLДлина: {clearOperation.Result.Data.Count()} -NLДанные={clearOperation.Result.Data.Take(1000).Select(b => b.ToString("X2")).AsString(" ")}");
                    }
                }
                else
                {
                    Logger.LogError(null, $"Ошибка очистки буфера чтения порта. Порт был закрыт?");
                }
            }
        }