Search the FirstSpirit Knowledge Base
Hallo,
ich habe hier ein Skript gebaut das während dem Deployment läuft und eine Anzahl von Datensätzen aus einer Datenquelle löschen soll.
import de.espirit.or.Session;
import de.espirit.or.web.SessionManager;
import de.espirit.or.schema.Entity;
import de.espirit.or.schema.KeyValue;
import java.util.*;
import de.espirit.firstspirit.common.gui.CMSDialog;
import de.espirit.firstspirit.access.*;
import de.espirit.firstspirit.access.store.contentstore.*;
import de.espirit.firstspirit.access.store.mediastore.Media;
import de.espirit.firstspirit.access.store.*;
import de.espirit.firstspirit.access.AccessUtil.*;
import de.espirit.or.query.*;
import de.espirit.or.*;
// ...
String schemaName = "Products";
int objectId = 3459;
us = context.getUserService();
cs = us.getStore(Store.CONTENT_STORE, false);
contentSource = cs.getContent2ByName("jobs");
schemaTable = contentSource.getSchema();
Session orSession = schemaTable.getSession();
Select select = orSession.createSelect("Jobs");
equal = new Equal("fs_id", objectId);
cons = new Or();
cons.add(equal);
select.setConstraint(cons);
keys = orSession.fetchKeys(select);
if(keys.size() > 0) {
row = keys.get(0);
Entity entity = orSession.find(row);
context.logError( "Delete DB Entity: " + entity);
orSession.delete(entity);
orSession.commit();
}
// ...
Meine Frage wäre nun, ob das nicht etwas kompakter funktioniert. Ist die fs_id innerhalb des DB-Schemata nicht eindeutig? Muss man umbedingt die Bezeichnung der Tabelle wissen ("Jobs", "jobs") um auf dieser ID etwas ausführen zu können?
Infos:
- FS 4.2.219
- Getestet im Mithras Beispielprojekt
Mit freundlichen Grüßen
Stephan Eginger
Ah, Beanshell kann keine var-args, so sollte es gehen: session.find("job", new Object[] { 43 } );
Ohne Tabellen-Namen geht es nicht, kürzer allerdings schon:
Entity entity = session.find("job", 4711);
if (entity != null) {
session.delete(entity);
session.commit();
}
Danke für ihre Antwort. Aber was ist das für ein session Objekt? Als de.espirit.or.Session wird mir nur folgender Fehler geworfen:
error during script execution : de.espirit.firstspirit.access.script.ExecutionException: Typed variable declaration : Error in method invocation: Method find( java.lang.String, int ) not found in class'de.espirit.or.impl.SessionImpl' at line 23
Ah, Beanshell kann keine var-args, so sollte es gehen: session.find("job", new Object[] { 43 } );
Funktioniert! Das macht es schon ein Stück übersichtlicher, danke!
Es gibt momentan mit dem Skript ein Problem, wenn es innhalb eines Auftrags nach einer Generierung (Voll- und Teilgenerierung) gestartet wird.
ERROR 07.12.2010 10:50:30.339 {seID=8083} (de.espirit.firstspirit.server.scheduler.ScriptTaskExecutor): error during script execution : de.espirit.firstspirit.access.script.ExecutionException: Method Invocation orSession.commit at line 38
Sobald der Generierungsschritt deaktiviert wird funktioniert der Auftrag wieder. Der FS Server hat die Version 4.2.419
Ist das ein bekannter Fehler? Gibt es irgendwelche Workarounds?
ERROR 07.12.2010 10:50:30.339 {seID=8083} (de.espirit.firstspirit.server.scheduler.ScriptTaskExecutor): error during script execution : de.espirit.firstspirit.access.script.ExecutionException: Method Invocation orSession.commit at line 38
Können Sie bitte mal den kompletten Stack der Fehlermeldung posten.
Vermutung:
Es wird die Read-Only-Connection verwendet.
us = context.getUserService();
Vergleiche hierzu:
Kapitel: 7.5.9.4.1 der Admin-Doku
Hier die komplette Fehlermeldung:
ERROR 07.12.2010 14:32:44.294 {seID=15364} (de.espirit.firstspirit.server.scheduler.ScriptTaskExecutor): error during script execution : de.espirit.firstspirit.access.script.ExecutionException: Method Invocation orSession.commit at line 37
de.espirit.firstspirit.access.script.ExecutionException: Method Invocation orSession.commit at line 37
at de.espirit.firstspirit.server.script.BeanshellScriptEngine$BeanshellExecutable.execute(BeanshellScriptEngine.java:120)
at de.espirit.firstspirit.common.ScriptUtil.execute(ScriptUtil.java:88)
at de.espirit.firstspirit.server.scheduler.ScriptTaskExecutor.run(ScriptTaskExecutor.java:92)
at de.espirit.firstspirit.server.scheduler.ScheduleManagerImpl$TaskCallable.executeLocal(ScheduleManagerImpl.java:1955)
at de.espirit.firstspirit.server.scheduler.ScheduleManagerImpl$TaskCallable.executeLocal(ScheduleManagerImpl.java:1935)
at de.espirit.firstspirit.server.scheduler.ScheduleManagerImpl$TaskCallable.call(ScheduleManagerImpl.java:1863)
at de.espirit.firstspirit.server.ExecutionManagerImpl$ExtendedCallable.call(ExecutionManagerImpl.java:505)
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:414)
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.UnsupportedOperationException
at de.espirit.or.impl.TemporalSession.doCommit(TemporalSession.java:62)
at de.espirit.or.impl.AbstractSession.commit(AbstractSession.java:518)
at de.espirit.or.impl.AbstractSession.commit(AbstractSession.java:505)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at bsh.Reflect.invokeMethod(Unknown Source)
at bsh.Reflect.invokeObjectMethod(Unknown Source)
at bsh.Name.invokeMethod(Unknown Source)
at bsh.BSHMethodInvocation.eval(Unknown Source)
at bsh.BSHPrimaryExpression.eval(Unknown Source)
at bsh.BSHPrimaryExpression.eval(Unknown Source)
at bsh.BSHBlock.evalBlock(Unknown Source)
at bsh.BSHBlock.eval(Unknown Source)
at bsh.BSHBlock.eval(Unknown Source)
at bsh.BSHIfStatement.eval(Unknown Source)
at bsh.BSHBlock.evalBlock(Unknown Source)
at bsh.BSHBlock.eval(Unknown Source)
at bsh.BshMethod.invokeImpl(Unknown Source)
at bsh.BshMethod.invoke(Unknown Source)
at bsh.BshMethod.invoke(Unknown Source)
at bsh.This.invokeMethod(Unknown Source)
at bsh.This.invokeMethod(Unknown Source)
at de.espirit.firstspirit.server.script.BeanshellScriptEngine$BeanshellExecutable.execute(BeanshellScriptEngine.java:111)
... 16 more
Das bestätigt meine Vermutung. Das Problem ist, dass sie die Standard Connection des Skripttasks verwenden und diese ist Read-Only. Für die OR-Session wird in diesem Fall auch eine Temporale Session erzeugt und diese erlaubt keine Änderungen.
Sie müssen wie in Kapitel: 7.5.9.4.1 der Admin-Doku beschrieben eine eigene Verbindung konfigurieren und diese in Ihrem Skript nutzen.
Damit sich die Änderungen des Skripttasks in der nachfolgenden Generierung auch auswirken müssen am Ende des Skripttask noch die startTime setzen.
Vergl. hierzu: Adventskalender und automatisches Umschalten
Danke, es scheint zu funktionieren mit connection.getProjectById(context.getProject().getId()).getUserService();
Warum es jedoch nur in kombination mit dem Generieren zu diesem Fehler kommt, wird mir über die Dokumentation nicht ersichtlich.