Exemple #1
0
 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);
 }
Exemple #2
0
 private void CleanupProxy(bool notifyStop)
 {
     if (_handlerProxy != null)
     {
         _handlerProxy.TearDown(notifyStop);
         _handlerProxy = null;
     }
 }
Exemple #3
0
        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);
        }