Job Scheduler Erste Seite |
| 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:
Zuletzt geändert von Joacim Zschimmer, 2005-09-25 |