Delphi AMQP 客户端 | AMQP 1.0 与 0.9.1 组件 | eSeGeCe

Delphi AMQP 客户端——AMQP 1.0 与 0.9.1 组件

面向 Delphi 和 C++Builder 的两个原生 AMQP 客户端组件:TsgcWSPClient_AMQP 使用 AMQP 0.9.1 与 RabbitMQ 通信,支持交换器、队列、绑定和消费者确认;TsgcWSPClient_AMQP1 使用 OASIS AMQP 1.0 与 Azure Service Bus、Apache Qpid 以及任何兼容代理通信,可通过 WebSocket 或原始 TCP 载体传输。

两个 AMQP 版本,一个库

AMQP 0.9.1 和 AMQP 1.0 名字相同,却是不同的线级协议。sgcWebSockets 对二者均做了原生实现,您只需选择与您的代理匹配的组件。

Delphi AMQP 客户端将您的 VCL 或 FMX 应用程序连接到企业级消息代理。AMQP 0.9.1 是 RabbitMQ 使用的广泛部署版本:您声明交换器和队列,用路由键进行绑定,使用 basic.publish 发布并使用 basic.consume 消费,之上还有事务和确认机制。AMQP 1.0 是 Azure Service Bus 和 Apache Qpid 使用的 OASIS 标准:一个基于会话、发送方链接和接收方链接构建的对称链接协议,并为 Azure Service Bus 的 SAS 和 OAuth 身份验证提供 Claims-Based-Security 令牌辅助功能。

两个组件都通过其 Client 属性挂接到 TsgcWebSocketClient,并可在 WebSocket 或原始 TCP 载体上运行,因此同一段代码既能通过标准 AMQP 端口连接代理,也能经由端口 443 隧道穿越仅允许 HTTP 的基础设施。

AMQP 0.9.1

TsgcWSPClient_AMQP:交换器、队列、绑定、事务

AMQP 1.0

TsgcWSPClient_AMQP1:会话、发送方与接收方链接、CBS 令牌

传输

WebSocket 或原始 TCP 载体,两者均可选启用 TLS

平台

Windows、macOS、Linux、iOS、Android。Delphi 7 至 Delphi 13

完整的 AMQP 客户端界面

每个协议操作都是一个方法,每个代理通知都是一个事件。

交换器与队列(0.9.1)

DeclareExchangeDeclareQueueBindQueue 通过代码构建 RabbitMQ 路由拓扑:direct、fanout 和 topic 路由,并可通过 OpenChannel 实现按通道作用域。

发布与消费(0.9.1)

PublishMessage 携带路由键发送到交换器;Consume 订阅队列,投递的消息通过 OnAMQPBasicDeliver 到达。

会话与链接(1.0)

CreateSession 打开一个 AMQP 1.0 会话,随后 CreateSenderLinkCreateReceiverLink 挂接到节点地址。传入的传输通过 OnAMQPMessage 到达。

Azure Service Bus(1.0)

Claims-Based-Security 辅助功能封装了 Azure Service Bus 的 SAS / OAuth 令牌流程,对命名空间进行身份验证只需设置属性,而无需手工构建 CBS 交换。

投递反馈

OnAMQPMessageSentOnAMQPMessageSentAck 分别报告传输何时离开客户端以及代理何时完成结算。

SASL 身份验证

身份验证挑战通过 OnAMQPSASLAuthentication(1.0)以及 OnAMQPAuthentication / OnAMQPChallenge(0.9.1)呈现。

HeartBeat

0.9.1 客户端公开 HeartBeat 属性,让空闲连接在代理服务器和消息代理的超时机制下保持活动。

生命周期事件

OnAMQPConnectOnAMQPDisconnectOnAMQPCloseOnAMQPException 让应用程序随时了解协议状态。

版本

两个 AMQP 客户端包含在 sgcWebSockets 的每个版本中,从 Standard 到 Enterprise 和 All-Access,.NET 库中也同样提供。

几行代码完成发布与消费

将 AMQP 组件与 TsgcWebSocketClient 配对,连接后即可声明/挂接并开始使用。

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 还是 AMQP 1.0

按代理选择,而不是按版本号。如果对端是 RabbitMQ,请使用 AMQP 0.9.1 组件:它与 RabbitMQ 的交换器、队列和绑定模型一一对应。如果对端是 Azure Service BusApache Qpid 或其他宣称支持 OASIS 标准的代理,请使用 AMQP 1.0 组件及其会话/链接模型。

两者随同一软件包提供,因此混合环境完全没有问题:一个应用程序可以同时持有一条到 RabbitMQ 的 0.9.1 连接和一条到 Azure Service Bus 的 1.0 连接,各自使用自己的 TsgcWebSocketClient 载体。

sgcWebSockets 中关于 AMQP 的更多内容

AMQP 0.9.1 协议页面

TsgcWSPClient_AMQP 的完整参考:属性、方法、事件和演示项目。

AMQP 1.0 协议页面

TsgcWSPClient_AMQP1 的完整参考:会话、链接和 CBS 身份验证。

实时选择器

何时选择 AMQP 而非 MQTT、WebSocket、SSE 或 HTTP/2 推送。

博客:交换器与队列

用 Delphi 代码讲解 AMQP 0.9.1 路由模型。

博客:发布消息

Delphi 客户端的发布模式与投递选项。

博客:Azure Service Bus CBS 身份验证

通过 AMQP 1.0 对 Azure Service Bus 使用 Claims-Based-Security 令牌。

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

立即连接您的代理

下载试用版。AMQP 0.9.1 和 AMQP 1.0 演示项目开箱即可编译。