Search the FirstSpirit Knowledge Base
Hallo zusammen,
ich arbeite momentan aneiner Executable Class unter FS 4.2, die über die Datensätze einer Tabellen iterieren soll, und in jedem Datensatz in einer FS-List einen Eintrag hinterlassen soll. Das ganze wird über den Scheduler (Script-Task) gestartet.
Zunächst habe ich versucht, die Connection aus dem Context-Ojbect zu holen, gerate dann aber beim ersten Versuch einen Datensatz zu locken in eine Security-Exception (changes not allowed for current connection). Auch die Angabe einer eigenen Verbindung in den Skript-Task-Eigenschaften führt zu diesem Ergebnis.
Deswegen verbindet sich das Modul aktuell mittels getConnection(...) und einem technischen Nutzer mit dem Serrver.
Connection connection = ConnectionManager.getConnection(host,8000,ConnectionManager.HTTP_MODE, "user", "pw");
connection.connect();
Das funktioniert auch eine Weile (ca. 20min?) gut, irgendwann bekomme ich jedoch dann immer eine unexpected authentication exception und einen Abbruch des Auftrages. Meine Vermutung ist, dass die "Session" des technischen Benutzers abäuft, die Frage ist nur, kann ich das (modulseitig) verhindern, ohne in jeder Iteration die Connection verbinden und wieder trennen zu müssen?
Danke und Grüße
Andreas
Mittlerweile konnte ich das Problem lösen: die Art und Weise die eigene Verbindung aus dem Skript-Auftrag zu holen, war nicht korrekt. Mit connection = (Connection) map.get("connection"); bekomme ich die richtige Connection die auch nicht nach 20min aussteigt.
Auch die Angabe einer eigenen Verbindung in den Skript-Task-Eigenschaften führt zu diesem Ergebnis.
Das sollte aber nicht so sein.
Deswegen verbindet sich das Modul aktuell mittels getConnection(...) und einem technischen Nutzer mit dem Serrver.
[..]
Das funktioniert auch eine Weile (ca. 20min?) gut, irgendwann bekomme ich jedoch dann immer eine unexpected authentication exception und einen Abbruch des Auftrages.
Poste doch mal die Exception hier.
Das sollte aber nicht so sein.
Eventuell hole ich mir die Connection falsch? Ich verwende ich getConnection() ohne Parameter auf dem SchedulerContext.
Poste doch mal die Exception hier.
INFO 26.05.2015 13:03:18.227 (de.espirit.firstspirit.server.sessionmanagement.SessionManagerImpl): new session (ID=2929856222415414847, user=pim, userID=237345, type=CHILD) created
ERROR 26.05.2015 13:03:18.228 (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:171)
at de.espirit.firstspirit.server.io.ServerConnectionImpl.access$000(ServerConnectionImpl.java:48)
at de.espirit.firstspirit.server.io.ServerConnectionImpl$1.invoke(ServerConnectionImpl.java:96)
at de.espirit.firstspirit.server.io.ServerConnectionImpl$1.invoke(ServerConnectionImpl.java:95)
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:147)
at de.espirit.firstspirit.server.io.ServerConnectionImpl.getUserService(ServerConnectionImpl.java:136)
at de.espirit.firstspirit.server.io.ServerConnectionImpl.getUserService(ServerConnectionImpl.java:48)
at de.espirit.firstspirit.server.projectmanagement.ProjectImpl.getUserService(ProjectImpl.java:2121)
at de.espirit.firstspirit.client.UserServiceImpl.getRemoteUserService(UserServiceImpl.java:676)
at de.espirit.firstspirit.agency.UserServiceDelegatingSpecialistsBroker$BrokerAgentImpl.getBroker(UserServiceDelegatingSpecialistsBroker.java:154)
at de.espirit.firstspirit.client.access.editor.ReferenceEditorValueImpl.parseValue(ReferenceEditorValueImpl.java:177)
at de.espirit.firstspirit.client.access.editor.ReferenceEditorValueImpl.parseValue(ReferenceEditorValueImpl.java:105)
at de.espirit.firstspirit.client.access.editor.ReferenceEditorValueImpl.parseValue(ReferenceEditorValueImpl.java:61)
at de.espirit.firstspirit.client.access.editor.AbstractEditorValue.parseDataElement(AbstractEditorValue.java:424)
at de.espirit.firstspirit.client.access.editor.AbstractEditorValue.assimilate(AbstractEditorValue.java:777)
at de.espirit.firstspirit.store.access.contentstore.ContentUtil$1.get(ContentUtil.java:151)
at de.espirit.firstspirit.store.access.DataUtil.copy(DataUtil.java:123)
at de.espirit.firstspirit.store.access.DataUtil.injectFormData(DataUtil.java:41)
at de.espirit.firstspirit.store.access.contentstore.DatasetImpl.setFormData(DatasetImpl.java:197)
at de.adesso.bosch.pt.fsmodule.automation.AddToProductExecutable.addTeaser(AddToProductExecutable.java:115)
at de.adesso.bosch.pt.fsmodule.automation.AddToProductExecutable.execute(AddToProductExecutable.java:55)
at de.espirit.firstspirit.common.ScriptUtil.execute(ScriptUtil.java:97)
at de.espirit.firstspirit.server.scheduler.ScriptTaskExecutor.run(ScriptTaskExecutor.java:119)
at de.espirit.firstspirit.server.scheduler.ScheduleManagerImpl$TaskCallable.executeLocal(ScheduleManagerImpl.java:2062)
at de.espirit.firstspirit.server.scheduler.ScheduleManagerImpl$TaskCallable.executeLocal(ScheduleManagerImpl.java:2045)
at de.espirit.firstspirit.server.scheduler.ScheduleManagerImpl$TaskCallable.call(ScheduleManagerImpl.java:1973)
at de.espirit.firstspirit.server.ExecutionManagerImpl$ExtendedCallable.call(ExecutionManagerImpl.java:520)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at de.espirit.common.util.BoundedExecutorService$RunnableWrapper.run(BoundedExecutorService.java:419)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
at de.espirit.common.util.SuspendableThread.run(SuspendableThread.java:36)
Caused by: java.lang.IllegalArgumentException: Parent session (id=7244416222538068344) not found!
at de.espirit.firstspirit.server.sessionmanagement.SessionManagerImpl.linkSessions(SessionManagerImpl.java:724)
at de.espirit.firstspirit.client.io.ProjectConnection.connect(ProjectConnection.java:58)
at de.espirit.firstspirit.server.io.ServerConnectionImpl.createUserService(ServerConnectionImpl.java:169)
... 38 more
INFO 26.05.2015 13:03:18.228 (de.espirit.firstspirit.server.scheduler.ScheduleManagerImpl): finished task 'AddTeaser' - schedule entry 'AddTeaserTest' (id=5736309)
Durchläuft der Code eine Schleife? Wenn ja, kannst du da testweise ein "connection.ping()" einfügen?
Ursache ist wohl, das hier eine Session weggeräumt wurde:
Parent session (id=7244416222538068344) not found!
Die von dir erwähnten 20 Minuten hören sich so an, als hätte hier ein autmatischer Timeout zugeschlagen, was eigentlich nicht passieren darf.
Das ist die Connection aus dem SchedulerContext mit dem technischem Nutzer?
Hallo,
das mit dem Connection.ping() teste ich aus und gebe Rückmeldung.
Die Connection ist die zum oben gezeigtem Stack passt, ist die "manuelle" Verbindung mit technischem User. Bei der Connection aus dem Context mit technischem Benutzer komme ich wie gesagt garnicht so weit. (changes not allowed for current connection)
Laut API gibt es keine ping()-Methode für die Connection-Klasse. Meintest du was anderes?
Laut API gibt es keine ping()-Methode für die Connection-Klasse. Meintest du was anderes?
Stimmt, mein Fehler.
Kannst du noch mal den Weg über den technischen Benutzer testen? Und das Code-Fragment posten, wie du dir die Connection aus dem Kontext holst?
Ich habs nochmal umgestellt mit selben Ergebnis (wie zuvor):
Scriptaufruf:
Code für die connection:
Connection connection = context.getConnection(); |
Fehlermeldung:
ERROR 01.06.2015 15:54:25.609 (de.espirit.firstspirit.server.scheduler.ScriptTaskExecutor): error during script execution : java.lang.SecurityException: changes not allowed for current connection
java.lang.SecurityException: changes not allowed for current connection
at de.espirit.firstspirit.server.scheduler.RestrictedTaskSecurityManager.checkAccess(RestrictedTaskSecurityManager.java:28)
at de.espirit.firstspirit.store.access.AbstractStoreElement.checkAccess(AbstractStoreElement.java:1599)
at de.espirit.firstspirit.store.access.contentstore.Content2Impl.lock(Content2Impl.java:287)
at de.espirit.firstspirit.store.access.contentstore.DatasetImpl.setLock(DatasetImpl.java:974)
at de.espirit.firstspirit.store.access.contentstore.DatasetImpl.setLock(DatasetImpl.java:983)
at de.adesso.bosch.pt.fsmodule.automation.AddToProductExecutable.addTeaser(AddToProductExecutable.java:115)
at de.adesso.bosch.pt.fsmodule.automation.AddToProductExecutable.execute(AddToProductExecutable.java:55)
at de.espirit.firstspirit.common.ScriptUtil.execute(ScriptUtil.java:97)
at de.espirit.firstspirit.server.scheduler.ScriptTaskExecutor.run(ScriptTaskExecutor.java:119)
at de.espirit.firstspirit.server.scheduler.ScheduleManagerImpl$TaskCallable.executeLocal(ScheduleManagerImpl.java:2062)
at de.espirit.firstspirit.server.scheduler.ScheduleManagerImpl$TaskCallable.executeLocal(ScheduleManagerImpl.java:2045)
at de.espirit.firstspirit.server.scheduler.ScheduleManagerImpl$TaskCallable.call(ScheduleManagerImpl.java:1973)
at de.espirit.firstspirit.server.ExecutionManagerImpl$ExtendedCallable.call(ExecutionManagerImpl.java:520)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at de.espirit.common.util.BoundedExecutorService$RunnableWrapper.run(BoundedExecutorService.java:419)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
at de.espirit.common.util.SuspendableThread.run(SuspendableThread.java:36)
INFO 01.06.2015 15:54:25.609 (de.espirit.firstspirit.server.sessionmanagement.SessionManagerImpl): Session terminated (ID=1277186608780062882, user=pim (pim)(dummy)), number of sessions now 31
Es wird ja scheinbar auch der angebene technische Benutzer (pim) verwendet, denn den Auftrag starte ich als Admin. pim ist in der Gruppe der Projektadministratoren.
Das Element, welches da gesperrt wird ("AddToProductExecutable.java:115"), kommt das auch über diese Connection?
Ja, ich hole mir aus der connection den UserService und ab da immer weiter. Ich hab den Weg zum Lock mal unten skizziert:
UserService us = connection.getProjectById(context.getProject().getId()).getUserService();
ContentStoreRoot contentStoreRoot = (ContentStoreRoot) us.getStore(Store.Type.CONTENTSTORE, false);
Content2 products = contentStoreRoot.getContent2ByName("products_table");
List<? extends Entity> productsList = products.getData();
for (Entity product : productsList) {
Dataset productDataSet = products.getDataset(product);
...
productDataSet.setLock(true, false);
...
}