STOMP Client
TsgcWSPClient_STOMP는 범용 STOMP 1.0, 1.1, 1.2 클라이언트입니다. STOMP는 텍스트 프레임 프로토콜이라 추적하기 쉽고, 메시징 엔드포인트를 제공하는 거의 모든 브로커에서 동작합니다. 이 컴포넌트는 표준 프레임 집합을 다루며, RabbitMQ와 ActiveMQ용 브로커 전용 파생 컴포넌트도 함께 제공됩니다.
TsgcWSPClient_STOMP는 범용 STOMP 1.0, 1.1, 1.2 클라이언트입니다. STOMP는 텍스트 프레임 프로토콜이라 추적하기 쉽고, 메시징 엔드포인트를 제공하는 거의 모든 브로커에서 동작합니다. 이 컴포넌트는 표준 프레임 집합을 다루며, RabbitMQ와 ActiveMQ용 브로커 전용 파생 컴포넌트도 함께 제공됩니다.
Versions로 허용할 프로토콜 버전을 알리면 브로커가 CONNECT 교환 과정에서 하나를 선택합니다. 협상된 버전은 OnSTOMPConnected로 전달됩니다.
TsgcWSPClient_STOMP
STOMP 1.0, 1.1, 1.2
TCP (61613) 또는 TLS
Delphi, C++ Builder
전송: 일반 TCP와 TLS. sgcMQ는 일반 TCP와 TLS로 연결합니다. STOMP over WebSocket이 필요하다면 WebSocket 클라이언트를 제공하는 sgcWebSockets 패키지가 필요합니다.
STOMP는 사용자가 직접 정한 id로 구독을 식별합니다. 같은 id를 UnSubscribe에 전달하며, 수신되는 모든 MESSAGE 프레임에도 그 id가 담겨 돌아옵니다.
uses
sgcTCP_Client_WS, sgcWebSocket_Classes, sgcWebSocket_Protocols,
sgcWebSocket_Protocol_STOMP_Client;
var
TCPClient: TsgcTCPClient;
STOMP: TsgcWSPClient_STOMP;
begin
TCPClient := TsgcTCPClient.Create(nil);
TCPClient.Host := 'broker.example.com';
TCPClient.Port := 61613;
STOMP := TsgcWSPClient_STOMP.Create(nil);
STOMP.Client := TCPClient;
STOMP.Versions.V1_2 := True;
STOMP.Options.VirtualHost := '/';
STOMP.Authentication.Enabled := True;
STOMP.Authentication.UserName := 'guest';
STOMP.Authentication.Password := 'guest';
STOMP.HeartBeat.Enabled := True;
STOMP.OnSTOMPConnected := STOMPConnected;
STOMP.OnSTOMPMessage := STOMPMessage;
TCPClient.Active := True;
end;
procedure TForm1.STOMPConnected(Connection: TsgcWSConnection;
Version, Server, Session, HeartBeat, RawHeaders: string);
begin
STOMP.Subscribe('sub-0', '/queue/orders');
STOMP.Send('/queue/orders', '{"orderId":12345}');
end;
procedure TForm1.STOMPMessage(Connection: TsgcWSConnection;
MessageText, Destination, MessageId, Subscription, ACK, ContentType,
RawHeaders: string);
begin
Memo1.Lines.Add(Destination + ': ' + MessageText);
STOMP.ACK(MessageId);
end;
// include: sgcTCP_Client_WS.hpp, sgcWebSocket_Protocols.hpp,
// sgcWebSocket_Protocol_STOMP_Client.hpp
TsgcTCPClient *TCPClient = new TsgcTCPClient(this);
TCPClient->Host = "broker.example.com";
TCPClient->Port = 61613;
TsgcWSPClient_STOMP *STOMP = new TsgcWSPClient_STOMP(this);
STOMP->Client = TCPClient;
STOMP->Versions->V1_2 = true;
STOMP->Authentication->Enabled = true;
STOMP->Authentication->UserName = "guest";
STOMP->Authentication->Password = "guest";
STOMP->OnSTOMPConnected = STOMPConnected;
STOMP->OnSTOMPMessage = STOMPMessage;
TCPClient->Active = true;
// In the OnSTOMPConnected handler:
STOMP->Subscribe("sub-0", "/queue/orders");
STOMP->Send("/queue/orders", "{\"orderId\":12345}");
가장 자주 사용하게 되는 멤버들입니다.
Send(destination, text, contentType, transaction, customHeaders)가 SEND 프레임을 씁니다. 뒤쪽 세 인자는 선택 사항이므로 간단한 전송은 매개변수 두 개면 됩니다.
Subscribe(id, destination, ack, customHeaders)는 직접 정한 id로 구독을 등록하고, UnSubscribe(id)가 이를 해제합니다. ack 모드의 기본값은 ackAuto입니다.
ACK(id, transaction)은 메시지를 확인하고 NACK(id, transaction)은 거부합니다. 둘 다 MESSAGE 프레임과 함께 도착한 메시지 id를 받습니다.
BeginTransaction, CommitTransaction, AbortTransaction은 트랜잭션 이름을 받습니다. 그 이름을 Send와 ACK에 전달하면 해당 트랜잭션에 묶입니다.
OnSTOMPMessage는 본문, 목적지, 메시지 id, 구독 id, ack 모드, 콘텐츠 형식, 원시 헤더 블록을 전달하므로 프레임의 어떤 정보도 잃지 않습니다.
Versions.V1_0, V1_1, V1_2가 클라이언트가 알릴 버전을 정합니다. 브로커가 선택한 버전은 OnSTOMPConnected의 첫 번째 인자입니다.
브로커가 프레임을 확인하면 OnSTOMPReceipt가, 거부하면 OnSTOMPError가 발생하며, 둘 다 수신 확인 id와 원시 헤더를 함께 전달합니다.
HeartBeat는 CONNECT에서 협상되는 송신 및 수신 간격을 설정합니다. Ping으로 직접 하나를 보낼 수 있고 OnSTOMPPing이 그 교환을 알려 줍니다.
Options.VirtualHost는 CONNECT의 host 헤더가 되고, Options.DisconnectTimeout은 정상 종료 Disconnect가 브로커의 수신 확인을 기다리는 시간을 제한합니다.