Delphi-AMQP-Client | AMQP-1.0- & 0.9.1-Komponenten | eSeGeCe

Delphi-AMQP-Client — AMQP-1.0- und 0.9.1-Komponenten

Zwei native AMQP-Client-Komponenten für Delphi und C++Builder: TsgcWSPClient_AMQP spricht AMQP 0.9.1 mit RabbitMQ, mit Exchanges, Queues, Bindings und Consumer-Acknowledgments, und TsgcWSPClient_AMQP1 spricht OASIS AMQP 1.0 mit Azure Service Bus, Apache Qpid und jedem konformen Broker, über einen WebSocket- oder Raw-TCP-Carrier.

Beide AMQP-Versionen, eine Bibliothek

AMQP 0.9.1 und AMQP 1.0 teilen sich den Namen, sind aber unterschiedliche Wire-Protokolle. sgcWebSockets implementiert beide nativ, du wählst einfach die Komponente, die zu deinem Broker passt.

Ein Delphi-AMQP-Client verbindet deine VCL- oder FMX-Anwendung mit Enterprise-Message-Brokern. AMQP 0.9.1 ist die weit verbreitete Version, die RabbitMQ verwendet: Du deklarierst Exchanges und Queues, verknüpfst sie über Routing-Keys, publizierst mit basic.publish und konsumierst mit basic.consume, mit Transaktionen und Confirms obendrauf. AMQP 1.0 ist der OASIS-Standard, den Azure Service Bus und Apache Qpid einsetzen: ein symmetrisches Link-Protokoll auf Basis von Sessions, Sender-Links und Receiver-Links, mit Claims-Based-Security-Token-Helfern für die SAS- und OAuth-Authentifizierung des Azure Service Bus.

Beide Komponenten docken über ihre Eigenschaft Client an einen TsgcWebSocketClient an und laufen über einen WebSocket- oder Raw-TCP-Carrier. Derselbe Code erreicht damit einen Broker auf den Standard-AMQP-Ports oder tunnelt über Port 443 an HTTP-only-Infrastruktur vorbei.

AMQP 0.9.1

TsgcWSPClient_AMQP: Exchanges, Queues, Bindings, Transaktionen

AMQP 1.0

TsgcWSPClient_AMQP1: Sessions, Sender- und Receiver-Links, CBS-Tokens

Transports

WebSocket- oder Raw-TCP-Carrier, TLS auf beiden optional

Plattformen

Windows, macOS, Linux, iOS, Android. Delphi 7 bis Delphi 13

Die komplette AMQP-Client-Oberfläche

Jede Protokoll-Operation ist eine Methode, jede Broker-Benachrichtigung ein Event.

Exchanges & Queues (0.9.1)

DeclareExchange, DeclareQueue und BindQueue bauen die RabbitMQ-Routing-Topologie aus Code auf: Direct-, Fanout- und Topic-Routing mit Per-Channel-Scoping über OpenChannel.

Publish & Consume (0.9.1)

PublishMessage sendet mit einem Routing-Key an einen Exchange; Consume abonniert eine Queue, und Zustellungen treffen über OnAMQPBasicDeliver ein.

CreateSession öffnet eine AMQP-1.0-Session, dann verbinden sich CreateSenderLink und CreateReceiverLink mit einer Node-Adresse. Eingehende Transfers treffen über OnAMQPMessage ein.

Azure Service Bus (1.0)

Claims-Based-Security-Helfer kapseln den SAS-/OAuth-Token-Flow des Azure Service Bus. Die Authentifizierung gegen einen Namespace ist damit eine Property-Konfiguration statt eines handgebauten CBS-Austauschs.

Delivery-Feedback

OnAMQPMessageSent und OnAMQPMessageSentAck melden, wann ein Transfer den Client verlassen hat und wann der Broker ihn settled hat.

SASL-Authentifizierung

Authentifizierungs-Challenges laufen über OnAMQPSASLAuthentication (1.0) sowie OnAMQPAuthentication / OnAMQPChallenge (0.9.1).

HeartBeat

Der 0.9.1-Client veröffentlicht eine HeartBeat-Eigenschaft, damit Leerlauf-Verbindungen über Proxys und Broker-Timeouts hinweg am Leben bleiben.

Lifecycle-Events

OnAMQPConnect, OnAMQPDisconnect, OnAMQPClose und OnAMQPException halten die Anwendung über den Protokollzustand auf dem Laufenden.

Edition

Beide AMQP-Clients sind in jeder Edition von sgcWebSockets enthalten, von Standard über Enterprise bis All-Access, und ebenso in der .NET-Bibliothek.

Publish und Consume in wenigen Zeilen

Kombiniere die AMQP-Komponente mit einem TsgcWebSocketClient, verbinde dich, dann deklarieren / attachen und los.

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 oder AMQP 1.0

Wähle nach Broker, nicht nach Versionsnummer. Ist die Gegenseite RabbitMQ, nimm die AMQP-0.9.1-Komponente: Sie bildet das RabbitMQ-Modell aus Exchanges, Queues und Bindings eins zu eins ab. Ist die Gegenseite Azure Service Bus, Apache Qpid oder ein anderer Broker, der den OASIS-Standard ankündigt, nimm die AMQP-1.0-Komponente mit ihrem Session-/Link-Modell.

Beide stecken im selben Paket, gemischte Umgebungen sind also kein Problem: Eine Anwendung kann gleichzeitig eine 0.9.1-Verbindung zu RabbitMQ und eine 1.0-Verbindung zum Azure Service Bus halten, jede auf ihrem eigenen TsgcWebSocketClient-Carrier.

Mehr zu AMQP in sgcWebSockets

AMQP-0.9.1-Protokoll-Seite

Vollständige Referenz zu TsgcWSPClient_AMQP: Eigenschaften, Methoden, Events und das Demo-Projekt.

AMQP-1.0-Protokoll-Seite

Vollständige Referenz zu TsgcWSPClient_AMQP1: Sessions, Links und CBS-Authentifizierung.

Echtzeit-Auswahl

Wann AMQP statt MQTT, WebSocket, SSE oder HTTP/2-Push wählen.

Blog: Exchanges und Queues

Das AMQP-0.9.1-Routing-Modell, erklärt mit Delphi-Code.

Blog: Nachrichten publizieren

Publish-Muster und Zustelloptionen aus dem Delphi-Client.

Blog: Azure Service Bus CBS-Auth

Claims-Based-Security-Tokens gegen Azure Service Bus über AMQP 1.0.

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

Verbinde dich noch heute mit deinem Broker

Lade die Testversion herunter. Die Demo-Projekte für AMQP 0.9.1 und AMQP 1.0 kompilieren out of the box.