Seite 1 von 1

[gelöst]BC 16.6 Aufgabenwarteschlange und SingleInstance

Verfasst: 26. Februar 2021 13:48
von elf
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?

Re: BC 16.6 Aufgabenwarteschlange und SingleInstance Codeuni

Verfasst: 26. Februar 2021 15:05
von sweikelt
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

Verfasst: 26. Februar 2021 16:48
von elf
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

Verfasst: 27. Februar 2021 12:24
von Timo Lässer
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

Verfasst: 1. März 2021 10:21
von sweikelt
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

Verfasst: 1. März 2021 10:32
von elf
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

Verfasst: 1. März 2021 10:42
von Timo Lässer
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

Verfasst: 3. März 2021 09:38
von m_schneider
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

Verfasst: 3. März 2021 09:54
von elf
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

Verfasst: 3. März 2021 14:13
von Timo Lässer
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

Verfasst: 3. März 2021 14:25
von fiddi
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

Verfasst: 3. März 2021 14:35
von elf
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.