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 的基础设施。
TsgcWSPClient_AMQP:交换器、队列、绑定、事务
TsgcWSPClient_AMQP1:会话、发送方与接收方链接、CBS 令牌
WebSocket 或原始 TCP 载体,两者均可选启用 TLS
Windows、macOS、Linux、iOS、Android。Delphi 7 至 Delphi 13
每个协议操作都是一个方法,每个代理通知都是一个事件。
DeclareExchange、DeclareQueue 和 BindQueue 通过代码构建 RabbitMQ 路由拓扑:direct、fanout 和 topic 路由,并可通过 OpenChannel 实现按通道作用域。
PublishMessage 携带路由键发送到交换器;Consume 订阅队列,投递的消息通过 OnAMQPBasicDeliver 到达。
CreateSession 打开一个 AMQP 1.0 会话,随后 CreateSenderLink 和 CreateReceiverLink 挂接到节点地址。传入的传输通过 OnAMQPMessage 到达。
Claims-Based-Security 辅助功能封装了 Azure Service Bus 的 SAS / OAuth 令牌流程,对命名空间进行身份验证只需设置属性,而无需手工构建 CBS 交换。
OnAMQPMessageSent 和 OnAMQPMessageSentAck 分别报告传输何时离开客户端以及代理何时完成结算。
身份验证挑战通过 OnAMQPSASLAuthentication(1.0)以及 OnAMQPAuthentication / OnAMQPChallenge(0.9.1)呈现。
0.9.1 客户端公开 HeartBeat 属性,让空闲连接在代理服务器和消息代理的超时机制下保持活动。
OnAMQPConnect、OnAMQPDisconnect、OnAMQPClose 和 OnAMQPException 让应用程序随时了解协议状态。
两个 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}");
按代理选择,而不是按版本号。如果对端是 RabbitMQ,请使用 AMQP 0.9.1 组件:它与 RabbitMQ 的交换器、队列和绑定模型一一对应。如果对端是 Azure Service Bus、Apache Qpid 或其他宣称支持 OASIS 标准的代理,请使用 AMQP 1.0 组件及其会话/链接模型。
两者随同一软件包提供,因此混合环境完全没有问题:一个应用程序可以同时持有一条到 RabbitMQ 的 0.9.1 连接和一条到 Azure Service Bus 的 1.0 连接,各自使用自己的 TsgcWebSocketClient 载体。
TsgcWSPClient_AMQP 的完整参考:属性、方法、事件和演示项目。
TsgcWSPClient_AMQP1 的完整参考:会话、链接和 CBS 身份验证。
何时选择 AMQP 而非 MQTT、WebSocket、SSE 或 HTTP/2 推送。
用 Delphi 代码讲解 AMQP 0.9.1 路由模型。
Delphi 客户端的发布模式与投递选项。
通过 AMQP 1.0 对 Azure Service Bus 使用 Claims-Based-Security 令牌。