﻿<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="../scheduler.xsl" type="text/xsl"?>

<!--$Id: job.xml,v 1.11 2004/09/10 07:30:52 jz Exp $-->

<xml_element name     = "job" 
             title    = "Definition of jobs"
             category = "Configuration"
             base_dir = "../"
             parent_page = "../konfiguration.xml"
             author   = "$Author: jz $"
             date     = "$Date: 2008-07-07 12:28:53 +0200 (Mo, 07 Jul 2008) $">

    <xml_parent_elements>
        <xml_parent_element name="jobs">
        </xml_parent_element>
    </xml_parent_elements>

    <xml_attributes>
        <xml_attribute name="spooler_id" same_as_element="config"/>
<!--        
            <description>
                <p>
                    Kennung des <span class="sos_name">Schedulers</span>,
                    für den der Job bestimmt ist. Der Job wird vom <span class="sos_name">Scheduler</span>
                    nur berücksichtigt, wenn dieses Attribut nicht leer ist und mit der Option 
                    <scheduler_option name="spooler-id"/> vom <span class="sos_name">Scheduler</span>-Start übereinstimmt.
                </p>
            </description>
        </xml_attribute>
-->
        
        <xml_attribute name="name" type="jobname">
            <description>
                <p>
                    Every job has a unique name.
                <!--Jeder Job hat einen eigenen Namen.-->
                </p>
                <p>
                    Should a job with the same name be defined in one of the basic configurations, 
                    then this parameter can be used to change or supplement the settings made in that job.
                <!--Wenn ein Job mit demselben Namen in einer Basiskonfiguration bereit definiert worden ist,
                    können hier die Einstellungen des Jobs geändert oder ergänzt werden.-->
                </p>
            </description>
        </xml_attribute>
        
        <xml_attribute name="title" type="text">
            <description>
                A description of the job (max. 1 line).
            <!--Eine einzeilige Beschreibung des Jobs.-->
            </description>
        </xml_attribute>

        <xml_attribute name="order" type="yes_no" title="Order Controlled Job">
            <description>
                <p>
                    <code>order="yes"</code> defines a job as being order controlled.
                    The Job Scheduler will only start an order controlled job when an order for the job exists.
                <!--Bei <code>order="yes"</code> ist der Job auftragsgesteuert. 
                    Der Scheduler startet diesen Job nur, wenn ein Auftrag vorliegt.-->
                </p>
                <p>
                    A script can check this attribute using the 
                    <scheduler_method class="Job" property="order_queue"/> method.
                <!--Ein Skript kann mit <scheduler_method class="Job" property="order_queue"/> 
                    das Attribut prüfen.-->
                </p>
            </description>
        </xml_attribute>
        
        <xml_attribute name="process_class" type="process_class">
    <!--<xml_attribute name="process_class" type="prozessklasse">-->
            <description>
                Defines the name of the process class in which the job should run.
                Note that process classes are defined with <scheduler_element name="process_classes"/>.
            <!--Gibt den Namen der Prozessklasse an, in der Tasks dieses Jobs laufen sollen. 
                Die Prozessklassen werden mit <scheduler_element name="process_classes"/> definiert.-->
            </description>
        </xml_attribute>
        
        <xml_attribute name="tasks" type="number" initial="1" title="The maximum number of tasks">
    <!--<xml_attribute name="tasks" type="zahl" initial="1" title="Maximale Anzahl Tasks">-->
            <description>
                <p>
                    A number of tasks can run in parallel from one job. 
                    This attribute specifies the maximum number of tasks for a job.
                <!--Von einem Job können mehrere Tasks gleichzeitig laufen. Dieses Attribut begrenzt deren Anzahl.-->
                </p>
                <p>
                    <scheduler_element name="lock.use"/>: only <code>tasks="1"</code>, which only allows one task, 
                    makes sense in combination with an exclusive lock.
                <!--<scheduler_element name="lock.use"/>: Zusammen mit einer exklusiven Sperre ist nur <code>tasks="1"</code> sinnvoll,
                    sie erlaubt nur eine Task.-->
                </p>
            </description>
        </xml_attribute>
        
        <xml_attribute name="min_tasks" type="number" initial="0" title="The minimum number of tasks kept running">
    <!--<xml_attribute name="min_tasks" type="zahl" initial="0" title="Mindeste Anzahl der stets laufenden Tasks">-->
            <description>
                <p>
                    The Job Scheduler keeps this minimum number of tasks running.
                    This allows order controlled tasks, which require a long time to initialize, 
                    to be held in waiting.
                <!--Der Scheduler sorgt dafür, das wenigstens die angegebene Anzahl Tasks läuft.
                    So lassen sich auftragsgesteuerte Tasks in Bereitschaft bringen,
                    die sehr lange für ihre Initialisierung brauchen.-->
                </p>
                <p>
                    Note that the <scheduler_element name="job" attribute="tasks"/> element must be large enough.
                <!--<scheduler_element name="job" attribute="tasks"/> muss groß genug sein.-->
                </p>
                <p>
                    The Job Scheduler will start additional tasks when:
                <!--Der Scheduler startet weitere Tasks, wenn-->
                </p>
                <ul>
                    <li>
                        it is starting
                    <!--der Scheduler startet-->
                    </li>
                    <li>
                        a task has ended
                    <!--oder eine Task sich beendet hat-->
                    </li>
                    <li>
                        at the start of a new Period (<scheduler_element name="run_time"/>)
                    <!--oder eine neue Periode (<scheduler_element name="run_time"/>) beginnt-->
                    </li>
                    <li>
                        or the job is stopped by <scheduler_element name="modify_job" attribute="cmd" value="unstop"/>
                    <!--oder bei <scheduler_element name="modify_job" attribute="cmd" value="unstop"/>: der Job wird entstoppt-->
                    </li>
                    <li>
                        or all job tasks are continued with <scheduler_element name="modify_job" attribute="cmd" value="continue"/>
                    <!--oder bei <scheduler_element name="modify_job" attribute="cmd" value="continue"/>: alle Tasks des Jobs werden fortgesetzt-->
                    </li>
                    <li>
                        or the job is wakened by <scheduler_element name="modify_job" attribute="cmd" value="wake"/>
                    <!--oder bei <scheduler_element name="modify_job" attribute="cmd" value="wake"/>: der Job wird geweckt-->
                    </li>
                </ul>
                <ul>
                    <li>
                        and fewer tasks than specified in <code>min_tasks</code> are running
                    <!--und weniger Tasks laufen als mit <code>min_tasks</code> verlangt-->
                    </li>
                    <li>
                        and the start is allowed according to the <scheduler_element name="run_time"/> period
                    <!--und die <scheduler_element name="run_time"/> mit einer Periode den Start zulässt-->
                    </li>
                    <li>
                        and the job has either the <code>pending</code> or <code>running</code> states
                        (that is, it is not being stopped or has not already stopped).
                    <!--und der Job im Zustand <code>pending</code> oder <code>running</code> ist 
                        (also nicht gestoppt wird oder gestoppt ist).-->
                    </li>
                </ul>
                <p>
                    In order to prevent an overload, 
                    the Job Scheduler does not start any new tasks immediately after 
                    a task has been completed.
                    The completion of a task causes a new one to be started only in the following situations:
                <!--Um ein Heißlaufen zu verhindern, startet der Scheduler keine neuen Tasks,
                    nachdem sich eine sofort beendet hat.
                    Nur in folgenden Fällen führt das Ende einer Task zum Start einer neuen:-->
                </p>
                <ul>
                    <li>
                        <scheduler_method class="Job_impl" method="spooler_process"/> is called
                    <!--<scheduler_method class="Job_impl" method="spooler_process"/> wurde aufgerufen.-->
                    </li>
                    <li>
                        The task has been waiting some time on an order 
                        (the state <code>running_waiting_for_order</code>, 
                        when <scheduler_element name="job" attribute="idle_timeout" value="0"/>)
                    <!--Die Task wartete eine Zeitlang auf einen Auftrag 
                        (Zustand <code>running_waiting_for_order</code>, 
                        nicht wenn <scheduler_element name="job" attribute="idle_timeout" value="0"/>).-->
                    </li>
                    <li>
                        The task could start but is delayed by the 
                        <scheduler_method class="Task" property="delay_spooler_process"/> method
                    <!--Die Task startete, wurde aber mit
                        <scheduler_method class="Task" property="delay_spooler_process"/> verzögert.-->
                        <!-- Diesen Fall gibt es nicht, weil delay_spooler_process nur im spooler_process() wirkt, also spooler_process() gerufen worden ist. Stand 25.5.2006 -->
                    </li>
                    <li>
                        The task is a process
                        (<scheduler_element name="process"/> or 
                        <scheduler_element name="script" attribute="language" value="shell"/>)
                        and the process has not terminated itself immediately after starting
                    <!--Die Task ist ein Prozess 
                        (<scheduler_element name="process"/> oder 
                        <scheduler_element name="script" attribute="language" value="shell"/>)
                        und der Prozess hat sich nicht sofort nach Start beendet.-->
                    </li>
                </ul>
            </description>

            <messages>
                <message code="SCHEDULER-322" level="error"/>
                <message code="SCHEDULER-969" level="debug3"/>
                <message code="SCHEDULER-970" level="warn"/>
            </messages>

        </xml_attribute>

        <xml_attribute name="timeout" type="duration" title="The time allowed for an operation">
    <!--<xml_attribute name="timeout" type="dauer" title="Frist für eine Operation">-->
            <description>
                <p>
                    Limits the duration of a task operation (spooler_open, spooler_process etc.)
                    or the whole task for a non-API task 
                    (<scheduler_element name="process"/> or <scheduler_element name="script" attribute="language" value="shell"/>). 
                    An error does not occur when the priority of a job has not been set.
                    Should a task exceed the time allowed, then the Job Scheduler aborts the task.
                <!--Befristet eine Task-Operation (spooler_open, spooler_process etc.)
                    oder bei einer Nicht-API-Task 
                    (<scheduler_element name="process"/> oder <scheduler_element name="script" attribute="language" value="shell"/>)
                    die ganze Task. 
                    Nach Ablauf der Frist bricht der Scheduler die Task ab.-->
                </p>
                <p>
                    <i>duration</i> can be specified in seconds or 
                    in the <code>HH:MM</code> or <code>HH:MM:SS</code> formats.
                <!--<i>dauer</i> kann in Sekunden oder im Format <code>HH:MM</code> oder 
                    <code>HH:MM:SS</code> angegeben werden.-->
                </p>
            </description>
        </xml_attribute>
        
        <xml_attribute name="idle_timeout" type="duration" initial="5" title="Limit for the waiting_for_order state">
    <!--<xml_attribute name="idle_timeout" type="dauer" initial="5" title="Frist für den Zustand waiting_for_order">-->
            <description>
                <p>
                    Limits the idle time of an order controlled job (<code>order="yes"</code>).
                    When a task is waiting on the next order and this idle time is exceeded, 
                    then the Job Scheduler ends the task.
                <!--Begrenzt den Leerlauf eines auftragsgesteuerten Jobs (<code>order="yes"</code>).
                    Wenn eine Task auf den nächsten Auftrag wartet und in der Frist kein Auftrag
                    eintrifft, beendet der Scheduler sie.-->
                </p>
                <p>
                    The <i>duration</i> can be specified in seconds or in the 
                    <code>HH:MM</code> or <code>HH:MM:SS</code> formats.
                <!--<i>dauer</i> kann in Sekunden oder im Format <code>HH:MM</code> oder <code>HH:MM:SS</code> angegeben werden.-->
                </p>
                <p>
                    <code>idle_timeout="never"</code> allows a job to run indefinitely, 
                    only limited by <scheduler_element name="run_time"/>.
                <!--<code>idle_timeout="never"</code> lässt den Job unbegrenzt laufen, 
                    nur noch abhängig von <scheduler_element name="run_time"/>.-->
                </p>
                <p>
                    See also <scheduler_element name="job" attribute="force_idle_timeout"/>.
                <!--Siehe auch <scheduler_element name="job" attribute="force_idle_timeout"/>.-->
                </p>
            </description>
        </xml_attribute>


        <xml_attribute name="force_idle_timeout" type="yes_no" initial="no" title="Task ended by idle_timeout despite min_task">
    <!--<xml_attribute name="force_idle_timeout" type="yes_no" initial="no" title="idle_timeout beendet Task trotz min_task">-->
            <description>
                <p>
                    Note that this is only effective with <scheduler_element name="job" attribute="min_tasks" value="0" relation="≥"/>
                    and <scheduler_element name="job" attribute="idle_timeout"/>.
                <!--Nur wirksam mit <scheduler_element name="job" attribute="min_tasks" value="0" relation="≥"/>
                    und <scheduler_element name="job" attribute="idle_timeout"/>.-->
                </p>
                <p>
                    <code>force_idle_timeout="yes"</code> ends a task after 
                    <code>idle_timeout</code> has expired,
                    even when fewer tasks than specified in <code>min_tasks</code> are running.
                    <code>min_tasks</code> only starts new tasks after the task termination.
                <!--<code>force_idle_timeout="yes"</code> beendet nach Ablauf von 
                    <code>idle_timeout</code> die Task,
                    auch wenn daraufhin <code>min_tasks</code> unterschritten wird.
                    Erst anschließend führt <code>min_tasks</code> zum Start einer neuen Task.-->
                </p>
                <p>
                    In this way tasks can be ended which may not take up a resource
                    such as a database too long when idle.
                <!--Damit lassen sich Tasks beenden,
                    die im Leerlauf eine Ressource (z.B. eine Datenbank) nicht zu lange belegen dürfen,
                    weil diese sich sonst abkoppelt.-->
                </p>
            </description>
        </xml_attribute>
        
        
        <xml_attribute name="priority" type="process_priority">
    <!--<xml_attribute name="priority" type="process_priority">-->
            <description>
                <p>
                    Sets the priority of a task.
                <!--Gibt die Priorität des Jobs an. Eine Zahl zwischen 0 und 
                    der Einstellung von <code>&lt;config max_priority="..."></code>.-->
                </p>
            <!--<p>
                    A larger number means a higher priority.
                    The lowest and the highest priority values have particular meanings.
                    Priority 0 means that a task will only be carried out when no other task is running - 
                    that is, when there is nothing else to do.
                    The highest priority value means that a task will be given absolute precedence.
                    Tasks with a lower priority will be kept back until no other tasks with a higher priority are running.-->
                <!--Eine höhere Zahl bezeichnet eine höhere Priorität.
                    Die niedrigste und die höchste Priorität haben besondere
                    Bedeutungen: Priorität 0 lässt eine Task nur ausgeführen, wenn keine Task
                    mit höherer Priorität läuft, wenn also sonst nichts zu tun ist. Die höchste
                    Priorität gibt absoluten Vorrang. Tasks mit niedriger Priorität werden solange
                    angehalten, bis keine Task mit der höchsten Priorität mehr läuft.
                </p>-->
                <p>
                    This attribute can be given the following values: 
                <!--Eingestellt können die Werte -->
                    <code>idle</code>,
                    <code>below_normal</code>,
                    <code>normal</code>,
                    <code>above_normal</code> and
                <!--<code>above_normal</code> und-->
                    <code>high</code>
                    or the numerical values allowed for the operating system being used.
                <!--oder die numerischen Werte des Betriebsystems.-->
                </p>
                <p>
                    An error does not occur when the priority of a job is not set.
                <!--Wenn die Priorität nicht gesetzt werden kann, führt das nicht zu einem Fehler.-->
                </p>
                <p>
                    A task with a higher priority can block the computer.
                <!--Ein Prozess mit hoher Priorität kann Ihren Rechner blockieren.-->
                </p>
                <p>
                    See
                <!--Siehe-->
                    <scheduler_method class="Task" property="priority_class"/>.
                </p>
            </description>
        </xml_attribute>
        

        <xml_attribute name="temporary" type="yes_no">
            <description>
                <p>
                    <code>temporary="yes"</code> defines a job as being temporary.
                    This setting is only for <scheduler_element name="add_jobs"/>.
                    A job will then be deleted after being carried out and will no longer be recognized.
                <!--Bei <code>temporary="yes"</code> ist der Job temporär.
                    Nur für <scheduler_element name="add_jobs"/>.
                    Nach der Ausführung wird der Job gelöscht und ist dann unbekannt.-->
                </p>
            </description>
        </xml_attribute>


        <xml_attribute name="java_options" type="string">
            <description>
                <p>
                    Is only effective when a job runs as its own process
                    (see <scheduler_element name="process_classes"/>) 
                    and either the job or monitor is implemented in Java.
                    The options are handed over together with the 
                    <scheduler_element name="config" attribute="java_options"/> Java options.
                    The interpretation of these options depends on Java.
                <!--Wirkt nur, wenn der Job als eigener Prozess ausgeführt wird 
                    (s. <scheduler_element name="process_classes"/>) und der Job oder der Monitor in Java implementiert ist.
                    Die Optionen werden zusammen mit den Optionen aus 
                    <scheduler_element name="config" attribute="java_options"/> Java übergeben.
                    Wie gleichnamige Optionen interpretiert werden, hängt von Java ab.-->
                </p>
            </description>
        </xml_attribute>


        <xml_attribute name="visible" type="yes|no|never" initial="yes">
            <description>
                <p>
                    <code>visible="no"</code> and <code>visible="never"</code> make a job invisible in the results of 
                    <scheduler_element name="show_jobs"/> and
                    <scheduler_element name="show_state"/>.
                <!--<code>visible="no"</code> lässt den Job im Ergebnis von 
                    <scheduler_element name="show_jobs"/> und
                    <scheduler_element name="show_state"/> 
                    unsichtbar.-->
                </p>
                <p>
                    The Job Scheduler makes a job visible as soon as a task has been loaded when <code>visible="no"</code> is set.
                    When <code>visible="never"</code> is set, then this job will never be returned when querying using the 
                    <scheduler_element name="show_state"/> command.
                <!--Bei <code>visible="no"</code> setzt der Scheduler den Job sichtbar, sobald eine Task eingereiht wird.
                    Bei <code>visible="never"</code> ist das nicht der Fall.-->
                </p>
            </description>
        </xml_attribute>

        <xml_attribute name="ignore_signals" type="all|signalnames" initial="no">
            <description>
                <p>
                    Is only relevant for UNIX systems.
                <!--Wirksam nur unter Unix.-->
                </p>
                <p>
                    A job whose task process ends with a signal, causes the job to be stopped.
                    Signals are sent when the task ends either by way of the <code>kill</code> system command or
                    by way of a program being aborted.
                <!--Ein Job, dessen Task-Prozess mit Signal abbricht, führt zum Stopp des Jobs.
                    Ursache eines Signals ist ein Abbruch der Task durch das System-Kommando <code>kill</code> oder
                    durch einen Programmabbruch.-->
                </p>
                <p>
                    If <code>ignore_signals</code> has not been specified, 
                    then a task ending with a signal stops the job (with the message <scheduler_message code="SCHEDULER-279"/>).
                <!--Wenn <code>ignore_signals</code> nicht angegeben ist, 
                    stoppt eine mit Signal abbrechene Task den Job (mit Meldung <scheduler_message code="SCHEDULER-279"/>).-->
                </p>
                <p>
                    <code>ignore_signals="all"</code> means that a job will not be stopped by a signal.
                <!--<code>ignore_signals="all"</code> lässt den Job nicht stoppen.-->
                </p>
                <p>
                    A list of signal names (separated by blanks) can be specified instead of <code>"all"</code>.
                    The following signal names are recognized, depending on the operating system:
                <!--Statt <code>"all"</code> können Sie auch eine Liste von Signalnamen angeben (durch Leerzeichen getrennt).
                    Dabei sind, abhängig vom Betriebssystem, diese Signalnamen bekannt:-->
                    <code>SIGHUP</code>,
                    <code>SIGINT</code>,
                    <code>SIGQUIT</code>,
                    <code>SIGILL</code>,
                    <code>SIGTRAP</code>,
                    <code>SIGABRT</code>,
                    <code>SIGIOT</code>,
                    <code>SIGBUS</code>,
                    <code>SIGFPE</code>,
                    <code>SIGKILL</code>,
                    <code>SIGUSR1</code>,
                    <code>SIGSEGV</code>,
                    <code>SIGUSR2</code>,
                    <code>SIGPIPE</code>,
                    <code>SIGALRM</code>,
                    <code>SIGTERM</code>,
                    <code>SIGSTKFLT</code>,
                    <code>SIGCHLD</code>,
                    <code>SIGCONT</code>,
                    <code>SIGSTOP</code>,
                    <code>SIGTSTP</code>,
                    <code>SIGTTIN</code>,
                    <code>SIGTTOU</code>,
                    <code>SIGURG</code>,
                    <code>SIGXCPU</code>,
                    <code>SIGXFSZ</code>,
                    <code>SIGVTALRM</code>,
                    <code>SIGPROF</code>,
                    <code>SIGWINCH</code>,
                    <code>SIGPOLL</code>,
                    <code>SIGIO</code>,
                    <code>SIGPWR</code> und
                    <code>SIGSYS</code>.
                    Signal names which are not recognized by an operating system are ignored and a warning given.
                <!--Signal-Namen, die das Betriebsystem nicht kennt, werden mit Warnung ignoriert.-->
                </p>
                <p>
                    Note that because a task ending with a signal which may be ignored can 
                    cause a TCP connection error (<code>ECONNRESET</code>),
                    the Job Scheduler is so configured that TCP connection errors only lead to a job being stopped 
                    when <code>ignore_signals="…"</code> does not apply.
                    The Job Scheduler reacts to this situation with the <scheduler_message code="SCHEDULER-974"/> message.
                <!--Weil eine mit einem zu ignorierenden Signal abbrechende Task 
                    trotzdem zuerst einen TCP-Verbindungsfehler (<code>ECONNRESET</code>) hervorruft,
                    führen TCP-Verbindungsfehler nur dann zum Stopp des Jobs, wenn
                    <code>ignore_signals="…"</code> nicht zutrifft.
                    Der Scheduler weist mit der Meldung <scheduler_message code="SCHEDULER-974"/> darauf hin.-->
                </p>
                <p>
                    See also <scheduler_element name="commands" attribute="on_exit_code" value="SIGTERM"/> 
                    and the Gnu <code>man 7 signal</code> command.
                <!--Siehe auch <scheduler_element name="commands" attribute="on_exit_code" value="SIGTERM"/> 
                    und das Gnu-Kommando <code>man 7 signal</code>.-->
                </p>
            </description>

            <example>
                <pre>&lt;job name="my_job" ignore_signals="SIGTERM SIGKILL"></pre>
            </example>

            <messages>
                <message level="warn" code="SCHEDULER-279"/>
                <message level="warn" code="SCHEDULER-337"/>
                <message level="info" code="SCHEDULER-974"/>
            </messages>
        </xml_attribute>

        <xml_attribute name="stop_on_error" type="yes|no" initial="yes">
            <description>
                <p>
                    The default <code>stop_on_error="yes"</code> setting stops a job 
                    when a task ends with an exception or has an "<code>[ERROR]</code>" message in its log file.
                    An error message can then be written, for example with 
                    <scheduler_method class="Log" object="spooler_log" method="error"/>.
                <!--Die Voreinstellung <code>stop_on_error="yes"</code> stoppt den Job,
                    wenn eine Task mit Exception oder 
                    mit einer Fehlermeldung "<code>[ERROR]</code>" in ihrem Task-Protokoll endet.
                    Eine Fehlermeldung kann z.B. mit <scheduler_method class="Log" object="spooler_log" method="error"/> 
                    geschrieben werden.-->
                </p>
                <p>
                    Specifying <code>stop_on_error="no"</code> does not allow a job to be stopped in this situation. 
                    Should <scheduler_method class="Job_impl" method="spooler_process"/>
                    end with an exception, then the Job Scheduler sets the order in the error state
                    (<scheduler_element name="job_chain_node" attribute="error_state"/>).
                <!--<code>stop_on_error="no"</code> lässt den Job in diesen Fällen nicht stoppen.
                    Endet 
                    <scheduler_method class="Job_impl" method="spooler_process"/> mit Exception,
                    versetzt der Scheduler den Auftrag in den Fehlerzustand
                    (<scheduler_element name="job_chain_node" attribute="error_state"/>).-->
                </p>
                <p>
                    This setting is not effective, when either
                    <scheduler_element name="delay_after_error"/> or
                    <scheduler_method class="Job" property="delay_after_error"/> are used.
                <!--Die Einstellung kat keine Wirkung, wenn 
                    <scheduler_element name="delay_after_error"/> oder
                    <scheduler_method class="Job" property="delay_after_error"/> verwendet wird.-->
                </p>
            </description>
            
            <messages>
                <message level="debug3" code="SCHEDULER-977"/>
                <message level="debug3" code="SCHEDULER-978"/>
                <message level="warn"   code="SCHEDULER-846"/>
            </messages>
        </xml_attribute>

        <xml_attribute name="replace" type="yes|no" initial="yes">
            <description>
                <p>
                    <code>replace="yes"</code> causes any already existing job definition
                    to be replaced.
                    Should this not be possible - for example because a task is running - 
                    then the Job Scheduler will replace the job later.
                <!--<code>replace="yes"</code> lässt diese Job-Definition eine evtl. bereits vorhandene ersetzen.
                    Wenn das nicht möglich ist, weil z.B. gerade eine Task läuft,
                    dann ersetzt der Scheduler den Job später.-->
                </p>
                <p>
                    An order controlled job (<scheduler_element name="job" attribute="order" value="yes"/>)
                    cannot be replaced.
                <!--Ein auftragsgesteuerte Job (<scheduler_element name="job" attribute="order" value="yes"/>)
                    kann nicht ersetzt werden.-->
                </p>
            </description>

            <messages>
            <!--<message level="error" code="SCHEDULER-229"/>-->
            <!--<message level="info" code="SCHEDULER-988"/>-->
            <!--<message level="info" code="SCHEDULER-989"/>-->
            </messages>
        </xml_attribute>

    </xml_attributes>


    <xml_child_elements>
        <xml_child_element name="description"/>
        <xml_child_element name="lock.use"                     multiple="yes"/>
        <xml_child_element name="environment"/>
        <xml_child_element name="params"/>
        <xml_child_element name="script"/>
        <xml_child_element name="process"/>
        <xml_child_element name="monitor"/>
        <xml_child_element name="start_when_directory_changed" multiple="yes"/>
        <xml_child_element name="delay_after_error"            multiple="yes"/>
        <xml_child_element name="delay_order_after_setback"    multiple="yes"/>
        <xml_child_element name="run_time"/>
        <xml_child_element name="commands"                     multiple="yes" title="Commands carried out after the end of a task"/>
    <!--<xml_child_element name="commands"                     multiple="yes" title="Nach Ende der Task auszuführende Kommandos"/>-->
    </xml_child_elements>

    
    <behavior_with_xml_element element="base" complete_attribute="name"/>
    
    <description>
        <p>
            Defines a job with program code, runtime, etc.
        <!--Definiert einen Job mit Programmcode, Laufzeit usw.-->
        </p>
    </description>
    
        
</xml_element>
