AMQP erlaubt das Empfangen von Nachrichten in 2 Modi:
- Anforderung durch den Client: über die Methode GetMessage. Wenn keine Nachrichten in der Queue vorhanden sind, wird das Ereignis OnAMQPBasicGetEmpty ausgelöst.
- Vom Server gepusht: über die Methode Consume.
Consume
Consumer konsumieren aus Queues. Um Nachrichten zu konsumieren, muss eine Queue vorhanden sein. Wird ein neuer Consumer hinzugefügt und sind bereits Nachrichten in der Queue, beginnt die Auslieferung sofort.
Die Ziel-Queue kann zum Zeitpunkt der Consumer-Registrierung leer sein. In diesem Fall erfolgen die ersten Auslieferungen, sobald neue Nachrichten in die Queue eingereiht werden.
Das Konsumieren von Nachrichten ist eine asynchrone Aufgabe: Jedes Mal, wenn eine neue Nachricht an die Consumer-Queue ausgeliefert werden kann, wird sie vom Server automatisch an den Client gepusht. Du kannst eine alternative Methode lesen, um Nachrichten synchron zu empfangen.
Die Methode Consume erstellt einen neuen Consumer in der Queue, und jedes Mal, wenn eine neue Nachricht eintrifft, wird sie automatisch an den Consumer-Client ausgeliefert.
Die Methode hat folgende Argumente:
- ChannelName: der Name des Kanals (muss vor dem Aufruf dieser Methode geöffnet sein).
- QueueName: der Name der Queue, darf nicht länger als 255 Zeichen sein und nicht mit "amq." beginnen (außer wenn der passive-Parameter true ist).
- ConsumerTag: der Name des Consumers und muss eindeutig sein. Wird er nicht gesetzt, erstellt der Server einen neuen.
- NoLocal: wenn true, konsumiert der Consumer nie Nachrichten, die auf demselben Kanal veröffentlicht wurden.
- NoAck: wenn true, erwartet der Server für jede ausgelieferte Nachricht keine Bestätigung.
- Exclusive: wenn true, verhindert das, dass andere Consumer Nachrichten aus dieser Queue konsumieren.
- NoWait: wenn true, sendet der Server keine Bestätigung an den Client.
Die Nachrichten werden über das Ereignis OnAMQPBasigGetOk ausgeliefert.
AMQP.Consume('channel_name', 'exchange_name', 'consumer_tag');
procedure OnAMQPBasicGetOk(Sender: TObject; const aChannel: string; const aGetOk: TsgcAMQPFramePayload_Method_BasicGetOk; const aContent: TsgcAMQPMessageContent);
begin
DoLog('#AMQP_basic_GetOk: ' + aChannel + ' ' + IntToStr(aGetOk.MessageCount) + ' ' + aContent.Body.AsString);
end;
Nachrichten abrufen
Das Abrufen von Nachrichten ist eine synchrone Aufgabe: Der Client fragt den Server, ob Nachrichten in der Queue vorhanden sind. Du kannst eine alternative Methode lesen, um Nachrichten asynchron zu empfangen.
Die Methode GetMessage sendet eine Anfrage an den AMQP-Server, ob Nachrichten in einer Queue verfügbar sind. Sind Nachrichten vorhanden, werden sie über das Ereignis OnAMQPBasicGetOk ausgeliefert. Ist die Queue leer, wird das Ereignis OnAMQPBasicGetEmpty ausgelöst.
Die Methode hat folgende Argumente:
- ChannelName: der Name des Kanals (muss vor dem Aufruf dieser Methode geöffnet sein).
- QueueName: der Name der Queue, darf nicht länger als 255 Zeichen sein und nicht mit "amq." beginnen (außer wenn der passive-Parameter true ist).
- NoWait: wenn true, sendet der Server keine Bestätigung an den Client.
AMQP.GetMessage('channel_name', 'exchange_name');
procedure OnAMQPBasicGetOk(Sender: TObject; const aChannel: string; const aGetOk: TsgcAMQPFramePayload_Method_BasicGetOk; const aContent: TsgcAMQPMessageContent);
begin
DoLog('#AMQP_basic_GetOk: ' + aChannel + ' ' + IntToStr(aGetOk.MessageCount) + ' ' + aContent.Body.AsString);
end;
procedure OnAMQPBasicGetEmpty(Sender: TObject; const aChannel: string);
begin
DoLog('#AMQP_basic_GetEmpty: ' + aChannel);
end;
