[gelöst]BC 16.6 Aufgabenwarteschlange und SingleInstance

26. Februar 2021 13:48

Hallo Allerseits,

ich möchte mit einem Codeunit Messages aus eine MSMQ-MessageQueue abholen. Dazu habe ich ein Single-Instance-Codeunit geschrieben, das auf einen Event (ReceiveCompleted) der Message-Queue wartet, und immer wenn eine neue Message angekommen ist, eine Table befüllt.

Code:
codeunit 50004 "bero_MSMQ Messages Receive"
{
    SingleInstance = true;

    trigger OnRun()
    begin
        StartReceiveMSMQ();
    end;

    local procedure StartReceiveMSMQ()
    begin
        MsmqQueue := MsmqQueue.MessageQueue('private$\Incoming');
        MsmqQueue.BeginReceive();
    end;

    trigger MsmqQueue::ReceiveCompleted(sender: Variant; e: DotNet MSMQ_ReceiveCompletedEventArgs)
    var
        MQMessages: Record bero_MQMessages;
        InStr: InStream;
        OutStr: OutStream;
        TextBuf: Text;

    begin

        Clear(MQMessages);
        InStr := e.Message.BodyStream;
        MQMessages.Content.CreateOutStream(OutStr);

        repeat
            InStr.ReadText(TextBuf);
            Outstr.WriteText(TextBuf);
        until InStr.EOS;

        MQMessages.MsgType := MQMessages.MsgType::Incoming;
        MQMessages.QueueName := MsmqQueue.QueueName;
        MQMessages.Insert(true);
        Commit();
        MsmqQueue.BeginReceive();
    end;

    var
        [WithEvents]
        MsmqQueue: DotNet MSMQ_MessageQueue;
}

Wenn ich dieses Codeunit starte, dann funktioniert alles ordnungsgemäß. Solange ich angemeldet bleibe, werden alle Messages abgearbeitet. Wenn ich mich vom BC abmelde, dann bleiben die Messages in der Queue - das ist logisch, denn dann läuft ja auch das Codeunit nicht mehr im Hintergrund.

Ich möchte jetzt, dass die Messages abgeholt werden, ohne dass ich mich einlogge und die Codeunit starte. Das haben wir früher bei Nav 4.x mit einem NAS gemacht, der startete das Single-Instance Codeunit.
In der Aufgabenwarteschlange funktioniert das so nicht. Das Codeunit wird zwar gestartet, aber sofort wieder beendet, läuft also nicht als Single-Instance wie gewohnt.

Was ist zu tun? Kann ich das überhaupt so in der Aufgabenwarteschlange realisieren, oder muss da auch wieder eine NAS-Service installiert und gestartet werden?
Zuletzt geändert von elf am 3. März 2021 14:36, insgesamt 1-mal geändert.

Re: BC 16.6 Aufgabenwarteschlange und SingleInstance Codeuni

26. Februar 2021 15:05

elf hat geschrieben:Was ist zu tun? Kann ich das überhaupt so in der Aufgabenwarteschlange realisieren, oder muss da auch wieder eine NAS-Service installiert und gestartet werden?


also wenn die Codeunit über die Aufgabenwarteschlange gestartet wird, dann läuft ja der Taskscheduler (bitte nur eine NAV-Instanz mit aktivem TaskScheduler verwenden) - somit sollte das passen.
Gibt es einen besonderen Grund, warum du eine SI Codeunit nimmst?
Steht etwas im Protokoll der Aufgabenwarteschlange?
Steht etwas im Ereignisprotokoll des Servers?

Re: BC 16.6 Aufgabenwarteschlange und SingleInstance Codeuni

26. Februar 2021 16:48

Der Grund für die SI Codeunit ist, dass die Messages über den ganzen Tag verteilt eingehen, und dann sofort verarbeitet werden sollen. Die Codeunit muss ja als SI laufen, um auf Events zu warten. Wie gesagt, bei manuellem Start mit "Codeunit.run" läuft das ordnungsgemäß, solange ich eingeloggt bleibe.

Alternativ könnte ich auch eine Codeunit als nicht SI laufen lassen, die einmalig in die Messagequeue reinschaut und die Messages abholt, wenn welche da sind. Das müsste dann in der Jobqueue mit Wiederholung jede Minute laufen und füllt mir das Protokoll, das wollte ich verhindern.

Im Protokoll der Aufgabenwarteschlange steht keine Fehlermeldung, lediglich die Startzeit und die Laufzeit (200mS).

Im Ereignisprotokoll des Servers ist auch nix drin.

Re: BC 16.6 Aufgabenwarteschlange und SingleInstance Codeuni

27. Februar 2021 12:24

Ich vermute mal, dass es daran liegt, dass der TaskScheduler für jede fällige Aufgabe eine Hintergrund-Session eröffnet, die Aufgabe einmalig ausführt, neu plant und dann die Session wieder beendet.
Diese Hintergrund-Sessions werden aber nur dann ausgeführt, wenn auch mindestens ein User auf dem ServiceTier mit dem aktivierten TaskScheduler angemeldet ist.

Für deinen Anwendungsfall brauchst du also weiterhin einen NAS-Dienst, der deine Codeunit ausführt.

Re: BC 16.6 Aufgabenwarteschlange und SingleInstance Codeuni

1. März 2021 10:21

Timo Lässer hat geschrieben:Diese Hintergrund-Sessions werden aber nur dann ausgeführt, wenn auch mindestens ein User auf dem ServiceTier mit dem aktivierten TaskScheduler angemeldet ist.


auf die Gefahr hin, mich jetzt zum Deppen zu machen: wirklich? es müssen User angemeldet sein, damit die Jobs laufen?

Re: BC 16.6 Aufgabenwarteschlange und SingleInstance Codeuni

1. März 2021 10:32

das hatte ich schon mal mit einem anderen Test-Job ausprobiert (Job schreibt aktuelle Uhrzeit in Table, nicht als Single-Instance): der Job läuft auch dann, wenn ich nicht angemeldet bin. Also: Job als wiederholend täglich, Abstand 1Minute gestartet , alle User abgemeldet, am nächsten Morgen geschaut, alle Einträge waren vorhanden.

Re: BC 16.6 Aufgabenwarteschlange und SingleInstance Codeuni

1. März 2021 10:42

Beruhigend zu wissen.
Dann hatten wir wohl mal (unter NAV 2017) eine Build-Version, in der es so war und in einem späteren CU gefixt wurde.
Ich kann leider nicht mehr sagen, welches Build es war, bei dem wir das festgestellt hatten.

Re: BC 16.6 Aufgabenwarteschlange und SingleInstance Codeuni

3. März 2021 09:38

Timo Lässer hat geschrieben:...(unter NAV 2017) eine Build-Version, in der es so war und in einem späteren CU gefixt wurde...

Da ist einiges gefixt worden.

Re: BC 16.6 Aufgabenwarteschlange und SingleInstance Codeuni

3. März 2021 09:54

Ich habe es nochmal gecheckt, die Job-Queue läuft auch ohne Benutzer-Anmeldung brav weiter.

Aber das löst mein Problem nicht. Anscheinend laufe Single-Instance Codunits nicht wirklich als SI in der Job-Queue. Ich habe die Codeunit jetzt so geändert, dass sie ohne Events auskommt. Sie wird jede Minute gestartet und fragt dann ab, ob neue Messages in der Queue sind. Allerdings müllt mir dann das Protokll zu. Es gibt täglich 1440 Einträge.

Gibt es eigentlich eine Bereinigungs-Funktion für das Job-Queue Protokoll? Sowas wie Datumskomprimiereung?

Re: BC 16.6 Aufgabenwarteschlange und SingleInstance Codeuni

3. März 2021 14:13

Unabhängig davon, wann die Aufgabenwarteschlange die Aufgaben ausführt bleibt immer noch das Problem, dass für jeden Durchlauf des Task-Schedulers eine Hintergrund-Session eröffnet wird, die anschließend wieder beendet wird.
Somit verbleibt die SI-Codeunit nicht im Speicher.

Das wäre so, als würdest du den Windows-Client öffnen, die SI-Codeunit manuell starten und nach einmaligem Durchlauf den Windows-Client wieder beenden. 10 Minuten später startest du dann wieder den Windows-Client, führst die Codeunit aus und schließt den Client wieder. ... ... ...

Re: BC 16.6 Aufgabenwarteschlange und SingleInstance Codeuni

3. März 2021 14:25

Hallo,

blöde Frage: ich hab hier gerade kein original admin- Tool, aber der Servicetieradmin bietet mir die Möglichkeit auch bei BC17 die NAS- Services zu konfigurieren.

Wäre das keine Lösung mit der Codeunit als Endlosschleife?.

Gruß Fiddi

Re: BC 16.6 Aufgabenwarteschlange und SingleInstance Codeuni

3. März 2021 14:35

ja, NAS wäre wahrscheinlich die beste Lösung. Aber jetzt hab' ich das mit der Job-Queue erst mal gemacht und polle hat jede Minute die Message-Queue. Wenn ich irgendwann etwas Zeit habe, dann werde ich mich mit der NAS-Lösung beschäftigen.