Zschimmer GmbH Impressum und Kontakt

Job Scheduler     Erste Seite

  XML     API     Register


logo

Spooler-Skripte als COM-Klassen implementieren

 1. Juli 2002

 

Bisher wird ein Skript im Spooler mit einer Scripting Engine realisiert. Das Skript in einer Skriptsprache (VBScript, JScript, PerlScript) wird direkt im Element <script> angegeben.

Ein Spooler-Skript lässt sich auch als com-Klasse implementieren. Die com-Klasse kann in jeder Sprache, die com unterstützt, implementiert werden, u.a. C++, Delphi und VisualBasic. Mit Hilfe von "Windows Script Component" lässt sich die com-Klasse auch mit VBScript, JScript und PerlScript realisieren.

Die Klasse stellt die Methoden eines Jobs, Thread-Skripts oder Spooler-Skripts bereit, also:

spooler_init()
spooler_exit()
spooler_open()
spooler_close()
spooler_process()
spooler_on_success()
spooler_on_error()

Jede Methode ist optional. Ist sie nicht implementiert, wird wie bei den bisherigen Spooler-Skripten verfahren.

Die Klasse sollte außerdem eine Methode bereitstellen, mit der der Spooler-Kontext übergeben wird:

spooler_set_context(context)

Dieser Kontext ist ein com-Objekt (IDispatch) mit folgenden Eigenschaften:

log
spooler
thread
job
task

Diese Eigenschaften liefern die aus dem Spooler-Skripten bekannten Objekte spooler_log, spooler_task, spooler_job, spooler_thread und spooler.

Gemeinsamkeiten von Skript in Scripting Engine und com-Klasse

Unterschiede zwischen Skript in Scripting Engine und com-Klasse

 

Skript mit Scripting Engine

COM-Klasse

Quellcode wird in der Konfiguration angegeben (oder extern mit <include>).

Implementierung ist unabhänging vom Spooler. Jede Sprache, die COM-Klassen mit später Bindung (IDispatch) generiert, kann verwendet werden.

Der Kontext steht dem Skript mit den vordefinierten Variablen spooler_log, spooler, spooler_thread, spooler_job und spooler_task zur Verfügung. 

Der Spooler übergibt den Kontext dem com-Objekt mit dessen Methode spooler_set_context().

Dasselbe Skript kann, wenn es in einer eigenen Datei vorliegt, mit <include> an mehreren Stellen verwendet werden.

Die Klasse kann an mehreren Stellen verwendet werden. Es werden getrennte Objekte der Klasse angelegt.

Attribut use_engine="task" und ="job" möglich

Attribut use_engine="task" und ="job" möglich

 

Deklaration in der Spooler-Konfiguration 


Der als com-Klasse registrierte Job kann über seinen Klassennamen angegeben werden:

<job name="delphijob">
    <script com_class="meine_spooler_job_klasse"/>
</job>



Statt des Klassennamens kann auch die eindeutige clSID angegeben werden:

<job name="delphijob">
    <script com_class="{F44FF458-D4DE-4cef-AA1A-CCC507346581}"/>
</job>

Attribut use_engine

Das Attribut use_engine kann auch für ein COM-Objekt verwendet werden. Bei use_engine="job" wird das Objekt für mehrere Tasks beibehalten. Wie bisher wird spooler_init() nur einmal, spooler_open() aber für jede Task (jeden Jobstart) aufgerufen. Die Bedeutung ist dieselbe wie bisher.

Direkte Angabe der DLL

Wenn die DLL eine weitere DLL braucht, die nicht geladen werden kann, hält Windows den Spooler mit einer Messagebox an. Erst wenn der OK-Knopf gedrückt wird, setzt der Spooler fort. Die Angabe der DLL ist also nicht für den unbeaufsichtigten Betrieb geeignet.

Wenn die com-Klasse nicht registiert werden soll, kann auch die DLL direkt angegeben werden. Die Klasse wird dann als hexadezimale CLSID angegeben.

<job name="delphijob">
    <script com_class="{xxxx-xx-...}" filename="meine_delphi.dll"/>
</job>

Beispiel

Die com-Klasse wird mit "Windows Script Component" realisiert. Die Quelle ist:

<?XML version="1.0"?>
<component>
    <registration
        progid      = "Joacim.Component"
        classid     = "{F44FF458-D4DE-4cef-AA1A-CCC507346581}"
        description = "Joacims Script Component"
        version     = "1"
    />

    <public>
        <method name="spooler_set_context"/>
        <method name="spooler_init"/>
        <method name="spooler_exit"/>
        <method name="spooler_open"/>
        <method name="spooler_process"/>
    </public>

    <script language="VBScript">
    <![CDATA[

dim spooler_log
dim spooler_task
dim i

function spooler_set_context(c)
    set spooler_log  = c.log
    set spooler_task = c.task
    spooler_log "Script component spooler_set_context"
end function

function spooler_init
    spooler_log "Script component spooler_init"
end function

function spooler_exit
    spooler_log "Script component spooler_exit"
end function

function spooler_open
    spooler_log "Script component spooler_open"
    i = 3
end function

function spooler_process
    spooler_log "Script component spooler_process i=" & i
    i = i - 1
    spooler_process = i > 0
end function

    ]]>
    </script>
</component>


Diese Quelle wird in die Datei job.wsc geschrieben und mit folgendem Kommando als COM-Server registriert.

regsvr32 job.wsc 


In der Spooler-Konfiguration kann der Server mit seinem Klassennamen angegeben werden:

<job name="component">
    <script com_class="Joacim.Component"/>
    <run_time once="yes"/>
</job>


Oder mit seiner eindeutigen CLSID:

<job name="component">
    <script com_class="{F44FF458-D4DE-4cef-AA1A-CCC507346581}"/>
    <run_time once="yes"/>
</job>

Unix

Die Portierung auf Unix ist trotz com prinzipiell möglich. Statt der späten Bindung über die Schnittstelle IDispatch wird die frühe Bindung verwendet. Das heißt:


Software- und Organisations-Service GmbH

Zuletzt geändert von Joacim Zschimmer, 2005-09-25