- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Modulentwicklung: Service-Konfiguration erstellen
Hi,
gestern habe ich mich endlich der Konfiguration zu gewendet und nach kurzer Recherche das Beispiel namens "Service" als Grundlage genommen. Ich habe also wie im beispiel meinen kleinen Service erstellt und definiert, eine Konfiguration erstellt und nach fast einem Tag (wtf) lief es dann auch endlich.
Ich habe jetzt einen Service mit einer Configurable welche auf eine Property-Datei zugreift die analog zum Beispiel im Modul-Config-Verzeichnis liegt.
Probleme und Fragen dazu:
- Das UI: Das UI hat mich echt Sunden und graue Haare gekostet. Zunรคchst: Ja super, UI vom Beispiel lรคuft, also habe ich es angepasst. Resultat: Config-Fenster zu klein. Als Swing-Fucks also hier und da rumexperimentiert, das Modul immer wieder redeployed, den Service mal aktiviert, deaktiviert: keinerlei รnderungen. Irgendwann las ich dann, das man den Server manchmal (???) neu starten muss, gesagt getan. Da ich zu der Zeit versucht habe die Position des im Beispiel "masterFrame" genannten Objektes zu setzen springt auf einmal das Fenster vom ServerMonitor im Hintergrund oben rechts ins Eck und wirk kleiner
Dann hatte ich andauernd Proxyexceptions (ich benutze gar keine Proxyklassen, bei getProxyClass gebe ich null zurรผck)... okay, ich musste also jedesmal den Server neu starten wenn ich testen wollte ob das mit dem UI jetzt klappte oder ein neues Element hinzugefรผgt hatte. Dann musste ich ihn auch ohne UI รndeurngen neustarten wegen Proxyfehlern.
Frage: gibt es hier einen Ausweg das UI zu aktualisieren? Ich will nicht jedesmal wenn ich das Modul mit dem Service neu deploye den Server neu starten und dann wieder den SiteArchitect starten, den ServerManager usw. - Lange hing ich auch am Problem: Wie bite erstelle ich die Config-Datei?
- Im Beispiel liegt diese einfach im SRC-Root, also legte ich meine zunรคchst auch dort hin. -> Sie wurde nach dem Deployment nicht gefunden. Also legte ich sie ins Resource-Folder. Sie wurde nicht gefunden. Dann versuchte ich rauszufinden ob sie im FSM irgendwo speziell liegen muss aber konnte bisher nichts finden (da gibt es doch sicher etwas und ich habe es nur รผbersehen). Wo muss ich diese Properties-Datei ablegen, damit diese am Ende in die Modulkonfiguration kopiert wird bei Modulinstallation? Wenn es geht: ich hoffe sie wird nicht รผberschrieben sondern nur erstellt, wenn es noch keine gibt?
- Als ich es nicht hinbekam dachte ich "naja dann erstellst du die Datei programmatisch".
Bei dem TODO ist es am Ende geblieben, da ich ind er API keine Mรถglichkeit fand diese Datei zu erstellen. Habe ich (auch) das รผbersehen oder ist das ein Sicherheits-Feature? Ich wundere mich, da ich die Dtaei lรถschen kann aber ich kann keine erstellen?_configFile = _environment.getConfDir().obtain(MODULE_CONFIG_FILE);
if (!_configFile.exists()) {
// TODO: how to create the config file?
}
Danke schonmal fรผr die Hilfe,
Marcus
- Labels:
-
Developers
Accepted Solutions
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Marcus,
Du kannst auch bei nicht existierendem File das FileHandle holen und darauf dann einfach FileHandle#save(InputStream in) aufrufen. Du musst Dir halt den InputStream passend erzeugen (ByteArrayInputStream o.รค.).
Zum Thema initial anlegen: Hierfรผr kannst Du im Modul die Methode installed() und/oder updated() nutzen und hier die Datei selber anlegen.
Eine Variante ist, eine default-Config als resource mit ins Modul zu legen und in der module.xml zu deklarieren (dann landet sie auch auf dem Server bzw. im Service-Config-Ordner in FS):
<service>
<name>SERVICE_NAME</name>
<class>SERVICE_CLASS</class>
<configurable>SERVICE_CONFIG_CLASS</configurable>
<resources>
<resource>default-config.properties</resource>
</resources>
</service>
Beim Lesen der config schaust Du dann zuerst, ob es das "echte" config gibt (obtain auf config.properties). Wenn es nicht existiert (!configFile.exist()) liest Du aus der Default-Config. Geschrieben wird immer in die "echte" config.properties.
Vorteil dieser Variante: Du musst die Standard-Config nicht programmatisch erzeugen und trotzdem wird eine ggf. bereits vorhandene config beim Modul-Update nicht "รผberbรผgelt".
Viele Grรผรe
Michael
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Marcus,
allgemein zum Thema Configurable: Fรผr EINFACHE Dinge habe ich mal eine kleine Lib "GenericConfig" gebaut. Damit kannst Du Textfelder und Checkboxen benutzen.
Wichtig im Umfeld eines FS-Services: Hier solltest Du dann unbedingt zwei Jars erzeugen (siehe DTA), damit die GenericConfig nicht im Server-Scope liegt.
Vielleicht hilft das ja zumindest der ganzen Swing-Implementierung aus dem Weg zu gehen ๐
Viele Grรผรe
Michael
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Michael,
stimmt, die "Generic Config" hattest du in der DTA erwรคhnt. ich hatte auch kurz รผberlegt ob ich da snutze aber wollte dann doch "schnell" mein eigenes kleines UI haben.
Ich habe momentan noch viele Resourcen im Server-Scope was ich jetzt versuche loszuwerden indem ich die probleme die ich damit umgangen habe jetzt lรถse. Daher die vielen Threads gerade
Hast du eine Idee wie man die Konfigurationsdatei handhabt? Momentan muss ich sie manuell ins FS2-Modul-Config-Verzeichnis kopieren was nicht so sinnvoll ist :[
MfG Marcus
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Marcus,
um eine neue Datei im Konfigurationsordners deines Moduls anlegen zu kรถnnen kannst du deinen Code von oben weiter benutzen.
Die fehlt nur noch der Aufruf der save Methode auf dem FileHandle Objekt.
final InputStream is = getClass().getResourceAsStream(file);
if (is != null) {
try {
_configFile
.save(is);} finally {
IoUtil.saveClose(is);
}
}
Mit diesem Beispiel kannst du zum Beispiel eine initiale Konfigurationsdtaei erstellen und mit Inhalten aus deiner JAR / FSM befรผllen.
Das Beispiel ist im รผbrigen aus dem Moduleentwicklerhandbuch.
Viele Grรผรe
Benjamin
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Marcus,
Du kannst auch bei nicht existierendem File das FileHandle holen und darauf dann einfach FileHandle#save(InputStream in) aufrufen. Du musst Dir halt den InputStream passend erzeugen (ByteArrayInputStream o.รค.).
Zum Thema initial anlegen: Hierfรผr kannst Du im Modul die Methode installed() und/oder updated() nutzen und hier die Datei selber anlegen.
Eine Variante ist, eine default-Config als resource mit ins Modul zu legen und in der module.xml zu deklarieren (dann landet sie auch auf dem Server bzw. im Service-Config-Ordner in FS):
<service>
<name>SERVICE_NAME</name>
<class>SERVICE_CLASS</class>
<configurable>SERVICE_CONFIG_CLASS</configurable>
<resources>
<resource>default-config.properties</resource>
</resources>
</service>
Beim Lesen der config schaust Du dann zuerst, ob es das "echte" config gibt (obtain auf config.properties). Wenn es nicht existiert (!configFile.exist()) liest Du aus der Default-Config. Geschrieben wird immer in die "echte" config.properties.
Vorteil dieser Variante: Du musst die Standard-Config nicht programmatisch erzeugen und trotzdem wird eine ggf. bereits vorhandene config beim Modul-Update nicht "รผberbรผgelt".
Viele Grรผรe
Michael
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
danke euch erst einmal fรผr die Antworten!
Ich hatte mir die Doku fรผr die save()-Methode angesehen und dort steht:
IfisFile()
returnstrue
, saves the stream-given content to the file.
Jetzt dachte ich, wenn exists() mir schon "false" zurรผck gibt wird ein nicht existierendes Objekt ja vermutlich keine File sein. In der Doku steht nichts von einem Default-Wert, es kรถnnte ja auch ein Ordner sein...
Also gab ich mir beim Installieren des Moduls mal folgendes aus:
Logging.getLogger().logInfo("Exists ConfFile?: " + _configFile.exists(), loggerClass);
Logging.getLogger().logInfo("IsFile ConfFile?: " + _configFile.isFile(), loggerClass);
Wenn die Datei existiert: beide true. Wenn sie nicht existiert: beide false.
An dem Punkt dachte ich ich รผbersehe was und habe gar nicht versucht die Datei trotzdem mit save() zu erstellen weil ich shcon so viel experimentiert hatte und ind er Doku ja steht, dass save() nur geht, wenn isFile() true zurรผck gibt.
Siehe da, es geht aber trotzdem und handelt sich somit nur um einen kleinen Fehler in der Doku.
Danke auch fรผr den Hinweis auf die <resources>, das habe ich offenbar missverstanden. Zusรคtzlich lag die default-Config im falschen "resource"-Verzeichnis.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Michael,
das Thema ist zwar schon etwas รคlter, meine Frage passt aber glaub ich trotzdem am ehesten hier her. Ich wรผrde nรคmlich gern fรผr einen Service die GenericConfig verwenden. Mir ist nur nicht ganz klar wie ich dann am Besten an die konfigurierten Werte komme. In der PDF bei dem Modul ist der Weg รผber den LegacyModuleAgent beschrieben. Das scheint aber nur fรผr ProjectAppConfigProperties zu klappen oder?
รbersehe ich etwas oder ist das einfach so, dass ich das Auslesen der Konfigurationsdatei dann noch selbst implementieren muss?
VG
Anja
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Anja,
im Service selber kommst du ja ganz einfach lesend an das configfile - da Du dort das Environment hast und dann รผber den direkten Weg env.getConfDir().obtain("configuration.properties") usw. selber die Properties-Datei einlesen kannst. Das sind ca. 2-3 Zeilen Code, darum hatte ich fรผr den Fall keine Convenience-Methode gebaut. Falls Du die Werte woanders brauchst kannst Du dir ja entsprechende Methoden im Service definieren die die Werte raus geben.
Viele Grรผรe
Michael
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Michael,
da hatte ich wohl einfach etwas umstรคndlich gedacht. Nun klappt's, herzlichen Dank!
VG
Anja

