AMQP staat toe om berichten op 2 manieren te ontvangen:
- Aangevraagd door client: via de methode GetMessage. Als er geen berichten in de queue staan, wordt de gebeurtenis OnAMQPBasicGetEmpty aangeroepen.
- Gepusht door server: via de methode Consume.
Consume
Consumers consumeren uit queues. Om berichten te kunnen consumeren, moet er een queue zijn. Wanneer een nieuwe consumer wordt toegevoegd en er al berichten klaarstaan in de queue, beginnen de afleveringen onmiddellijk.
De doel-queue kan leeg zijn op het moment dat de consumer wordt geregistreerd. In dat geval beginnen de afleveringen pas wanneer nieuwe berichten in de queue worden geplaatst.
Het consumeren van berichten is een asynchrone taak: elke keer dat een nieuw bericht aan de consumer-queue kan worden bezorgd, wordt het door de server automatisch naar de client gepusht. Lees ook een alternatieve methode om berichten synchroon te ontvangen.
De methode Consume maakt een nieuwe consumer aan in de queue, en elke keer dat er een nieuw bericht is, wordt dit automatisch bezorgd bij de consumer-client.
De methode heeft de volgende argumenten:
- ChannelName: dit is de naam van het kanaal (moet geopend zijn voor deze methode wordt aangeroepen).
- QueueName: dit is de naam van de queue, mag niet langer zijn dan 255 tekens en niet beginnen met "amq." (tenzij de passive-parameter true is).
- ConsumerTag: dit is de naam van de consumer en moet uniek zijn. Als deze niet is ingesteld, maakt de server een nieuwe aan.
- NoLocal: als true, betekent dit dat de consumer nooit berichten consumeert die op hetzelfde kanaal zijn gepubliceerd.
- NoAck: als true, betekent dit dat de server geen bevestiging verwacht voor elk afgeleverd bericht.
- Exclusive: als true, voorkomt dit dat andere consumers berichten uit deze queue consumeren.
- NoWait: als true, stuurt de server geen bevestiging naar de client.
De berichten worden afgeleverd via de gebeurtenis OnAMQPBasigGetOk.
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;
Berichten ophalen
Het ophalen van berichten is een synchrone taak, wat betekent dat het de client is die aan de server vraagt of er berichten in de queue staan. Lees ook een alternatieve methode om berichten asynchroon te ontvangen.
De methode GetMessage stuurt een verzoek naar de AMQP-server om te vragen of er berichten beschikbaar zijn in een queue. Als er berichten zijn, worden deze verstuurd via de gebeurtenis OnAMQPBasicGetOk, en als de queue leeg is, wordt de gebeurtenis OnAMQPBasicGetEmpty aangeroepen.
De methode heeft de volgende argumenten:
- ChannelName: dit is de naam van het kanaal (moet geopend zijn voor deze methode wordt aangeroepen).
- QueueName: dit is de naam van de queue, mag niet langer zijn dan 255 tekens en niet beginnen met "amq." (tenzij de passive-parameter true is).
- NoWait: als true, stuurt de server geen bevestiging naar de 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;
