eSeGeCe — Delphi & .NET 向けエンタープライズ通信コンポーネント
注目 · sgcMQ

すべてのブローカーを、1 つのキャリア

7 つのクライアントコンポーネントが、MQTT 3.1.1 と 5.0、AMQP 0.9.1、AMQP 1.0、Apache Kafka ワイヤープロトコル、そして STOMP 1.0 から 1.2 までを話し、RabbitMQ と ActiveMQ 向けのブローカーダイアレクトも備えています。すべてのフレームはライブラリ内部の Object Pascal でパースおよび書き込みされるため、librdkafka も Paho も Qpid も、同梱すべき DLL もありません。7 つすべてが 1 つの TsgcTCPClient に載り、平文でも TLS でラップしても開けます。

  • 7 つのクライアントコンポーネント
  • 5 つのプロトコルファミリー
  • Windows · Linux · macOS · iOS · Android
  • Delphi 7 から 13 · C++ Builder

5 つのプロトコルファミリー、7 つのコンポーネント

sgcMQ は単体のパッケージです。土台となる sgcWebSockets Core ランタイムを同梱し、すべてのライセンスに完全なソースコードが付属するため、プロトコル実装をそのままデバッガーでステップ実行できます。

7 クライアントコンポーネント MQTT、AMQP 0.9.1、AMQP 1.0、Kafka、STOMP、STOMP RabbitMQ、STOMP ActiveMQ が、1 つのパレットページにまとまっています。
5 プロトコルファミリー 各ワイヤーフォーマットを、ライブラリ内部の Object Pascal でパースおよび書き込みします。
6 ターゲットプラットフォーム Win32、Win64、Linux64、macOS、iOS、Android を、1 つのソースツリーからビルドできます。
0 外部ライブラリ librdkafka も Paho も Qpid も DLL も、前段の REST プロキシも不要です。
1 トランスポートキャリア 1 つの TsgcTCPClient が 7 つすべてを運ぶため、TLS、プロキシ、再接続の設定は 1 回で済みます。
sgcMQ

Delphi と C++ Builder 向けのメッセージキューおよびストリーミングクライアントです。sgcWebSockets Core ランタイムを同梱した単体パッケージで、完全なソースコードが付属し、6 つのターゲットすべてにロイヤリティフリーで配布できます。

プロトコルごとに 1 コンポーネント、API スタイルは 1 つ

プロトコルコンポーネントをフォームに配置し、Client プロパティに TsgcTCPClient を割り当て、イベントを接続してから、各プロトコル固有のメソッドを呼び出します。命名は 7 つすべてで一貫しているため、1 つを覚えれば残りもほぼ理解できます。

MQTT 3.1.1 & 5.0

パブリッシュ、サブスクライブ、そして QoS の全機構

TsgcWSPClient_MQTT は、1 つの MQTTVersion プロパティで両方のプロトコルバージョンをカバーします。QoS 0、1、2 では PUBACK、PUBREC、PUBREL、PUBCOMP のやり取りが隠されずイベントとして公開され、保持メッセージ、Last Will and Testament、ワイルドカードサブスクリプション、再開可能なセッションにも対応します。バージョン 5 では、リーズンコード、ユーザープロパティ、トピックエイリアス、共有サブスクリプション、AUTH ラウンドトリップが加わります。

MQTT クライアントを見る →
AMQP 0.9.1 & 1.0

名前を共有する 2 つのプロトコル

TsgcWSPClient_AMQP は、RabbitMQ の基盤となったプロトコルである AMQP 0.9.1 を話します: チャネル、エクスチェンジとキューの宣言、バインディング、コンシューマー、パブリッシャー確認応答、プリフェッチ QoS、トランザクションです。TsgcWSPClient_AMQP1 は、Azure Service Bus と Event Hubs を支える OASIS 標準の AMQP 1.0 を話します: コンテナー、セッション、送信リンクと受信リンク、クレジットベースのフロー制御、SASL、そして Claims-Based Security のヘルパーです。ワイヤーフォーマットもオブジェクトモデルも異なるため、それぞれに専用のコンポーネントがあります。

AMQP 0.9.1 → AMQP 1.0 →
Apache Kafka

バイナリプロトコルを直接話す

TsgcWSPClient_Kafka は、v2 レコードバッチフォーマットを含む Kafka ワイヤープロトコルを TCP 上で話します。acks レベルと gzip 圧縮を選んでプロデュースし、コーディネーター検出、join、sync、ハートビート、リバランスを自動処理するグループ経由でコンシュームするか、オフセット指定でパーティションを読み取れます。

Kafka クライアントを見る →
STOMP 1.0 から 1.2

1 つの汎用クライアント、2 つのブローカーダイアレクト

TsgcWSPClient_STOMP は、SEND、SUBSCRIBE、UNSUBSCRIBE、ACK、NACK、レシート、双方向ハートビート、そして BEGIN、COMMIT、ABORT のトランザクションフレームを処理します。2 つの派生クラスが、ブローカーごとのデスティネーション規約を名前付きメソッドに変換します。1 つは RabbitMQ 用、もう 1 つは ActiveMQ 用です。

STOMP クライアントを見る →
クロスプラットフォーム

6 つのターゲット、例外なし

7 つのクライアントすべてと、その下のキャリアは、Win32、Win64、Linux64、macOS、iOS、Android 向けに登録されており、Delphi 7 から RAD Studio 13 まで、そして C++ Builder でも利用できます。このメッセージングパックにプラットフォーム制限はありません。

機能マトリックス →

各コンポーネントのリファレンスページ:

4 つのプロトコル、同じ形

プロトコルコンポーネントを作成し、キャリアを割り当て、イベントをフックして、メソッドを呼び出します。平文のリスナーから暗号化されたリスナーへの切り替えは、ポート番号とキャリア側の TLS := True だけで、その上の層は何も変わりません。

uses
  sgcTCP_Client_WS, sgcWebSocket_Classes, sgcWebSocket_Protocols;
var
  TCPClient: TsgcTCPClient;
  MQTT: TsgcWSPClient_MQTT;
begin
  TCPClient := TsgcTCPClient.Create(nil);   // plain MQTT over TCP
  TCPClient.Host := 'broker.example.com';
  TCPClient.Port := 1883;
  TCPClient.WatchDog.Enabled := True;

  MQTT := TsgcWSPClient_MQTT.Create(nil);
  MQTT.Client := TCPClient;
  MQTT.MQTTVersion := mqtt5;
  MQTT.Authentication.Enabled  := True;
  MQTT.Authentication.UserName := 'sgc';
  MQTT.Authentication.Password := 'sgc';

  MQTT.LastWillTestament.Enabled := True;
  MQTT.LastWillTestament.Topic   := 'devices/sensor-01/status';
  MQTT.LastWillTestament.Message := 'offline';
  MQTT.LastWillTestament.QoS     := mtqsAtLeastOnce;
  MQTT.LastWillTestament.Retain  := True;

  MQTT.OnMQTTConnect := MQTTConnect;
  MQTT.OnMQTTPublish := MQTTPublish;

  TCPClient.Active := True;
end;

procedure TForm1.MQTTConnect(Connection: TsgcWSConnection;
  const Session: Boolean; const ReasonCode: Integer;
  const ReasonName: string;
  const ConnectProperties: TsgcWSMQTTCONNACKProperties);
begin
  MQTT.Subscribe('sensors/+/temperature', mtqsAtLeastOnce);
end;

procedure TForm1.MQTTPublish(Connection: TsgcWSConnection;
  aTopic, aText: string;
  PublishProperties: TsgcWSMQTTPublishProperties);
begin
  Memo1.Lines.Add(aTopic + ' = ' + aText);
end;

// For an encrypted broker: same code, TLS on the carrier.
// TCPClient.Port := 8883; TCPClient.TLS := True;
uses
  sgcTCP_Client_WS, sgcWebSocket_Protocols, sgcAMQP_Classes;
var
  TCPClient: TsgcTCPClient;
  AMQP: TsgcWSPClient_AMQP;
begin
  TCPClient := TsgcTCPClient.Create(nil);
  TCPClient.Host := 'broker.example.com';
  TCPClient.Port := 5672;                  // 5671 for the amqps listener

  AMQP := TsgcWSPClient_AMQP.Create(nil);
  AMQP.Client := TCPClient;
  AMQP.AMQPOptions.VirtualHost := '/';
  AMQP.HeartBeat.Enabled  := True;
  AMQP.HeartBeat.Interval := 30;

  AMQP.OnAMQPConnect      := AMQPConnect;
  AMQP.OnAMQPBasicDeliver := AMQPBasicDeliver;

  TCPClient.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 to the exchange with a routing key
  AMQP.PublishMessage('ch1', 'orders', 'create', '{"id":42}');
end;
uses
  sgcTCP_Client_WS, sgcWebSocket_Protocols, sgcKafka_Classes;
var
  TCPClient: TsgcTCPClient;
  Kafka: TsgcWSPClient_Kafka;
begin
  Kafka := TsgcWSPClient_Kafka.Create(nil);
  Kafka.KafkaOptions.ClientId := 'my-delphi-app';
  Kafka.KafkaOptions.Producer.Acks        := kafkaAcksLeader;
  Kafka.KafkaOptions.Producer.Compression := kafkaCompressionGzip;
  Kafka.KafkaOptions.Consumer.GroupId     := 'my-group';
  Kafka.KafkaOptions.Consumer.OffsetReset := kafkaOffsetEarliest;
  Kafka.OnKafkaMessage := KafkaMessage;

  TCPClient := TsgcTCPClient.Create(nil);
  Kafka.Client := TCPClient;
  TCPClient.Host := '127.0.0.1';
  TCPClient.Port := 9092;
  TCPClient.Active := True;

  // produce a record to a topic
  Kafka.Produce('my-topic', 'Hello Kafka', 'key-1');

  // consume: subscribe once, then Poll repeatedly (e.g. from a timer)
  Kafka.Subscribe(['my-topic']);
end;

procedure TForm1.KafkaMessage(Sender: TObject;
  const Message: TsgcKafkaMessage);
begin
  Memo1.Lines.Add(Message.GetKeyString + ' = ' + Message.GetValueString);
end;

// fetch records from a timer, commit when a batch is processed
var
  Messages: TsgcKafkaMessages;
begin
  Messages := Kafka.Poll(1000);
  try
    if Messages.Count > 0 then
      Kafka.CommitSync;
  finally
    Messages.Free;
  end;
end;
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;             // 61614 for the plugin's TLS listener

  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
  STOMP.SubscribeQueue('orders');
  STOMP.PublishQueue('orders', '{"orderId":12345}');
end;

procedure TForm1.RabbitMQMessage(Connection: TsgcWSConnection;
  MessageText: string; Headers: TsgcWSRabbitMQSTOMPHeadersMessage;
  Subscription: TsgcWSBrokerSTOMPSubscriptionItem);
begin
  Memo1.Lines.Add(Headers.Destination + ': ' + MessageText);
end;

Object Pascal でも C++ Builder でも同じ形、残りの 3 つのコンポーネントでも同じ形です。完全な機能マトリックス →

最初に知っておきたい 2 つのこと

sgcMQ に必要なものと、バイトがブローカーに届く仕組みです。どちらの答えも短く、細かい注記の中ではなく、このページに書いてあります。

ネイティブブローカーリスナー
プロトコル          コンポーネント                  TCP     TLS
MQTT 3.1.1 / 5.0    TsgcWSPClient_MQTT             1883    8883
AMQP 0.9.1          TsgcWSPClient_AMQP             5672    5671
AMQP 1.0            TsgcWSPClient_AMQP1            5672    5671
Apache Kafka        TsgcWSPClient_Kafka            9092       *
STOMP               TsgcWSPClient_STOMP           61613       *
STOMP, RabbitMQ     TsgcWSPClient_STOMP_RabbitMQ  61613   61614
STOMP, ActiveMQ     TsgcWSPClient_STOMP_ActiveMQ  61613   61612

* ブローカー自身の暗号化リスナーとして設定されているポートに
  従います。上記は慣例的なデフォルト値です。キャリアの Port には、
  実際のデプロイ環境が待ち受けているポートをそのまま設定できます。

sgcMQ は単体製品です

コンポーネントに必要なものはすべて sgcMQ に同梱されています: sgcWebSockets Core ランタイム、TsgcTCPClient キャリア、TLS レイヤー、JSON ヘルパーです。インストーラーは 1 つ、完全なソースコード付きです。

平文 TCP と TLS、それだけ

このパックのすべてのプロトコルは、平文または TLS でラップして開く生のソケット上で動作します。これはここに挙げたネイティブブローカーポートをカバーし、MQTT、AMQP、Kafka、STOMP が通常デプロイされる形です。代わりにプロトコルを WebSocket 上で動かす場合、たとえば MQTT over WebSocket や Web-STOMP には WebSocket クライアントが必要で、それは sgcWebSockets に含まれています。選ぶ前に、ブローカーが公開しているトランスポートを確認してください。

Delphi と C++ Builder

sgcMQ は、Delphi 7 から RAD Studio 13 までと C++ Builder を、6 つのプラットフォームすべてでターゲットにします。このパックに .NET ビルドはありません。.NET からメッセージングを使う場合は、sgcWebSockets をご利用ください。

下回りの処理はキャリアが担当

TLSOptions.IOHandler で、クロスプラットフォームビルドには OpenSSL を、Windows では SChannel を選択でき、WatchDog がリンク切断後に再接続します。HTTP CONNECT プロキシ越えと IPv6 に追加の設定は不要です。一度設定すれば、その上のすべてのプロトコルに引き継がれます。

OpenSSL SChannel 相互 TLS HTTP プロキシ WatchDog 再接続

すべてのコンポーネントとプロパティ →

sgcMQ はベンダー SDK をラップするのではなく、公開されたプロトコルそのものを実装しているため、ブローカーは自由に選べます: RabbitMQ、Apache Kafka、Eclipse Mosquitto、HiveMQ、EMQX、Apache ActiveMQ、Azure Service Bus と Event Hubs、AWS IoT Core。ブローカーの乗り換えは、ホストとポートと認証情報を変えるだけです。

9 つのライブラリ、1 つのツールボックス

sgcMQ は、Delphi、C++ Builder、.NET 向けの eSeGeCe コンポーネントライブラリ 9 製品のひとつです。共通の設計思想を持ち、完全なソースが付属し、ロイヤリティフリーで配布できます。

sgcMQ

Delphi と C++ Builder 向けの MQTT、AMQP 0.9.1 および 1.0、Apache Kafka、STOMP のクライアントコンポーネント。単体製品で、sgcWebSockets Core ランタイムを同梱しています。

詳しく見る →

sgcWebSockets

Delphi、C++ Builder、Lazarus、.NET 向けの WebSocket、HTTP/2、MQTT、AMQP、WebRTC、AI、そして 30 を超える API 統合。WebSocket キャリアはこちらに含まれています。

詳しく見る →

sgcHTML

Bootstrap 5 と htmx を基盤とする、サーバーサイド HTML / UI コンポーネント。sgcMQ がコンシュームするキューの前面に、ライブダッシュボードを置けます。

詳しく見る →

sgcQUIC

生の QUIC トランスポートと HTTP/3 のクライアントおよびサーバー、WebTransport 対応。sgcWebSockets Enterprise のアドオンです。

詳しく見る →

sgcAI

Delphi と C++ Builder 向けの AI、LLM、MCP コンポーネント。1 つのコンポーネントで 7 社の LLM プロバイダーに対応し、MCP、埋め込み、音声も利用できます。単体製品で、sgcWebSockets Core ランタイムを同梱しています。

詳しく見る →

sgcOpenAPI

OpenAPI 3.x パーサー、ネイティブ Pascal SDK ジェネレーター、OpenAPI サーバーコンポーネント、そして 1,195 以上のビルド済みクラウド SDK。

詳しく見る →

sgcSign

ドキュメントには XAdES、PAdES、CAdES、ASiC、コードには Authenticode、ClickOnce、NuGet、VSIX。

詳しく見る →

sgcBiometrics

Delphi と C++ Builder 向けの Windows Hello、指紋センサー、Windows Biometric Framework。

詳しく見る →

sgcIndy

モダンな TLS、IPv6、HTTP/2 に対応した更新版 Indy TCP/IP コンポーネント。Delphi 7 から 13 まで対応します。

詳しく見る →

価格とライセンスを見る 体験版をダウンロード

開発者の声

世界中の Delphi、C++ Builder、Lazarus、.NET 開発者から信頼されています。

sgcWebSockets ライブラリはとても便利でセットアップも簡単です。これからも頑張ってください!

Simone Moretti Delphi Developer

sgcWebSockets は素晴らしく、サポートも最高です!

Christian Meyer Founder & CTO

ご支援とサポートに本当に感謝しています。コンポーネントが大好きです。

Mark Steinfeld CTO

現在は eSeGeCe の メッセージング ビューを表示しています。

別の切り口を見る →

Delphi からブローカーと対話

MQTT、AMQP、Kafka、STOMP を 1 つのパッケージでネイティブに実装。sgcWebSockets Core ランタイムを同梱し、完全なソースコードが付属します。同じコードから Windows、Linux、macOS、iOS、Android へ。