AMQP permite recibir mensajes en 2 modos:
- Solicitado por el cliente: usando el método GetMessage. Si no hay mensajes en la cola, se disparará el evento OnAMQPBasicGetEmpty.
- Enviado por el servidor: usando el método Consume.
Consume
Los consumidores consumen de las colas. Para consumir mensajes debe existir una cola. Cuando se añade un nuevo consumidor, asumiendo que ya hay mensajes listos en la cola, las entregas comenzarán de inmediato.
La cola de destino puede estar vacÃa en el momento de registrar el consumidor. En ese caso, las primeras entregas se producirán cuando se encolen nuevos mensajes.
Consumir mensajes es una tarea asÃncrona, lo que significa que cada vez que un nuevo mensaje pueda entregarse a la cola del consumidor, el servidor lo envÃa al cliente automáticamente. Puedes leer un método alternativo para recibir mensajes de forma sÃncrona.
El método Consume crea un nuevo consumidor en la cola y cada vez que llega un nuevo mensaje, este se entrega automáticamente al cliente consumidor.
El método tiene los siguientes argumentos:
- ChannelName: es el nombre del canal (debe estar abierto antes de llamar a este método).
- QueueName: es el nombre de la cola, no debe superar los 255 caracteres ni comenzar por "amq." (excepto si el parámetro passive es true).
- ConsumerTag: es el nombre del consumidor y debe ser único. Si no se establece, el servidor crea uno.
- NoLocal: si es true, el consumidor nunca consume mensajes publicados en el mismo canal.
- NoAck: si es true, el servidor no espera un acknowledgement por cada mensaje entregado.
- Exclusive: si es true, impide que otros consumidores consuman mensajes de esta cola.
- NoWait: si es true, el servidor no enviará acknowledgement al cliente.
Los mensajes se entregan en el 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;
Obtener mensajes
Obtener mensajes es una tarea sÃncrona, lo que significa que es el cliente quien pregunta al servidor si hay mensajes en la cola. Puedes leer un método alternativo para recibir mensajes de forma asÃncrona.
El método GetMessage envÃa una solicitud al servidor AMQP preguntando si hay mensajes disponibles en una cola. Si hay mensajes, se entregarán en el evento OnAMQPBasicGetOk y si la cola está vacÃa, se disparará el evento OnAMQPBasicGetEmpty.
El método tiene los siguientes argumentos:
- ChannelName: es el nombre del canal (debe estar abierto antes de llamar a este método).
- QueueName: es el nombre de la cola, no debe superar los 255 caracteres ni comenzar por "amq." (excepto si el parámetro passive es true).
- NoWait: si es true, el servidor no enviará acknowledgement al 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;
