예제 #1
0
        /*
         * /// <summary>
         * /// Configure a trigger for an event to start a process.
         * /// </summary>
         * public void AddProcessTrigger(Func<RFEvent, bool> evaluator, RFEngineProcessDefinition processConfig)
         * {
         *  Triggers.Add(new RFSingleCommandTrigger(e => evaluator(e) ? new RFParamProcessInstruction(processConfig.Name, null) : null));
         * }
         */
        /// <summary>
        /// Define a new process inside the engine triggered by a key update.
        /// </summary>
        /// <param name="processName">Unique user-friendly name.</param>
        /// <param name="processor">
        /// Function that creates the processor (may pass static config etc.)
        /// </param>
        /// <param name="triggerKey">Key that triggers the execution (matched by root).</param>
        /// <returns></returns>
        public RFEngineProcessDefinition AddProcessWithCatalogTrigger <P>(string processName, string description, Func <IRFEngineProcessor> processor,
                                                                          RFCatalogKey triggerKey) where P : RFEngineProcessorParam
        {
            if (Processes.ContainsKey(processName))
            {
                throw new Exception(String.Format("Already registered process {0}", processName));
            }
            var p = processor(); // test instantiation

            //Func<RFInstruction, RFEngineProcessorParam> instanceParams = i => i.ExtractParam();// new P().ExtractFrom;

            var newProcess = new RFEngineProcessDefinition
            {
                Name           = processName,
                InstanceParams = i => i.ExtractParam()?.ConvertTo <P>(),
                Processor      = processor,
                Description    = description,
                IsExclusive    = p.IsExclusive
            };

            Processes.Add(processName, newProcess);

            AddCatalogUpdateTrigger <RFCatalogKey>(k => k.MatchesRoot(triggerKey), newProcess);

            return(newProcess);
        }
예제 #2
0
        /// <summary>
        /// Configure a trigger to run a process on each interval (for schedulers).
        /// </summary>
        /// <param name="processConfig"></param>
        public void AddIntervalTrigger(RFEngineProcessDefinition processConfig)
        {
            AddTrigger(new RFSingleCommandTrigger(e => e is RFIntervalEvent ie ?
                                                  new RFIntervalInstruction(processConfig.Name, ie) : null));

            /*AddCatalogUpdateTrigger<RFCatalogKey>(
             *  i => i.Equals(IntervalDocumentKey()),
             *  processConfig);*/
        }
예제 #3
0
        /// <summary>
        /// Configures process to automatically run after another process
        /// </summary>
        /// <param name="taskName"></param>
        /// <param name="triggeringProcess"></param>
        /// <param name="triggeredProcess"></param>
        /// <returns></returns>
        public RFEngineTaskDefinition AddChainedTask(string taskName, RFEngineProcessDefinition triggeringProcess, RFEngineProcessDefinition triggeredProcess, bool isSystem)
        {
            var task = new RFChainedEngineTaskDefinition
            {
                TaskName       = taskName,
                TaskProcess    = triggeredProcess,
                TriggerProcess = triggeringProcess,
                IsSystem       = isSystem
            };

            Tasks.Add(task);
            task.AddToEngine(this);
            return(task);
        }
예제 #4
0
        /// <summary>
        /// Configures process to automatically run based on configuration
        /// </summary>
        /// <param name="taskName"></param>
        /// <param name="process"></param>
        /// <param name="isExclusive">If set the task won't run concurrently</param>
        /// <param name="isSystem"></param>
        /// <returns></returns>
        public RFEngineTaskDefinition AddScheduledTask(string taskName, RFEngineProcessDefinition process, bool isSystem = false)
        {
            var task = new RFSchedulerTaskDefinition
            {
                RangeFunc     = c => RFSchedulerRange.ReadFromConfig(RFSchedulerTaskDefinition.CONFIG_SECTION, taskName, c.UserConfig),
                SchedulesFunc = c => RFSchedulerSchedule.ReadFromConfig(RFSchedulerTaskDefinition.CONFIG_SECTION, taskName, c.UserConfig).Single(),
                TaskName      = taskName,
                TaskProcess   = process,
                IsSystem      = isSystem
            };

            Tasks.Add(task);
            task.AddToEngine(this);
            return(task);
        }
예제 #5
0
        /// <summary>
        /// Define a new process inside the engine.
        /// </summary>
        /// <param name="processName">Unique user-friendly name.</param>
        /// <param name="processor">
        /// Function that creates the processor (may pass static config etc.)
        /// </param>
        /// <param name="instanceParams">
        /// Function that derives instance parameters based on processing instruction.
        /// </param>
        /// <returns></returns>
        public RFEngineProcessDefinition <P> AddProcess <P>(string processName, string description, Func <RFEngineProcessor <P> > processor, Func <RFInstruction, P> instanceParams = null) where P : RFEngineProcessorParam
        {
            if (Processes.ContainsKey(processName))
            {
                throw new Exception(String.Format("Already registered process {0}", processName));
            }
            var p          = processor(); // test instantiation
            var newProcess = new RFEngineProcessDefinition <P>
            {
                Name           = processName,
                InstanceParams = instanceParams ?? (i => i.ExtractParam()?.ConvertTo <P>()),
                Processor      = processor,
                Description    = description,
                IsExclusive    = p.IsExclusive
            };

            Processes.Add(processName, newProcess);
            return(newProcess);
        }
예제 #6
0
 public RFCatalogUpdateTrigger(Func <RFCatalogKey, bool> evaluatorFunc, RFEngineProcessDefinition processConfig) : base(
         e => ((e is RFCatalogUpdateEvent) && evaluatorFunc((e as RFCatalogUpdateEvent).Key)) ? new RFParamProcessInstruction(processConfig.Name, new RFEngineProcessorKeyParam((e as RFCatalogUpdateEvent).Key)) : null)
 {
 }
예제 #7
0
        /// <summary>
        /// Configures process to automatically run on catalog update
        /// </summary>
        /// <param name="taskName"></param>
        /// <param name="triggerKey"></param>
        /// <param name="process"></param>
        /// <returns></returns>
        public RFEngineTaskDefinition AddTriggeredTask(string taskName, RFCatalogKey triggerKey, RFEngineProcessDefinition process)
        {
            var task = new RFTriggeredEngineTaskDefinition
            {
                TriggerKey  = triggerKey,
                TaskName    = taskName,
                TaskProcess = process
            };

            Tasks.Add(task);
            task.AddToEngine(this);
            return(task);
        }
예제 #8
0
        /// <summary>
        /// Configures process to automatically run on specific schedule
        /// </summary>
        /// <param name="taskName"></param>
        /// <param name="schedules"></param>
        /// <param name="range"></param>
        /// <param name="process"></param>
        /// <returns></returns>
        public RFEngineTaskDefinition AddScheduledTask(string taskName, Func <List <RFSchedulerSchedule> > schedulesFunc, Func <RFSchedulerRange> rangeFunc, RFEngineProcessDefinition process, bool isSystem)
        {
            var task = new RFSchedulerTaskDefinition
            {
                RangeFunc     = _ => rangeFunc(),
                SchedulesFunc = _ => schedulesFunc(),
                TaskName      = taskName,
                TaskProcess   = process,
                IsSystem      = isSystem
            };

            Tasks.Add(task);
            task.AddToEngine(this);
            return(task);
        }
예제 #9
0
 /// <summary>
 /// Configures process to automatically run on specific schedule
 /// </summary>
 /// <param name="taskName"></param>
 /// <param name="schedules"></param>
 /// <param name="range"></param>
 /// <param name="process"></param>
 /// <returns></returns>
 public RFEngineTaskDefinition AddScheduledTask(string taskName, List <RFSchedulerSchedule> schedules, RFSchedulerRange range, RFEngineProcessDefinition process, bool isSystem)
 {
     return(AddScheduledTask(taskName, () => schedules, () => range, process, isSystem));
 }
예제 #10
0
 /// <summary>
 /// Configure a trigger for a catalog update to trigger a process (root-based matching)
 /// </summary>
 /// <typeparam name="K">Subclass of RFCatalogKey</typeparam>
 public void AddCatalogUpdateTrigger <K>(Func <K, bool> evaluator, RFEngineProcessDefinition processConfig) where K : RFCatalogKey
 {
     Triggers.Add(new RFCatalogUpdateTrigger(e => (e is K) && evaluator(e as K), processConfig));
 }
예제 #11
0
 public RFEngineProcess(string name, RFEngineProcessDefinition config, RFKeyDomain keyDomain)
 {
     Name      = name;
     Config    = config;
     KeyDomain = keyDomain;
 }