Search the FirstSpirit Knowledge Base
Hi zusammen,
ich habe ein script geschrieben mit dem man eine Packet version erstellt und verteilt. Dieses Script lässt sich über das Menü ausführen. Nun möchte ich dieses Script über einen Scheduler-Auftrag dieses Script in bestimmten Intervalen automatisch laufen zu lassen.
Ich habe nun eine Funktion unter:
de.espirit.firstspirit.access.script.Executable
gefunden.
In der Api wird die Funktion wie folgt beschrieben:
execute(Map<String,Object> context)
Delegates to Executable.execute(java.util.Map, java.io.Writer, java.io.Writer)
, e.g. with System.out
and System.err
as second / third parameter.
Was mir nicht ganz klar ist: was genau stellt die map dar und was erwartet die Funktion?
Hat jemand damit schon Erfahrung?
Hallo Herr Dirlewanger,
in jetztigen FS-Versionen (ab 4.2 R4) wird eine solche Executable class sinnvollerweise als Public-Komponente definiert.
Vergl. hierzu: Kapitel 2.9.1.7 Public der Dokumentation "Entwicklerhandbuch für Komponenten"
Hallo Herr Gockel,
vielen Dank für Ihre schnelle Antwort.
D.h. damit die Klasse vom classloader beim ausführen eines Auftrags gefunden wird, muss diese in einer Public-Komponente liegen?
Jars von anderen Komponenten wie von mir vorgeschlagen eine WEB-Komponente werden nicht im classloader (vom Auftrag ausführen) bekannt gegeben?
Viele Grüße
Martin Dirlewanger
Korrekt. Die Klasse muss entweder als Library-Komponente oder als Public-Komponente (ab 4.2 R4) definiert sein.
Allerdings sollte in ihrem Fall es in etwa so funktionieren:
<module>
<name>Modul 1</name>
<version>1.0</version>
<components>
<public>
<name>AppExecutor-Name</name>
<class>de.espirit.pm.modules.modul.AppExecutor</class>
</public>
<web-app>
<resources>
<resource scope='module'>lib/modul1.jar</resource> <----- contains AppExecutor
</resources>
</web-app>
</components>
</module>
Hallo Herr Gockel,
leider findet er im Auftragsscript die Klasse nicht, haben Sie noch eine Idee woran es liegen könnte?
Könnte es an der statischen Funktion liegen?
Fehlermeldung:
Typed variable declaration : Attempt to resolve method: makeIt() on undefined variable or class name: de.test.internet.testA.utils.TestUtils at line 1
Auszug module.xml:
...
<public>
<name>TestUtils</name>
<class>de.test.internet.testA.utils.TestUtils</class>
</public>
<web-app>
...
Auszug Script:
boolean ret = de.test.internet.testA.utils.TestUtils.makeIt("test123");
Auszug Klasse:
public class TestUtils
{
public static boolean makeIt(String abc)
{
return true;
}
}
Viele Grüße und Danke vorab
Martin Dirlewanger
Sieht mir beim spontanen Blick, so aus, als würde die Klasse TestUtils auch nicht das Executable Interface implementieren.
siehe Re: Script über einen Schedulerauftrag starten
In ihrem Fall gibt es doch auch keinen Skriptcode mehr ?!? In dem Auftragsskript dürfte doch nur noch der Executable-class Aufruf stehen.
#!executable-class
TestUtils
Hallo Herr Gockel,
ich glaube jetzt habe ich Sie erst komplett verstanden, d.h. es ist nur möglich eine executable-class auszuführen und nicht eine statische Funktion einer Klasse die Rückgaben und Parameter besitzt?
Viele Grüße
Martin Dirlewanger
[Es ist nicht möglich] eine statische Funktion einer Klasse die Rückgaben und Parameter besitzt?
Doch, das geht. Aber über Beanshell sind nur Klassen erreichbar, die im scope "global" liegen. Das erreicht man z.B. über Klassen, die in einem "libraray module" liegen. Allerdings können sich so verschiedene Module in die Quere kommen. Um das zu vermeiden gibt es den von Herrn Gockel beschriebenen Weg ("executable class").
Hallo Herr Jodeleit,
hallo Herr Gockel,
vielen Dank für Ihre Hilfe funktioniert nun.
Viele Grüße
Martin Dirlewanger