Defining Application Config

Below given is the illustrated config file with the comment for each attribute. Each section is explained in greater details below.

<?xml version="1.0"?>
<configuration>
  <configSections>
    <sectionGroup name="xecMe.Core" type="XecMe.Configuration.XecMeSectionGroup, XecMe.Configuration, Version=1.2.0.0, Culture=neutral, PublicKeyToken=e34de6d98c38471a">
      <section name="extensions" type="XecMe.Configuration.ExtensionsSection, XecMe.Configuration, Version=1.2.0.0, Culture=neutral, PublicKeyToken=e34de6d98c38471a"/>
      <section name="taskManager" type="XecMe.Core.Configuration.TaskManagerSection, XecMe.Core, Version=1.2.0.0, Culture=neutral, PublicKeyToken=e34de6d98c38471a"/>
    </sectionGroup>
  </configSections>
  <xecMe.Core>
    <extensions>
      <taskRunners>
        <!-- Whatever is defined in the name below the same tags are to be used in taskRunners section under taskManager -->
        <!-- The type is the type of the element for the defined tag -->
        <!-- One can implement other type of TaskRunner by inheriting from TaskRunner class-->
        <!-- TaskRunnerElement inheriting from TaskRunnerElement class-->
        <add name="parallelTaskRunner" type="XecMe.Core.Configuration.ParallelTaskRunnerElement, XecMe.Core, Version=1.2.0.0, Culture=neutral, PublicKeyToken=e34de6d98c38471a"/>
        <add name="timerTaskRunner" type="XecMe.Core.Configuration.TimerTaskRunnerElement, XecMe.Core, Version=1.2.0.0, Culture=neutral, PublicKeyToken=e34de6d98c38471a"/>
        <add name="eventTaskRunner" type="XecMe.Core.Configuration.EventTaskRunnerElement, XecMe.Core, Version=1.2.0.0, Culture=neutral, PublicKeyToken=e34de6d98c38471a"/>
        <add name="scheduledTaskRunner" type="XecMe.Core.Configuration.ScheduledTaskRunnerElement, XecMe.Core, Version=1.2.0.0, Culture=neutral, PublicKeyToken=e34de6d98c38471a"/>
      </taskRunners>
      <settings>
        <!-- IBatchProcess is needed if you are configuring a batch process-->
        <add name="IBatchProcess" type="Sample.MyBatch, Sample, Version=1.0.0.0, PublicKeyToken=null, Culture=neutral"/>
        <!-- IService is needed if you are configuring a batch process-->
        <add name="IService" type="Sample.MyService, Sample, Version=1.0.0.0, PublicKeyToken=null, Culture=neutral"/>
      </settings>
    </extensions>
    <taskManager>
      <taskRunners>
        <eventTaskRunner name="Order Process" 
                 taskType="Fully Qualified Task Name of ITask" 
                 eventTopic="Name of the event" 
                 threadOption="BackgroundParallel">
          <!-- Parameters serve as input parameters to the task-->
          <parameters>
            <parameter name="test1" value="val1"/>
            <parameter name="test2" value="val2"/>
            <parameter name="test3" value="val3"/>
          </parameters>
        </eventTaskRunner>
        <!-- The taskType attribute should be an impletementation of ITask-->
        <timerTaskRunner name="Queue monitor" 
                         taskType="Fully Qualified Type Name of ITask implementation should go here" 
                         interval="time between the triggers"
                         startDateTime="Start date time for this task"
                         endDateTime="End date time for this task" 
                         dayStartTime="Start time of the day"
                         dayEndTime="End time of the day"
                         recurrence="number of time"
                         timeZone="time zone id string - task will be triggered for this time zone">
          <!-- Parameters serve as input parameters to the task-->
          <parameters>
            <parameter name="test1" value="val1"/>
            <parameter name="test2" value="val2"/>
            <parameter name="test3" value="val3"/>
          </parameters>
        </timerTaskRunner>
        <parallelTaskRunner name="Parallel Task" 
                          taskType="Fully qualified type" 
                          minInstances="2" 
                          maxInstances="10">
          <parameters>
            <parameter name="test1" value="val1"/>
            <parameter name="test2" value="val2"/>
            <parameter name="test3" value="val3"/>
          </parameters>
        </parallelTaskRunner>
        
        <scheduledTaskRunner name="Scheduled Task"
                             taskType="Fully qualified task type"
                             repeat="Skip every x days/weeks/months"
                             recursion="Daily|Weekly|Monthly" 
                             startDate="Date for initial reference"
                             taskTime="Time at which task is triggered"
                             schedule="schedule string for Weekly / Monthly recursion"
                             timeZone="time zone id string - task will be triggered for this time zone">
          <parameters>
            <parameter name="test1" value="val1"/>
            <parameter name="test2" value="val2"/>
            <parameter name="test3" value="val3"/>
          </parameters>
        </scheduledTaskRunner>
      </taskRunners>
    </taskManager>
  </xecMe.Core>
</configuration>

XecMe Config Section

XecMe uses 2 sections currently viz.
extensions - The section caches dynamic configuration elements that can be used else where in the configuration
taskManager - This is used to define the task in the system. These tasks are defined by the config elements defined in the previous section (extensions)
<configSections>
    <sectionGroup name="xecMe.Core" type="XecMe.Configuration.XecMeSectionGroup, XecMe.Configuration, Version=1.2.0.0, Culture=neutral, PublicKeyToken=e34de6d98c38471a">
      <section name="extensions" type="XecMe.Configuration.ExtensionsSection, XecMe.Configuration, Version=1.2.0.0, Culture=neutral, PublicKeyToken=e34de6d98c38471a"/>
      <section name="taskManager" type="XecMe.Core.Configuration.TaskManagerSection, XecMe.Core, Version=1.2.0.0, Culture=neutral, PublicKeyToken=e34de6d98c38471a"/>
    </sectionGroup>
</configSections>

extensions Section

The extensions section is for configuring other new configuration element that can be used in the config. In the snippet given below we are defining new configuration elements parallelTaskRunner, timerTaskRunner, eventTaskRunner and scheduledTaskRunner those are used in the taskRunners section explained later. There is also settings section that can be used as appSettings of the config
<extensions>
      <taskRunners>
        <add name="parallelTaskRunner" type="XecMe.Core.Configuration.ParallelTaskRunnerElement, XecMe.Core, Version=1.2.0.0, Culture=neutral, PublicKeyToken=e34de6d98c38471a"/>
        <add name="timerTaskRunner" type="XecMe.Core.Configuration.TimerTaskRunnerElement, XecMe.Core, Version=1.2.0.0, Culture=neutral, PublicKeyToken=e34de6d98c38471a"/>
        <add name="eventTaskRunner" type="XecMe.Core.Configuration.EventTaskRunnerElement, XecMe.Core, Version=1.2.0.0, Culture=neutral, PublicKeyToken=e34de6d98c38471a"/>
        <add name="scheduledTaskRunner" type="XecMe.Core.Configuration.ScheduledTaskRunnerElement, XecMe.Core, Version=1.2.0.0, Culture=neutral, PublicKeyToken=e34de6d98c38471a"/>
      </taskRunners>
      <settings>
        <!-- IBatchProcess is needed if you are configuring a batch process-->
        <add name="IBatchProcess" type="Sample.MyBatch, Sample, Version=1.0.0.0, PublicKeyToken=null, Culture=neutral"/>
        <!-- IService is needed if you are configuring a batch process-->
        <add name="IService" type="Sample.MyService, Sample, Version=1.0.0.0, PublicKeyToken=null, Culture=neutral"/>
      </settings>
</extensions>

taskManager Section

This section is for the user to define the tasks in the system/process. As defined in the earlier section there are 4 types of runners that can be used to configure the task.

<taskManager>
    <taskRunners>
      <!-- 
       Different task runners are defining the task appear in the section.
       The order of appearance does not matter
      -->
    </taskRunners>
</taskManager>

Timer Task Runner


<timerTaskRunner name="Queue monitor" 
                 taskType="Fully Qualified Type Name of ITask implementation should go here" 
                 interval="time between the triggers"
                 startDateTime="Start date time for this task"
                 endDateTime="End date time for this task" 
                 dayStartTime="Start time of the day"
                 dayEndTime="End time of the day"
                 recurrence="number of time"
                 timeZone="time zone id string - task will be triggered for this time zone">
  <!-- Parameters serve as input parameters to the task-->
  <parameters>
    <parameter name="test1" value="val1"/>
    <parameter name="test2" value="val2"/>
    <parameter name="test3" value="val3"/>
  </parameters>
</timerTaskRunner>

Event Task Runner


<eventTaskRunner name="Order Process" 
            taskType="Fully Qualified Task Name of ITask" 
            eventTopic="Name of the event" 
            threadOption="BackgroundParallel|BackgroundSerial|Publisher">
  <!-- Parameters serve as input parameters to the task-->
  <parameters>
    <parameter name="test1" value="val1"/>
    <parameter name="test2" value="val2"/>
    <parameter name="test3" value="val3"/>
  </parameters>
</eventTaskRunner>

Parallel Task Runner

<parallelTaskRunner name="Parallel Task" 
                taskType="Fully qualified type" 
                minInstances="2" 
                maxInstances="10">
  <parameters>
    <parameter name="test1" value="val1"/>
    <parameter name="test2" value="val2"/>
    <parameter name="test3" value="val3"/>
  </parameters>
</parallelTaskRunner>

Scheduled Task Runner

<scheduledTaskRunner name="Scheduled Task"
                taskType="Fully qualified task type"
                repeat="Skip every x days/weeks/months"
                recursion="Daily|Weekly|Monthly" 
                startDate="Date for initial reference"
                taskTime="Time at which task is triggered"
                schedule="schedule string for Weekly / Monthly recursion"
                timeZone="time zone id string - task will be triggered for this time zone">
  <parameters>
    <parameter name="test1" value="val1"/>
    <parameter name="test2" value="val2"/>
    <parameter name="test3" value="val3"/>
  </parameters>
</scheduledTaskRunner>

Parameters

Task that are implemented can be parametric. For instance, if you want to write a reusable task like FTPing file to a partners site. The parameters for this task are URL, directory, user id, password and file name. These thing can be configured local to the task runner instead of cluttering in the appSettings.
<parameters>
  <parameter name="url" value="sftp.example.com"/>
  <parameter name="userId" value="user"/>
  <parameter name="pwd" value="password"/>
  <parameter name="dir" value="/data/"/>
  <parameter name="file" value="DATA_*.CSV"/>
</parameters>