Home Forum Nuclos Konfiguration Businessprozesse Statuswechsel mit Regeln per Job automatisieren

Ansicht von 8 Beiträgen - 1 bis 8 (von insgesamt 8)
  • Autor
    Beiträge
  • #7755
    Matthias KÖPER
    Teilnehmer

    Hallo,

    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)
    {
    List results = 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,
    mkoeper

    #7796
    Ramin Goettlich
    Teilnehmer

    Das 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

    #7831
    Matthias KÖPER
    Teilnehmer

    Die 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.

    #7834
    Frank Pavlic
    Teilnehmer

    Hallo,
    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ß
    Frank

    #7841
    Matthias KÖPER
    Teilnehmer

    Danke 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.BusinessException

    Irgendwie 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
    mkoeper

    #7844
    Frank Pavlic
    Teilnehmer

    Hallo,
    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ß
    Frank

    #7845
    Ramin Goettlich
    Teilnehmer

    Hier gibt es wohl einen Zusammenhang mit dem letzten Punkt aus http://support.nuclos.de/browse/NUCLOS-1534

    #7846
    Matthias KÖPER
    Teilnehmer

    Ich 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

Ansicht von 8 Beiträgen - 1 bis 8 (von insgesamt 8)