Client AMQP Delphi | Composants AMQP 1.0 & 0.9.1 | eSeGeCe

Client AMQP Delphi — Composants AMQP 1.0 et 0.9.1

Deux composants clients AMQP natifs pour Delphi et C++Builder : TsgcWSPClient_AMQP parle AMQP 0.9.1 à RabbitMQ avec exchanges, queues, bindings et acquittements consommateur, et TsgcWSPClient_AMQP1 parle OASIS AMQP 1.0 à Azure Service Bus, Apache Qpid et tout broker conforme, sur un transport WebSocket ou TCP brut.

Les deux versions d'AMQP, une seule bibliothèque

AMQP 0.9.1 et AMQP 1.0 partagent un nom mais sont des protocoles de fil différents. sgcWebSockets implémente chacun nativement, vous choisissez donc le composant qui correspond à votre broker.

Un client AMQP Delphi connecte votre application VCL ou FMX aux brokers de messages d'entreprise. AMQP 0.9.1 est la version largement déployée utilisée par RabbitMQ : vous déclarez des exchanges et des queues, les liez avec des routing keys, publiez avec basic.publish et consommez avec basic.consume, avec transactions et confirms par-dessus. AMQP 1.0 est le standard OASIS utilisé par Azure Service Bus et Apache Qpid : un protocole de liens symétrique bâti sur des sessions, des liens sender et des liens receiver, avec des helpers de tokens Claims-Based-Security pour l'authentification SAS et OAuth d'Azure Service Bus.

Les deux composants s'attachent à un TsgcWebSocketClient via leur propriété Client et tournent sur un transport WebSocket ou TCP brut, si bien que le même code atteint un broker sur les ports AMQP standards ou tunnelle par le port 443 à travers une infrastructure HTTP-seulement.

AMQP 0.9.1

TsgcWSPClient_AMQP : exchanges, queues, bindings, transactions

AMQP 1.0

TsgcWSPClient_AMQP1 : sessions, liens sender et receiver, tokens CBS

Transports

Transport WebSocket ou TCP brut, TLS optionnel sur les deux

Plateformes

Windows, macOS, Linux, iOS, Android. De Delphi 7 à Delphi 13

Toute la surface du client AMQP

Chaque opération du protocole est une méthode, chaque notification du broker un événement.

Exchanges & queues (0.9.1)

DeclareExchange, DeclareQueue et BindQueue construisent la topologie de routage RabbitMQ depuis le code : routage direct, fanout et topic avec portée par canal via OpenChannel.

Publier & consommer (0.9.1)

PublishMessage envoie vers un exchange avec une routing key ; Consume abonne une queue et les livraisons arrivent via OnAMQPBasicDeliver.

Sessions & liens (1.0)

CreateSession ouvre une session AMQP 1.0, puis CreateSenderLink et CreateReceiverLink s'attachent à une adresse de nœud. Les transferts entrants arrivent via OnAMQPMessage.

Azure Service Bus (1.0)

Les helpers Claims-Based-Security enveloppent le flux de tokens SAS / OAuth d'Azure Service Bus, si bien que s'authentifier contre un namespace est une configuration de propriétés plutôt qu'un échange CBS construit à la main.

Retour de livraison

OnAMQPMessageSent et OnAMQPMessageSentAck signalent quand un transfert a quitté le client et quand le broker l'a réglé.

Authentification SASL

Les défis d'authentification remontent via OnAMQPSASLAuthentication (1.0) et OnAMQPAuthentication / OnAMQPChallenge (0.9.1).

HeartBeat

Le client 0.9.1 publie une propriété HeartBeat pour que les connexions inactives restent vivantes à travers les proxys et les timeouts du broker.

Événements de cycle de vie

OnAMQPConnect, OnAMQPDisconnect, OnAMQPClose et OnAMQPException tiennent l'application informée de l'état du protocole.

Édition

Les deux clients AMQP sont inclus dans chaque édition de sgcWebSockets, de Standard à Enterprise et All-Access, ainsi que dans la bibliothèque .NET.

Publier et consommer en quelques lignes

Associez le composant AMQP à un TsgcWebSocketClient, connectez, puis déclarez / attachez et c'est parti.

uses
  sgcWebSocket, sgcWebSocket_Protocol_AMQP_Client, sgcAMQP_Classes;

var
  WSClient: TsgcWebSocketClient;
  AMQP: TsgcWSPClient_AMQP;
begin
  WSClient := TsgcWebSocketClient.Create(nil);
  WSClient.Host := 'broker.example.com';
  WSClient.Port := 15674;
  WSClient.Options.Parameters := '/ws';

  AMQP := TsgcWSPClient_AMQP.Create(nil);
  AMQP.Client := WSClient;

  AMQP.OnAMQPConnect      := AMQPConnect;
  AMQP.OnAMQPBasicDeliver := AMQPBasicDeliver;

  WSClient.Active := True;
end;

procedure TForm1.AMQPConnect(Sender: TObject);
begin
  AMQP.OpenChannel('ch1');
  AMQP.DeclareExchange('ch1', 'orders', 'direct');
  AMQP.DeclareQueue('ch1', 'orders_in');
  AMQP.BindQueue('ch1', 'orders_in', 'orders', 'create');
  AMQP.Consume('ch1', 'orders_in');

  // Publish a message
  AMQP.PublishMessage('ch1', 'orders', 'create', '{"id":42}');
end;
uses
  sgcWebSocket, sgcWebSocket_Protocol_AMQP1_Client, sgcAMQP1_Classes;

var
  WSClient: TsgcWebSocketClient;
  AMQP1: TsgcWSPClient_AMQP1;
  oSession: TsgcAMQP1Session;
  oSender:  TsgcAMQP1SenderLink;
begin
  WSClient := TsgcWebSocketClient.Create(nil);
  WSClient.Host := 'broker.example.com';
  WSClient.Port := 5673;

  AMQP1 := TsgcWSPClient_AMQP1.Create(nil);
  AMQP1.Client := WSClient;

  AMQP1.OnAMQPConnect      := AMQPConnect;
  AMQP1.OnAMQPMessage      := AMQPMessage;
  AMQP1.OnAMQPSessionOpen  := AMQPSessionOpen;
  AMQP1.OnAMQPLinkOpen     := AMQPLinkOpen;

  WSClient.Active := True;

  oSession := AMQP1.CreateSession;
  oSender  := AMQP1.CreateSenderLink(oSession, '/queue/orders');
  // Receivers handle pushed deliveries through OnAMQPMessage
  AMQP1.CreateReceiverLink(oSession, '/queue/orders');
end;
#include "sgcWebSocket.hpp"
#include "sgcWebSocket_Protocol_AMQP_Client.hpp"

TsgcWebSocketClient* WSClient = new TsgcWebSocketClient(NULL);
WSClient->Host = "broker.example.com";
WSClient->Port = 15674;
WSClient->Options->Parameters = "/ws";

TsgcWSPClient_AMQP* AMQP = new TsgcWSPClient_AMQP(NULL);
AMQP->Client = WSClient;
AMQP->OnAMQPConnect = AMQPConnect;
AMQP->OnAMQPBasicDeliver = AMQPBasicDeliver;

WSClient->Active = true;

// In the OnAMQPConnect handler:
AMQP->OpenChannel("ch1");
AMQP->DeclareExchange("ch1", "orders", "direct");
AMQP->DeclareQueue("ch1", "orders_in");
AMQP->BindQueue("ch1", "orders_in", "orders", "create");
AMQP->Consume("ch1", "orders_in");
AMQP->PublishMessage("ch1", "orders", "create", "{\"id\":42}");

AMQP 0.9.1 ou AMQP 1.0

Choisissez selon le broker, pas selon le numéro de version. Si l'autre côté est RabbitMQ, utilisez le composant AMQP 0.9.1 : il correspond un-pour-un au modèle RabbitMQ d'exchanges, de queues et de bindings. Si l'autre côté est Azure Service Bus, Apache Qpid ou un autre broker qui annonce le standard OASIS, utilisez le composant AMQP 1.0 et son modèle session / lien.

Les deux sont livrés dans le même package, les environnements mixtes ne posent donc aucun problème : une application peut tenir côte à côte une connexion 0.9.1 vers RabbitMQ et une connexion 1.0 vers Azure Service Bus, chacune sur son propre transport TsgcWebSocketClient.

Plus sur AMQP dans sgcWebSockets

Page protocole AMQP 0.9.1

Référence complète pour TsgcWSPClient_AMQP : propriétés, méthodes, événements et le projet de démo.

Page protocole AMQP 1.0

Référence complète pour TsgcWSPClient_AMQP1 : sessions, liens et authentification CBS.

Sélecteur temps réel

Quand choisir AMQP plutôt que MQTT, WebSocket, SSE ou HTTP/2 push.

Blog : Exchanges et queues

Le modèle de routage AMQP 0.9.1 expliqué avec du code Delphi.

Blog : Publier des messages

Patterns de publication et options de livraison depuis le client Delphi.

Blog : Auth CBS Azure Service Bus

Tokens Claims-Based-Security contre Azure Service Bus sur AMQP 1.0.

Best value: All-AccessEvery eSeGeCe product, Premium Support included, from €1,059/year.
See All-Access pricing

Connectez-vous à votre broker dès aujourd'hui

Téléchargez l'essai. Les projets de démo AMQP 0.9.1 et AMQP 1.0 compilent tels quels.