AMQP allows para receber o messages em 2 modes:
- Request por Client: using o GetMessage method. If there aren't messages no queue, o evento OnAMQPBasicGetEmpty será chamado.
- Pushed por Server: using o Consume method.
Consumir
Consumers consume um partir de queues. Para consume messages there has para be uma fila. When um novo consumer is added, assuming there are already messages ready no queue, deliveries will iniciar immediately.
The target queue pode ser empty no time de consumer registration. In that case first deliveries will happen when new messages are enqueued.
Consuming messages is um asynchronous task, o que significa that every time um novo message pode ser delivered para o consumer queue, it's pushed por o servidor para o cliente automaticamente. Você pode read um alternative method para Receber Message Synchronously.
O método Consume creates um novo consumer no queue, e every time there is um novo message this será delivered automaticamente para o consumer client.
O método tem os seguintes argumentos:
- ChannelName: it's o name do channel (deve ser abrir before call this method).
- QueueName: it's o name do queue, deve ser no longer de 255 characters e not begin com "amq." (exceto se o parâmetro passive para true).
- ConsumerTag: it's o name do consumer e deve ser unique. If it's not set, then o servidor creates um novo one.
- NoLocal: if true means o consumer nunca consumes messages published no same channel.
- NoAck: if true means o servidor doesn't expect um acknowledgment para every message delivered.
- Exclusive: if true prevents that other consumers consume messages um partir de this queue.
- NoWait: if true, o servidor won't send um acknowledgment para o cliente.
The messages are delivered OnAMQPBasigGetOk event.
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;
Obter Mensagens
Getting messages is um Synchronous task, o que significa that is o cliente who ask para server is there are messages no queue. Você pode read um alternative method para Receber Message Aynchronously.
O método GetMessage sends um request para o servidor AMQP asking if there are messages available em uma fila. If there are messages these será dispatched OnAMQPBasicGetOk event e if um fila is empty, o evento OnAMQPBasicGetEmpty será chamado.
O método tem os seguintes argumentos:
- ChannelName: it's o name do channel (deve ser abrir before call this method).
- QueueName: it's o name do queue, deve ser no longer de 255 characters e not begin com "amq." (exceto se o parâmetro passive para true).
- NoWait: if true, o servidor won't send um acknowledgment para o cliente.
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;
