Esempio n. 1
0
        public Task StartProcessAsync()
        {
            using (_metricsLogger.LatencyEvent(MetricEventNames.ProcessStart))
            {
                Process = CreateWorkerProcess();
                try
                {
                    Process.ErrorDataReceived  += (sender, e) => OnErrorDataReceived(sender, e);
                    Process.OutputDataReceived += (sender, e) => OnOutputDataReceived(sender, e);
                    Process.Exited             += (sender, e) => OnProcessExited(sender, e);
                    Process.EnableRaisingEvents = true;

                    _workerProcessLogger?.LogDebug($"Starting worker process with FileName:{Process.StartInfo.FileName} WorkingDirectory:{Process.StartInfo.WorkingDirectory} Arguments:{Process.StartInfo.Arguments}");
                    Process.Start();
                    _workerProcessLogger?.LogDebug($"{Process.StartInfo.FileName} process with Id={Process.Id} started");

                    Process.BeginErrorReadLine();
                    Process.BeginOutputReadLine();

                    // Register process only after it starts
                    _processRegistry?.Register(Process);

                    RegisterWithProcessMonitor();

                    return(Task.CompletedTask);
                }
                catch (Exception ex)
                {
                    _workerProcessLogger.LogError(ex, $"Failed to start Worker Channel. Process fileName: {Process.StartInfo.FileName}");
                    return(Task.FromException(ex));
                }
            }
        }
Esempio n. 2
0
        public Task StartWorkerProcessAsync()
        {
            _startSubscription = _inboundWorkerEvents.Where(msg => msg.MessageType == MsgType.StartStream)
                                 .Timeout(TimeSpan.FromSeconds(LanguageWorkerConstants.ProcessStartTimeoutSeconds))
                                 .Take(1)
                                 .Subscribe(SendWorkerInitRequest, HandleWorkerError);

            var workerContext = new WorkerContext()
            {
                RequestId        = Guid.NewGuid().ToString(),
                MaxMessageLength = LanguageWorkerConstants.DefaultMaxMessageLengthBytes,
                WorkerId         = _workerId,
                Arguments        = _workerConfig.Arguments,
                WorkingDirectory = _rootScriptPath,
                ServerUri        = _serverUri,
            };

            _process = _processFactory.CreateWorkerProcess(workerContext);
            StartProcess();
            _processRegistry?.Register(_process);

            _state = LanguageWorkerChannelState.Initializing;

            return(Task.CompletedTask);
        }
Esempio n. 3
0
        public Task StartProcessAsync()
        {
            try
            {
                _process.ErrorDataReceived  += (sender, e) => OnErrorDataReceived(sender, e);
                _process.OutputDataReceived += (sender, e) => OnOutputDataReceived(sender, e);
                _process.Exited             += (sender, e) => OnProcessExited(sender, e);
                _process.EnableRaisingEvents = true;

                _workerProcessLogger?.LogInformation($"Starting language worker process:{_process.StartInfo.FileName} {_process.StartInfo.Arguments}");
                _process.Start();
                _workerProcessLogger?.LogInformation($"{_process.StartInfo.FileName} process with Id={_process.Id} started");

                _process.BeginErrorReadLine();
                _process.BeginOutputReadLine();

                // Register process only after it starts
                _processRegistry?.Register(_process);
                return(Task.CompletedTask);
            }
            catch (Exception ex)
            {
                _workerProcessLogger.LogError(ex, "Failed to start Language Worker Channel for language :{_runtime}", _runtime);
                return(Task.FromException(ex));
            }
        }
Esempio n. 4
0
        public Process StartProcess()
        {
            try
            {
                _process.ErrorDataReceived  += (sender, e) => OnErrorDataReceived(sender, e);
                _process.OutputDataReceived += (sender, e) => OnOutputDataReceived(sender, e);
                _process.Exited             += (sender, e) => OnProcessExited(sender, e);
                _process.EnableRaisingEvents = true;

                _workerProcessLogger?.LogInformation($"Starting language worker process:{_process.StartInfo.FileName} {_process.StartInfo.Arguments}");
                _process.Start();
                _workerProcessLogger?.LogInformation($"{_process.StartInfo.FileName} process with Id={_process.Id} started");

                _process.BeginErrorReadLine();
                _process.BeginOutputReadLine();

                // Register process only after it starts
                _processRegistry?.Register(_process);
            }
            catch (Exception ex)
            {
                throw new HostInitializationException($"Failed to start Language Worker Channel for language :{_runtime}", ex);
            }

            return(_process);
        }
Esempio n. 5
0
        // send capabilities to worker, wait for WorkerInitResponse
        internal void InitWorker(RpcEvent startEvent)
        {
            _processRegistry?.Register(_process);

            _inboundWorkerEvents.Where(msg => msg.MessageType == MsgType.WorkerInitResponse)
            .Timeout(timeoutInit)
            .Take(1)
            .Subscribe(WorkerReady, HandleWorkerError);

            Send(new StreamingMessage
            {
                WorkerInitRequest = new WorkerInitRequest()
                {
                    HostVersion = ScriptHost.Version
                }
            });
        }
        // start worker process and wait for an rpc start stream response
        internal void StartWorker()
        {
            _startSubscription = _inboundWorkerEvents.Where(msg => msg.MessageType == MsgType.StartStream)
                                 .Timeout(processStartTimeout)
                                 .Take(1)
                                 .Subscribe(InitWorker, HandleWorkerError);

            var workerContext = new WorkerCreateContext()
            {
                RequestId        = Guid.NewGuid().ToString(),
                MaxMessageLength = _scriptConfig.MaxMessageLengthBytes,
                WorkerId         = _workerId,
                Arguments        = _workerConfig.Arguments,
                WorkingDirectory = _scriptConfig.RootScriptPath,
                ServerUri        = _serverUri,
            };

            _process = _processFactory.CreateWorkerProcess(workerContext);
            StartProcess();
            _processRegistry?.Register(_process);
        }