AMQP では 2 つのモードでメッセージを受信できます:
- クライアントからのリクエスト: GetMessage メソッドを使用します。キューにメッセージがない場合は OnAMQPBasicGetEmpty イベントが呼び出されます。
- サーバーからのプッシュ: Consume メソッドを使用します。
Consume
コンシューマーはキューからメッセージを消費します。メッセージを消費するにはキューが必要です。新しいコンシューマーが追加されると、キューにすでにメッセージが準備されていると仮定して、配信がすぐに開始されます。
コンシューマー登録時にターゲットキューが空でも問題ありません。その場合、新しいメッセージがエンキューされたときに最初の配信が行われます。
メッセージの消費は非同期タスクです。つまり、コンシューマーキューに新しいメッセージが配信されるたびに、サーバーから自動的にクライアントにプッシュされます。代替方法としてメッセージを同期的に受信する方法もご覧いただけます。
Consume メソッドはキューに新しいコンシューマーを作成し、新しいメッセージがあるたびに自動的にコンシューマークライアントに配信されます。
このメソッドの引数は以下の通りです:
- ChannelName:チャンネルの名前(このメソッドを呼び出す前にオープンされている必要があります)。
- QueueName:キューの名前。255 文字以内で "amq." で始まってはいけません(passive パラメーターが true の場合を除く)。
- ConsumerTag:コンシューマーの名前で一意である必要があります。設定しない場合はサーバーが新しいものを作成します。
- NoLocal:true の場合、コンシューマーは同じチャンネルで発行されたメッセージを消費しません。
- NoAck:true の場合、サーバーは配信されるすべてのメッセージに対して確認応答を期待しません。
- Exclusive:true の場合、他のコンシューマーがこのキューからメッセージを消費することを防ぎます。
- NoWait:true の場合、サーバーはクライアントに確認応答を送信しません。
メッセージは OnAMQPBasigGetOk イベントで配信されます。
AMQP.Consume('channel_name', 'exchange_name', 'consumer_tag');
procedure OnAMQPBasicGetOk(Sender: TObject; const aChannel: string; const aGetOk: TsgcAMQPFramePayload_Method_BasicGetOk; const aContent: TsgcAMQPMessageContent);
begin
DoLog('#AMQP_basic_GetOk: ' + aChannel + ' ' + IntToStr(aGetOk.MessageCount) + ' ' + aContent.Body.AsString);
end;
Get Messages
メッセージの取得は同期タスクです。つまり、キューにメッセージがあるかどうかをクライアントがサーバーに問い合わせます。代替方法としてメッセージを非同期で受信する方法もご覧いただけます。
GetMessage メソッドは AMQP サーバーにキューにメッセージが利用可能かどうかを尋ねるリクエストを送信します。メッセージがある場合は OnAMQPBasicGetOk イベントで配信され、キューが空の場合は OnAMQPBasicGetEmpty イベントが呼び出されます。
このメソッドの引数は以下の通りです:
- ChannelName:チャンネルの名前(このメソッドを呼び出す前にオープンされている必要があります)。
- QueueName:キューの名前。255 文字以内で "amq." で始まってはいけません(passive パラメーターが true の場合を除く)。
- NoWait:true の場合、サーバーはクライアントに確認応答を送信しません。
AMQP.GetMessage('channel_name', 'exchange_name');
procedure OnAMQPBasicGetOk(Sender: TObject; const aChannel: string; const aGetOk: TsgcAMQPFramePayload_Method_BasicGetOk; const aContent: TsgcAMQPMessageContent);
begin
DoLog('#AMQP_basic_GetOk: ' + aChannel + ' ' + IntToStr(aGetOk.MessageCount) + ' ' + aContent.Body.AsString);
end;
procedure OnAMQPBasicGetEmpty(Sender: TObject; const aChannel: string);
begin
DoLog('#AMQP_basic_GetEmpty: ' + aChannel);
end;
