Client AMQP 1.0.0 per Delphi

· Componenti

Da sgcWebSockets 2024.2.0 AMQP 1.0.0 è supportato.

AMQP (Advanced Message Queuing Protocol) 1.0.0 è un protocollo di messaggistica progettato per comunicazioni affidabili e asincrone tra sistemi distribuiti. Facilita lo scambio di messaggi tra applicazioni o componenti in modo disaccoppiato, permettendo loro di comunicare senza dipendenze dirette. 

Nel complesso, AMQP 1.0.0 offre un modo standardizzato e interoperabile per far comunicare componenti software e sistemi diversi in modo loosely coupled, rendendolo adatto a diverse applicazioni distribuite e di livello enterprise. 

Funzionalità di AMQP

Configurazione

Il client AMQP 1.0.0 ha la proprietà AMQPOptions tramite cui configurare la connessione.

L'autenticazione AMQP deve essere configurata nella proprietà Authentication.

Connessione

 La connessione inizia con il client (di solito un'applicazione o un servizio di messaggistica) che apre una connessione TCP al server (il message broker). Il client si connette alla porta del server, tipicamente 5672 per connessioni non TLS e 5671 per connessioni protette TLS. Una volta stabilita la connessione TCP, client e server negoziano la versione del protocollo AMQP da usare. AMQP 1.0.0 supporta diverse versioni e, durante la negoziazione, entrambi concordano nell'usare la versione 1.0.0.

Dopo la negoziazione del protocollo, il client potrebbe dover autenticarsi al server, a seconda della configurazione di quest'ultimo. I meccanismi di autenticazione possono includere SASL (Simple Authentication and Security Layer) come PLAIN, EXTERNAL o altri supportati dal server.

Esempio: connessione a un server AMQP in ascolto sulla porta sicura 5671 usando credenziali 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; 

Sessioni

Una volta autenticato, il client apre una sessione AMQP. Una sessione è un contesto logico di comunicazione tra client e server. Le sessioni servono a raggruppare operazioni di messaggistica correlate. Usa il metodo CreateSession per creare una nuova sessione; il metodo permette di impostare il nome della sessione o di lasciarlo vuoto, e il componente ne assegnerà uno automaticamente.

Se la sessione è stata creata correttamente, l'evento OnAMQPSessionOpen verrà sollevato con i dettagli della sessione. 

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

All'interno di una sessione, il client crea dei link per comunicare con entità specifiche come code, topic o altre risorse fornite dal server. I link sono canali di comunicazione bidirezionali usati per inviare e ricevere messaggi.

Il componente può funzionare come nodo mittente e ricevente. Permette di creare un numero qualunque di link per ogni sessione, fino al limite impostato nella proprietà MaxLinksPerSession

Sender Link

Per creare un nuovo sender link, usa il metodo CreateSenderLink e passa il nome della sessione e opzionalmente il nome del sender link. Se il link viene creato correttamente, viene sollevato l'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 Link

Per creare un nuovo receiver link, usa il metodo CreateReceiverLink e passa il nome della sessione e opzionalmente il nome del receiver link. Se il link viene creato correttamente, viene sollevato l'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; 

Inviare messaggi

Una volta stabilita la sessione e creati i link, il client può iniziare a eseguire operazioni sui messaggi, ad esempio inviarli a una destinazione. Usa il metodo SendMessage per inviare un messaggio tramite un sender link. 

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

Leggere messaggi

Per impostazione predefinita i Receiver Link vengono creati in modalità Automatica, il che significa che ogni volta che arriva un nuovo messaggio questo viene consegnato al client.

Se i Receiver Link sono stati creati in modalità manuale, usa il metodo sincrono GetMessage per fare il fetch e attendere l'arrivo di un nuovo messaggio.

In modalità Automatica e Manuale, ogni volta che arriva un nuovo messaggio viene sollevato l'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; 

Documentazione

AMQP1 Delphi Client

Scopri di più sul client AMQP 1.0.0 per Delphi / C++ Builder https://www.esegece.com/help/sgcWebSockets/#t=Components%2FProtocols%2FSubprotocols%2FAMQP1%2FProtocol_AMQP1.htm

Scarica la demo

Scarica la demo del client AMQP 1.0.0 compilata per Windows con la libreria sgcWebSockets.