Search the FirstSpirit Knowledge Base
Hallo Zusammen,
im aktuellen Projekt wurde ein Produkdatenimporter entwickelt, der als Modul in der Auftragsverwaltung gestartet werden kann.
Nach 20min. bricht der Import ab und es kommt folgende Exception:
INFO 28.05.2012 15:28:53.488 {seID=877704} (de.espirit.firstspirit.server.sessionmanagement.SessionManagerImpl): new session (ID=3078116543263623911, user=pim, userID=124444, type=CHILD) created
ERROR 28.05.2012 15:28:53.489 {seID=877704} (de.espirit.firstspirit.server.scheduler.ScriptTaskExecutor): error during script execution : de.espirit.firstspirit.access.AccessRuntimeException: unexpected authentication exception!
de.espirit.firstspirit.access.AccessRuntimeException: unexpected authentication exception!
at de.espirit.firstspirit.server.io.ServerConnectionImpl.createUserService(ServerConnectionImpl.java:168)
at de.espirit.firstspirit.server.io.ServerConnectionImpl.access$000(ServerConnectionImpl.java:47)
at de.espirit.firstspirit.server.io.ServerConnectionImpl$1.invoke(ServerConnectionImpl.java:95)
at de.espirit.firstspirit.server.io.ServerConnectionImpl$1.invoke(ServerConnectionImpl.java:94)
at de.espirit.common.util.CachingFactory$ValueCreationStrategy$1.get(CachingFactory.java:45)
at de.espirit.common.util.CachingFactory.get(CachingFactory.java:223)
at de.espirit.firstspirit.server.io.ServerConnectionImpl.getUserService(ServerConnectionImpl.java:144)
at de.espirit.firstspirit.server.io.ServerConnectionImpl.getUserService(ServerConnectionImpl.java:133)
at de.espirit.firstspirit.server.io.ServerConnectionImpl.getUserService(ServerConnectionImpl.java:47)
at de.espirit.firstspirit.server.projectmanagement.ProjectImpl.getUserService(ProjectImpl.java:2079)
Das Modul erzeugt ganz am Anfang eine Connection mit dem User pim. Über diese Connection wird das Projekt geholt und alle Operationen darauf durchgeführt. Die Exception fliegt an unterschiedlichen Stellen des Modulcodes, jedoch immer nach 20min. Bis zum Abbruch läuft der Import sauber durch, die Daten werden alle in FirstSpirit übernommen.
FS_Version: 4.2.461.48921
postgreSQL DB 8.x
Ich bin ratlos. Zuvor war noch ein Service implementiert, den ich auch testhalber entfernt habe, jedoch ohne Erfolg. Bisher ist der Importer genau einmal sauber durchgelaufen, was jedoch Zufall war (der Import dauerte 20min).
Im LOG standen beim erfolgreichen Import folgende Infos:
INFO 28.05.2012 13:26:44.160 {seID=877704} (de.espirit.firstspirit.server.sessionmanagement.SessionManagerImpl): Session terminated (ID=8317227330505870376, user=pim (pim)), number of sessions now 28
INFO 28.05.2012 13:26:44.160 {seID=877704} (de.espirit.firstspirit.server.sessionmanagement.SessionManagerImpl): Invalid session id 8317227330505870376
INFO 28.05.2012 13:26:44.160 {seID=877704} (de.espirit.firstspirit.server.sessionmanagement.SessionManagerImpl): Session terminated (ID=968879378436676607, user=pim (pim)), number of sessions now 27
INFO 28.05.2012 13:26:44.161 {seID=877704} (de.espirit.firstspirit.server.sessionmanagement.SessionManagerImpl): Session terminated (ID=190652446263490748, user=pim (pim)), number of sessions now 26
INFO 28.05.2012 13:26:44.161 {seID=877704} (de.espirit.firstspirit.server.sessionmanagement.SessionManagerImpl): Invalid session id 190652446263490748
INFO 28.05.2012 13:26:44.161 {seID=877704} (de.espirit.firstspirit.server.sessionmanagement.SessionManagerImpl): Session terminated (ID=7909210985154146301, user=pim (pim)), number of sessions now 25
INFO 28.05.2012 13:26:44.161 {seID=877704} (de.espirit.firstspirit.server.sessionmanagement.SessionManagerImpl): Invalid session id 7909210985154146301
Ich frage mich, warum soviele Session existieren? Wann werden Sessions erzeugt? Nach meinem Verständnis sollte es immer beim Aufbau einer Connection sein.
Danke und Gruß
Edit:
Ich sehe gerade, das Session nach 20min gelöscht werden:
https://community.e-spirit.com/message/8713#8713
Hiernach müsste ich überprüfen, wie lange schon die Session exisitiert, um gegebenenfall eine Session zu öffnen?
Das Modul erzeugt ganz am Anfang eine Connection mit dem User pim
Wie wird die Connection in diesem Modul aufgebaut?
Warum wird hier nicht die benutzerdefinierte Connection aus dem Auftragsskript verwendet?
Das Modul erzeugt ganz am Anfang eine Connection mit dem User pim
Wie wird die Connection in diesem Modul aufgebaut?
Warum wird hier nicht die benutzerdefinierte Connection aus dem Auftragsskript verwendet?
Hallo.
Connection wird in einer Executable-Klasse (über import wird die Klasse im Script bekanntgegeben) wie folgt aufgebaut:
ScheduleContext selectedContext = (ScheduleContext) map.get("context");
long contextProjectID = selectedContext.getProject().getId();
con = ConnectionManager.getConnection("localhost", 8000, ConnectionManager.HTTP_MODE, "admin", "admin");
con.connect();
Project project = con.getProjectById(contextProjectID);
usw.
Wobei user/pass zuvor über ein Service (Properties-Datei im Module-Ordner) gezogen wurde.
Wenn es über die benutzerdefinierte Connection aus dem Auftragsskript geht, dann stellt das kein Problem dar, dies so umzubauen.
Danke und Gruß
Hallo.
Wollte kurz die Info durchgeben, dass die benutzerdefinierte Connection mit Angabe eines Users geholfen hat.
Die Connection wird nicht nach 20min beendet.
Ich frage mich nur, warum dies nicht auch so geht und die Connection intern öffnet. Der einzige Unterschied ist, dass das Script den Usernamen und Passwort intern holt und eine Connection aufbaut.
Gruß
Unsere QS konnte übrigens den Fehler nicht nachstellen. Entweder das tritt in der aktuellen FirstSpirit-Version (4.2.468) nicht mehr auf, oder bei euch spielen noch andere Faktoren hinein.
Hallo Peter,
das Problem tritt genauso auch unter FS 4.2 R4 468 auf. Wir haben den Fall, bei dem wir genau das auch in einem Modul versuchen, was "Levent Meric" hier vor hat. Bei uns allerdings MUSS es eine explizite Verbindung sein, die SCHREIBEND auf den PAGESTORE aus einem Auftrag (enthält eine EXECUTABLE-CLASS, die das Modul ruft) heraus zugreift. Würden wir mit der gegenwärtigen Verbindung arbeiten, wären wir nur read-only unterwegs (s. auch Thread: https://community.e-spirit.com/message/8271#8271).
Könnten wir lesend mit der Verbindung arbeiten, wäre dies - wie oben als Alternative vorgeschlagen - kein Problem, eine benutzerdefinierte Connection zu verwenden.
Da wir jedoch Manipulationen - hier mit einer Admin-Verbindung - vornehmen müssen, brauchen wir eine explizite neue Verbindung. Leider fliegt uns diese genau nach 20 Minuten weg. Und das obwohl wir mit dieser Verbindung die Rekursion durch den PageStore durchführen.
Habt Ihr noch ne Idee? Ein HelpDesk-Ticket zu dem Problem existiert bereits (Help-20120913-693).
Wenn die Connection wie von Levent beschrieben selber über den ConnectionManager aufgebaut wird, aber die Verbindung "lokal" ist, wird die Verbindung automatisch nach einem Timeout geschlossen (20 Minuten).
Wenn im Auftrag die benutzerdefinierte Connection benutzt wird, sollte es nicht zu einem Timeout kommen. Das hat Levent ja auch bestätigt. Diese Connection kann dann auch schreibend benutzt werden.
Das Thema ist auch in der Doku ausführlich beschrieben (Seite 382ff).
Wenn unbedingt über den ConnectionManager gegangen werden muss, sollte als Workaround ein regelmässiger Aufruf von "isConnected()" helfen.
Hallo Peter,
der Weg über die benutzerdefinierte Connection - wie in Kapitel 7.5.9.4.1 der FirstSpirit Admin-Doku beschrieben - klappte. Hier kam es nicht zu einer:
de.espirit.firstspirit.access.InvalidSessionException
Bleibt die Frage, warum der Weg über den ConnectionManager und einer privilegierte Verbindung über den Admin-Benutzer selbst dann zur InvalidSessionException nach 20 Minuten führte, wenn - wie empfohlen - die Methode "isConnected()" gerufen wurde. Diese wurde in unserem Fall sogar in der Rekursion, die über die Admin-Connection durch den PageStore iterierte, eingebaut. Die Implementierung sieht etwa so aus:
UserService usrSrv;
...
Connection admConn = ConnectionManager.getConnection(currentConn.getHost(), currentConn.getPort(), currentConn.getMode(), currentConn.getServletZone(), username, password);
admConn.connect();
...
usrSrv = admConn.getProjectById(project.getId()).getUserService();
project.lock(); //to allow synchronization during project changes
PageStoreRoot psRoot = (PageStoreRoot) usrSrv.getStore(Store.Type.PAGESTORE, false);
iterateTree(pageStoreRoot, StoreElementFilter.on(PageFolder.class, Page.class);
...
private void iterateTree(StoreElement element, StoreElementFilter filter) {
Listable<StoreElement> children = element.getChildren(filter, false);
for(StoreElement child : children) {
Logging.logDebug("is connected: " + usrSrv.isConnected());
if (child instanceof Page) {
revertApprover(child);
} else if (child instanceof PageFolder) {
iterateTree(child, filter);
}
}
}
Die zentrale Frage: ist dieser Weg nicht erlaubt? Oder handelt es sich tatsächlich in diesem Fall um einen BUG, der die Verbindung nach 20 Min. wegschmeißt?
Nach Rücksprache mit dem e-Spirit HelpDesk handelt es sich hier um einen BUG in FS 4.2 R4 468.
Wird gefixt ab FS 5.0.
Wobei die "Zwangstrennung" nur auftritt, wenn die Verbindung in der FirstSpirit-Server VM auf die beschriebene Weise aufgebaut wurde. "Echte" Remote-Verbindungen sind also nicht davon betroffen.