Home › Forum › Nuclos Konfiguration › Businessprozesse › Statuswechsel mit Regeln per Job automatisieren
- Dieses Thema hat 7 Antworten und 3 Teilnehmer, und wurde zuletzt aktualisiert vor 9 Jahren, 3 Monaten von
Matthias KÖPER.
-
AutorBeiträge
-
31 Juli 2014 um 19:02 Uhr #7755
Matthias KÖPER
TeilnehmerHallo,
ich komme so langsam in den Bereich der Automatisierung.
Jetzt habe ich versucht, den Statuswechsel eines Auftrags von neu nach reserviert per Jobregel zu automatisieren.
Also: Jobregel erstellt:
public void execute(JobContext context)
{
Listresults = null; try
{
results = QueryProvider.getByState(Auftrag.class, AuftragSM.State_5);
}
catch (Exception ex)
{
context.joblogError(ex.getMessage());
}for (Auftrag auftrag : results)
{
try
{
StatemodelProvider.changeState(auftrag, AuftragSM.State_10);
}
catch (Exception ex)
{
context.joblogWarn(ex.getMessage());
}
}
}
An dem Statuswechsel hängt noch die Regel aus dem Lagernuclet, die die Bestände reserviert. Ist nicht ausreichend Bestand vorhanden, gibt es eine BusinessException. Ruft man den Statuswechsel von Hand auf, wird der Statuswechsel nicht durchgeführt, wenn der Bestand nicht reicht. So soll das auch sein.
Führe ich den Statuswechsel in der Jobregel aus, wird zwar kein Bestand reserviert, aber der Statuswechsel trotzdem gemacht. Ist das Verhalten so richtig? Muss ich erst selbst den Bestand in der Regel prüfen?
Danke,
mkoeper12 August 2014 um 19:04 Uhr #7796Ramin Goettlich
TeilnehmerDas Ausführen von StateModelProvider.changeState() sollte auf jeden Fall auch die Regeln ausführen, die am Statuswechsel hängen. Ich kann mir kaum vorstellen, dass das nicht so ist, das verwenden wir hundertfach an anderen Stellen.
Falls das wirklich so ist, lohnt sich ein Ticket auf http://support.novabit.de
20 August 2014 um 12:19 Uhr #7831Matthias KÖPER
TeilnehmerDie Regel, die an dem Statuswechsel hängt wird ausgeführt. Das ist nicht das Problem. Allerdings wirft die Regel, wenn nicht ausreichend Bestand vorhanden ist, eine Exception. Bei der manuellen Ausführung des Statuswechsels führt dies zum Abbruch der Aktion, der Statuswechsel für dieses Objekt wird dann nicht durchgeführt. Anders aber bei Ausführung des Statuswechsels per Jobregel. Hier wird der Statuswechsel immer ausgeführt, egal ob die Regel eine Exception wirft oder nicht.
20 August 2014 um 12:55 Uhr #7834Frank Pavlic
TeilnehmerHallo,
try
{
StatemodelProvider.changeState(auftrag, AuftragSM.State_10);
}
catch (Exception ex)
{
context.joblogWarn(ex.getMessage());
}context.joblogWarn gibt doch nur eine Meldung aus, führt aber keinen weiteren throw aus. Du fängst zwar die Exception, gibst diese aber nicht weiter. Lediglich eine Statusmeldung wird ausgegeben. Also sollte folgendes dein Problem lösen:
try
{
StatemodelProvider.changeState(auftrag, AuftragSM.State_10);
}
catch (Exception ex)
{
context.joblogWarn(ex.getMessage());
throw new BusinessException("ABBRUCH!");
}
Gruß
Frank21 August 2014 um 13:07 Uhr #7841Matthias KÖPER
TeilnehmerDanke für die Antwort.
BusinessExceptions scheinen für die Jobregeln nicht vorgesehen zu sein:JobStatuswechselAuftragNeuNachReserviert.java:20: execute(org.nuclos.api.context.JobContext) in org.nuclet.auftragsverwaltung.JobStatuswechselAuftragNeuNachReserviert cannot implement execute(org.nuclos.api.context.JobContext) in org.nuclos.api.rule.JobRule
overridden method does not throw org.nuclos.api.exception.BusinessExceptionIrgendwie fehlt mir eine Idee, wie ich den Statuswechsel für diesen einen Auftrag kontrolliert abbrechen kann. Die anderen Aufträge sollen natürlich weiter bearbeitet werden.
Beim manuellen Statuswechsel wird der Statuswechsel nach Auftreten der Exception genau an dieser Stelle abgebrochen und es werden keine weiteren Regeln mehr ausgeführt.Viele Grüße
mkoeper21 August 2014 um 17:58 Uhr #7844Frank Pavlic
TeilnehmerHallo,
ok, das ist schlecht, allerdings auch wieder verständlich. Denn warum sollte man eine Exception werfen wollen, wenn Jobs eigentlich eine Methode sind, eine Liste von Datensätzen im Hintergrund abzuarbeiten. Ich würde im Job den Bestand vorher abfragen und dann erst den Statuswechsel initiieren, im Falle von genügend Bestand. Packe also deine Bestandskontrollfunktion, die du im Statusmodell bei Statuswechsel verwendest, in eine Bibliothek und benutze diese ebenfalls im Job, vor dem changeState(…) Aufruf. Das müsste dein Problem lösen.
Kurz: Nicht einen kontrollierten Abbruch, sondern vor dem Statuswechsel _alle_ Prüfungen durchführen.Die Funktionen hast Du ja bereits, nur noch ein wenig umstruktieren, falls diese noch nicht in einer Bibliothek platziert sind.
Gruß
Frank22 August 2014 um 00:27 Uhr #7845Ramin Goettlich
TeilnehmerHier gibt es wohl einen Zusammenhang mit dem letzten Punkt aus http://support.nuclos.de/browse/NUCLOS-1534
22 August 2014 um 11:29 Uhr #7846Matthias KÖPER
TeilnehmerIch hatte gehofft, ich komme um das Prüfen herum. Das kann bei manchen Regeln durchaus aufwändig sein und am Ende bleibt die Hoffnung, dass man alle Eventualitäten vorher abgefangen hat.
Ich habe zu diesem Thema und noch zu einem anderen Job-Problem ein Ticket erfasst. Ich weiß nicht, wo gerade die Prioritäten bei Novabit liegen. Da aber noch andere Tickets zum Thema Jobs offen sind, würde es sich vielleicht lohnen, das Thema einmal grundsätzlich anzupacken. Grundsätzlich sind die Jobs nämlich eine feine Sache!
Vielen Grüße,
skoeper -
AutorBeiträge