public bool Start() { lock (_lockObject) { // Do not start if handler is in failed state if (_handlerState == HandlerState.Failed) { return(false); } if (_handlerProxy == null) { _appDomain = CreateDomain(); RunningHandlerProxy proxy; var initResult = InitializeAndStartRunningHandler(out proxy); if (initResult.HasError) { _logger.Error("Handler: Init failed: {0}: {1}", initResult.ErrorReason, initResult.ErrorMessage); SetFailed(); return(false); } _handlerProxy = proxy; _lastStartTime = DateTime.Now; _handlerMessage = String.Empty; } _handlerState = HandlerState.Running; } return(true); }
private void CleanupProxy(bool notifyStop) { if (_handlerProxy != null) { _handlerProxy.TearDown(notifyStop); _handlerProxy = null; } }
private JobScriptInitializeResult InitializeAndStartRunningHandler(out RunningHandlerProxy handlerProxy) { // Create a proxy for the handler handlerProxy = (RunningHandlerProxy)_appDomain.CreateInstanceAndUnwrap(typeof(RunningHandlerProxy).Assembly.FullName, typeof(RunningHandlerProxy).FullName, false, BindingFlags.Default, null, new object[] { Id, _packageManager.PackageBaseFolder }, null, null); // Create a interchangeable event sink to register cross-domain events to catch logging events var sink = new EventSink <LogEventArgs>(); handlerProxy.RegisterLogEventSink(sink); sink.NotificationFired += (sender, args) => _logger.Log(args.LogEntry.SetHandlerId(Id)); // Register event sink to listen on state changes var stateSink = new EventSink <RunningHandlerStateChangedEventArgs>(); handlerProxy.RegisterStateChangedEventSink(stateSink); stateSink.NotificationFired += (sender, args) => { if (args.State == RunningHandlerState.Failed) { SetFailed(); } else if (args.State == RunningHandlerState.Finished) { SetFinished(); } }; // Initialize the handler var initParams = new RunningHandlerInitializeParams { HandlerSettings = HandlerSettings, JobHash = JobScript.Hash, PackageName = JobScript.PackageName, JobAssemblyPath = JobScriptAssembly }; var initResult = handlerProxy.InitializeAndStart(initParams); return(initResult); }