AMQP permette di ricevere i messaggi in 2 modalità:
- Richiesta dal client: usando il metodo GetMessage. Se nella coda non ci sono messaggi, viene chiamato l'evento OnAMQPBasicGetEmpty.
- Push dal server: usando il metodo Consume.
Consume
I consumer consumano dalle code. Per consumare messaggi deve esistere una coda. Quando si aggiunge un nuovo consumer, se nella coda ci sono già messaggi pronti, le consegne iniziano immediatamente.
La coda di destinazione può essere vuota al momento della registrazione del consumer. In tal caso le prime consegne avverranno quando verranno accodati nuovi messaggi.
Consumare messaggi è un'operazione asincrona: ogni volta che un nuovo messaggio può essere consegnato alla coda del consumer, viene inviato dal server al client automaticamente. Puoi leggere un metodo alternativo per ricevere messaggi in modo sincrono.
Il metodo Consume crea un nuovo consumer sulla coda; ogni volta che arriva un nuovo messaggio, questo viene consegnato automaticamente al client consumer.
Il metodo ha i seguenti argomenti:
- ChannelName: è il nome del canale (deve essere aperto prima di chiamare questo metodo).
- QueueName: è il nome della coda, non deve superare i 255 caratteri e non iniziare con "amq." (eccetto se il parametro passive è true).
- ConsumerTag: è il nome del consumer e deve essere univoco. Se non viene impostato, il server ne crea uno nuovo.
- NoLocal: se true significa che il consumer non consuma mai i messaggi pubblicati sullo stesso canale.
- NoAck: se true significa che il server non si aspetta una conferma per ogni messaggio consegnato.
- Exclusive: se true impedisce che altri consumer consumino messaggi da questa coda.
- NoWait: se true, il server non invia una conferma al client.
I messaggi vengono consegnati tramite l'evento 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;
Get Messages
Ottenere messaggi è un'operazione sincrona: è il client a chiedere al server se ci sono messaggi nella coda. Puoi leggere un metodo alternativo per ricevere messaggi in modo asincrono.
Il metodo GetMessage invia una richiesta al server AMQP chiedendo se ci sono messaggi disponibili in una coda. Se ci sono messaggi, vengono inviati tramite l'evento OnAMQPBasicGetOk; se la coda è vuota, viene chiamato l'evento OnAMQPBasicGetEmpty.
Il metodo ha i seguenti argomenti:
- ChannelName: è il nome del canale (deve essere aperto prima di chiamare questo metodo).
- QueueName: è il nome della coda, non deve superare i 255 caratteri e non iniziare con "amq." (eccetto se il parametro passive è true).
- NoWait: se true, il server non invia una conferma al 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;
