[gelöst]BC 16.6 Aufgabenwarteschlange und SingleInstance
Verfasst: 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.
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?
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?