STOMP RabbitMQ Client
TsgcWSPClient_STOMP_RabbitMQ 是内置了 RabbitMQ 目的地约定的 STOMP 客户端。RabbitMQ 把语义编码在目的地字符串中,因此 /queue/、/topic/、/exchange/、/amq/queue/ 和 /temp-queue/ 各有不同含义。该组件把它们变成具名方法,并用带类型的头部记录取代原始字符串解析。
TsgcWSPClient_STOMP_RabbitMQ 是内置了 RabbitMQ 目的地约定的 STOMP 客户端。RabbitMQ 把语义编码在目的地字符串中,因此 /queue/、/topic/、/exchange/、/amq/queue/ 和 /temp-queue/ 各有不同含义。该组件把它们变成具名方法,并用带类型的头部记录取代原始字符串解析。
通用 STOMP 客户端的一切依然可用。新增的是目的地辅助方法,以及带类型头部对象的 RabbitMQ 专有命名事件。
TsgcWSPClient_STOMP_RabbitMQ
STOMP 1.0、1.1 和 1.2
TCP (61613) 或 TLS (61614)
Delphi、C++ Builder
传输:纯 TCP 和 TLS。sgcMQ 通过纯 TCP 和 TLS 与 RabbitMQ STOMP 插件通信。RabbitMQ 的 Web-STOMP 插件是一个 WebSocket 端点,因此访问它需要 sgcWebSockets 包,它提供 WebSocket 客户端。
该示例在 RabbitMQ STOMP 插件的原生 TCP 端口 61613 上运行。若需加密链路,请在载体上打开 TLS 并使用 61614 端口。
uses
sgcTCP_Client_WS, sgcWebSocket_Classes, sgcWebSocket_Protocols,
sgcWebSocket_Protocol_STOMP_Broker_Client,
sgcWebSocket_Protocol_STOMP_RabbitMQ_Client;
var
TCPClient: TsgcTCPClient;
STOMP: TsgcWSPClient_STOMP_RabbitMQ;
begin
TCPClient := TsgcTCPClient.Create(nil);
TCPClient.Host := 'rabbit.example.com';
TCPClient.Port := 61613;
STOMP := TsgcWSPClient_STOMP_RabbitMQ.Create(nil);
STOMP.Client := TCPClient;
STOMP.Authentication.Enabled := True;
STOMP.Authentication.UserName := 'guest';
STOMP.Authentication.Password := 'guest';
STOMP.OnRabbitMQConnected := RabbitMQConnected;
STOMP.OnRabbitMQMessage := RabbitMQMessage;
TCPClient.Active := True;
end;
procedure TForm1.RabbitMQConnected(Connection: TsgcWSConnection;
Headers: TsgcWSRabbitMQSTOMPHeadersConnected);
begin
// /queue/orders, durable
STOMP.SubscribeQueue('orders');
// /exchange/orders with routing pattern 'create'
STOMP.SubscribeExchange('orders', 'create');
STOMP.PublishExchange('orders', 'create', '{"id":42}');
end;
procedure TForm1.RabbitMQMessage(Connection: TsgcWSConnection;
MessageText: string; Headers: TsgcWSRabbitMQSTOMPHeadersMessage;
Subscription: TsgcWSBrokerSTOMPSubscriptionItem);
begin
Memo1.Lines.Add(Headers.Destination + ': ' + MessageText);
end;
// include: sgcTCP_Client_WS.hpp, sgcWebSocket_Protocols.hpp,
// sgcWebSocket_Protocol_STOMP_RabbitMQ_Client.hpp
TsgcTCPClient *TCPClient = new TsgcTCPClient(this);
TCPClient->Host = "rabbit.example.com";
TCPClient->Port = 61613;
TsgcWSPClient_STOMP_RabbitMQ *STOMP =
new TsgcWSPClient_STOMP_RabbitMQ(this);
STOMP->Client = TCPClient;
STOMP->Authentication->Enabled = true;
STOMP->Authentication->UserName = "guest";
STOMP->Authentication->Password = "guest";
STOMP->OnRabbitMQConnected = RabbitMQConnected;
STOMP->OnRabbitMQMessage = RabbitMQMessage;
TCPClient->Active = true;
// In the OnRabbitMQConnected handler:
STOMP->SubscribeQueue("orders");
STOMP->SubscribeExchange("orders", "create");
STOMP->PublishExchange("orders", "create", "{\"id\":42}");
每个辅助方法只需接受普通名称,RabbitMQ 目的地字符串由组件为您构建。
SubscribeQueue、PublishQueue 和 UnSubscribeQueue 面向 RabbitMQ 的 /queue/ 目的地,并以持久化、自动删除和独占标志作为参数。
SubscribeTopic、PublishTopic 和 UnSubscribeTopic 使用 /topic/ 目的地,它通过 RabbitMQ 的 amq.topic 交换机路由。
SubscribeExchange(name, pattern) 和 PublishExchange(name, routingKey, text) 面向 /exchange/ 目的地,由绑定模式决定您会收到哪些消息。
SubscribeQueueOutside 和 PublishQueueOutside 映射到 /amq/queue/,用于在别处声明、且客户端不得重新声明的队列。
SubscribeTemporaryQueue(queue, replyTo) 和 PublishTemporaryQueue 用一个短生命周期的回复目的地实现 RabbitMQ 的 /temp-queue/ 请求/回复模式。
当您需要具名辅助方法未覆盖的场景时,SubscribeEx、PublishEx 和 UnSubscribeEx 接受原始的目的地字符串。
OnRabbitMQMessage 送达一个 TsgcWSRabbitMQSTOMPHeadersMessage 以及对应的订阅项,因此目的地、消息 id 和确认模式都是属性,而不是子字符串。
每个发布辅助方法都接受一个包含额外头部的 TStrings,您正是借此设置消息优先级、过期时间或持久化等 RabbitMQ 扩展。
Client、Authentication、HeartBeat、Versions 和 Options 的行为与通用 STOMP 客户端上完全一致。