Cliente AMQP 1.0.0 para Delphi

· Componentes

Desde sgcWebSockets 2024.2.0 AMQP 1.0.0 es compatible.

AMQP (Advanced Message Queuing Protocol) 1.0.0 es un protocolo de mensajería diseñado para comunicación fiable y asíncrona entre sistemas distribuidos. Facilita el intercambio de mensajes entre aplicaciones o componentes de forma desacoplada, permitiéndoles comunicarse sin dependencias directas. 

En conjunto, AMQP 1.0.0 ofrece una forma estandarizada e interoperable para que distintos componentes y sistemas software se comuniquen de manera débilmente acoplada, lo que lo hace adecuado para diversas aplicaciones distribuidas y de nivel empresarial. 

Características de AMQP

Configuración

El cliente AMQP 1.0.0 tiene la propiedad AMQPOptions donde puedes configurar la conexión.

La autenticación AMQP debe configurarse en la propiedad Authentication.

Conexión

 La conexión comienza con el cliente (normalmente una aplicación o servicio de mensajería) iniciando una conexión TCP con el servidor (el message broker). El cliente se conecta al puerto del servidor, normalmente 5672 para conexiones sin TLS y 5671 para conexiones aseguradas con TLS. Una vez establecida la conexión TCP, cliente y servidor negocian la versión de protocolo AMQP que usarán. AMQP 1.0.0 admite varias versiones, y durante la negociación ambas partes acuerdan usar la versión 1.0.0.

Tras la negociación del protocolo, el cliente puede necesitar autenticarse en el servidor, dependiendo de su configuración. Los mecanismos de autenticación pueden incluir mecanismos SASL (Simple Authentication and Security Layer) como PLAIN, EXTERNAL u otros soportados por el servidor.

Ejemplo: conectar a un servidor AMQP escuchando en el puerto seguro 5671 y usando credenciales SASL

// Creating AMQP client
oAMQP := TsgcWSPClient_AMQP1.Create(nil);
// Setting AMQP authentication options
oAMQP.AMQPOptions.Authentication.AuthType := amqp1authSASLPlain;
oAMQP.AMQPOptions.Authentication.Username := 'sgc';
oAMQP.AMQPOptions.Authentication.Password := 'sgc';
// Creating WebSocket client
oClient := TsgcWebSocketClient.Create(nil);
// Setting WebSocket specifications
oClient.Specifications.RFC6455 := False;
// Setting WebSocket client properties
oClient.Host := 'www.esegece.com';
oClient.Port := 5671;
oClient.TLS := True;
// Assigning WebSocket client to AMQP client
oAMQP.Client := oClient;
// Activating WebSocket client
oClient.Active := True; 

Sesiones

Una vez autenticado, el cliente abre una sesión AMQP. Una sesión es un contexto lógico para la comunicación entre cliente y servidor. Las sesiones se usan para agrupar operaciones de mensajería relacionadas. Usa el método CreateSession para crear una nueva sesión; el método permite establecer el nombre de la sesión o dejarlo vacío y el componente asignará uno automáticamente.

Si la sesión se ha creado correctamente, se disparará el evento OnAMQPSessionOpen con los detalles de la sesión. 

AMQP1.CreateSession('MySession');
procedure AMQP1AMQPSessionOpen(Sender: TObject; const aSession: TsgcAMQP1Session; 
  const aBegin: TsgcAMQP1FrameBegin);
begin
  ShowMessage('#session-open: ' + aSession.Id);
end; 

Dentro de una sesión, el cliente crea links para comunicarse con entidades específicas como colas, topics u otros recursos proporcionados por el servidor. Los links son canales de comunicación bidireccionales usados para enviar y recibir mensajes.

El componente puede actuar como nodo emisor y receptor. Permite crear cualquier cantidad de links por sesión, hasta el límite establecido en la propiedad MaxLinksPerSession

Sender Links

Para crear un nuevo sender link, usa el método CreateSenderLink y pasa el nombre de la sesión y opcionalmente el nombre del sender link. Si el link se crea correctamente, se dispara el evento OnAMQPLinkOpen.

AMQP1.CreateSenderLink('MySession', 'MySenderLink');
procedure procedure TfrmClientAMQP1.AMQP1AMQPLinkOpen(Sender: TObject; 
  const aSession: TsgcAMQP1Session; const aLink: TsgcAMQP1Link; const aAttach: TsgcAMQP1FrameAttach);
begin
  ShowMessage('#link-open: ' + aLink.Name);
end; 

Receiver Links

Para crear un nuevo receiver link, usa el método CreateReceiverLink y pasa el nombre de la sesión y opcionalmente el nombre del receiver link. Si el link se crea correctamente, se dispara el evento OnAMQPLinkOpen

AMQP1.CreateReceiverLink('MySession', 'MyReceiverLink');
procedure procedure TfrmClientAMQP1.AMQP1AMQPLinkOpen(Sender: TObject; 
  const aSession: TsgcAMQP1Session; const aLink: TsgcAMQP1Link; const aAttach: TsgcAMQP1FrameAttach);
begin
  ShowMessage('#link-open: ' + aLink.Name);
end; 

Enviar mensajes

Con la sesión establecida y los links creados, el cliente puede empezar a realizar operaciones de mensajes, como enviar mensajes a un destino. Usa el método SendMessage para enviar un mensaje a través de un sender link. 

AMQP1.SendMessage('MySession', 'MySenderLink', 'My first AMQP Message'); 

Leer mensajes

Por defecto, los Receiver Links se crean en modo automático, lo que significa que cada vez que llega un nuevo mensaje, se entrega al cliente.

Si los Receiver Links se han creado en modo manual, usa el método síncrono GetMessage para obtener y esperar hasta que llegue un nuevo mensaje.

Tanto en modo automático como manual, cada vez que llega un nuevo mensaje se dispara el evento OnAMQPMessage

procedure OnAMQPMessageEvent(Sender: TObject; const aSession:
    TsgcAMQP1Session; const aLink: TsgcAMQP1ReceiverLink; const aMessage:
    TsgcAMQP1Message; var DeliveryState: TsgcAMQP1MessageDeliveryState);
begin
  ShowMessage(aMessage.ApplicationData.AMQPValue.Value);
end; 

Documentación

Cliente AMQP1 para Delphi

Más información sobre el cliente AMQP 1.0.0 para Delphi / CBuilder https://www.esegece.com/help/sgcWebSockets/#t=Components%2FProtocols%2FSubprotocols%2FAMQP1%2FProtocol_AMQP1.htm

Descargar demo

Descarga la demo del cliente AMQP 1.0.0 compilada para Windows usando la librería sgcWebSockets.