AMQP送信者または受信者イベントハンドラーを実装する
3番目のステップとして、使用するオブジェクトの種類に応じて、インターフェースIF_AMQP_SENDER_EVENT_HANDLERまたはIF_AMQP_RECEIVER_EVENT_HANDLERのいずれかを実装する必要があります。システムはAMQPセンダー/レシーバーイベントハンドラーメソッドを呼び出して、アプリケーションにAMQPセンダー/レシーバーオブジェクトを処理させます。アプリケーションは、次のイベントハンドラーメソッドを実装できます。
着信メッセージおよびイベントを処理するには、既存のABAPセッションがアイドル状態または待機状態である必要があります。この状態は、たとえばこのセッションの要求がない場合など、暗黙的に開始することも、ABAPWAITステートメントを使用して明示的に開始することもできます。クライアントがAPCイベントを明示的に待機できるようにするには、次のステートメントを使用できます。
AMQPセンダーオブジェクトとレシーバーオブジェクトを作成して使用する
AMQP送信者オブジェクトを作成するIF_AMQP_SESSION~CREATE_SENDERには、AMQPセッションオブジェクトのメソッドを使用する必要があります。同様に、AMQPレシーバーオブジェクトは、メソッドを使用して作成できますIF_AMQP_SESSION~CREATE_RECEIVER。実装したAMQP送信側またはAMQP受信側のイベントハンドラーは、それぞれのメソッドに指定する必要があります。このメソッドは、タイプIF_AMQP_SENDERCREATE_SENDERのAMQPセンダーオブジェクトを提供します。これは、次のメソッドを提供します。
このメソッドは、タイプIF_AMQP_RECEIVERCREATE_RECEIVERのAMQPレシーバーオブジェクトを提供します。これは、次のメソッドを提供します。
メソッドIF_AMQP_SENDER~ATTACHとIF_AMQP_RECEIVER~ATTACHAMQP接続フレームをピアに送信します。呼び出しが成功した場合、ピアがリンクの接続を確認するとすぐにリンクが確立されます。この場合、ON_ATTACH指定されたイベントハンドラーのメソッドが呼び出されます。前述のように、ON_ATTACHイベントを処理するには、ABAPセッションがアイドル状態または待機状態である必要があります。
送信者のメソッドのパラメータI_SEND_OPTIONSと受信者のメソッドのI_RECEIVER_OPTIONSを使用すると、リンク接続に指定できるオプションのパラメータを設定できます。これらは、たとえば、リンク名と自身のノードのアドレスです。受信者オプションを使用すると、受信者が送信側ピアに自動的に付与するクレジットの量を指定できます。デフォルトはです。自動リンククレジットをオフにするには、この値をに設定できます。最も重要なことは、送信者と受信者のオプションにより、リンクのQoSレベルを設定できることです。at-most-once、 at-least-once、およびmixedの値ATTACHATTACHCO_DEFAULT_LINK_CREDIT (65535)CO_LINK_CREDIT_AUTO_MODE_OFF (0)(デフォルト)を設定できます。これらの結果、AMQP属性の送信側セトルモードと受信側セトルモードの値が次のように指定されるアタッチフレームが生成されます。
メソッドIF_AMQP_SENDER~DETACHとIF_AMQP_RECEIVER~DETACHAMQPデタッチフレームをピアに送信します。IF_AMQP_SESSION~ENDAMQPクライアントは、メソッドまたはIF_AMQP_CLIENT~CLOSEが呼び出されたときにAMQPデタッチフレームも送信することに注意してください。したがって、DETACHAMQPセッションまたは接続の存続期間全体にわたってリンクが確立されている場合、この方法は必要ありません。
AMQPメッセージの一部の属性に加えて、メッセージオブジェクトでは、メッセージ転送のQoSレベルを指定できます:最大1回または最大1回(デフォルト)。このメッセージQoSレベルは、送信者リンクのリンクQoSレベルがmixedに設定されている場合にのみ、メッセージ転送に使用されます。それ以外の場合は、送信側接続で指定されたQoSレベルが使用されます。最後に、QoSレベルが最大で1回の場合、解決済みフラグがtrueに設定されたメッセージ転送が発生し、QoSレベルが少なくとも1回の場合、解決済みフラグがfalseに設定されたメッセージ転送が発生します。
このメソッドは、タイプがIF_AMQP_SENDER~SENDオプションのエクスポートパラメータE_ENVELOPEIF_AMQP_MESSAGE_ENVELOPEを提供します。メッセージエンベロープには、メッセージがピアによってすでに確認されているかどうかの情報が格納されます。ABAPセッションが送信されたメッセージの確認応答を処理するとすぐに、その確認状態が処理から完了に変わります。メッセージが確認応答された場合、配信の結果であるAMQP配信状態(たとえば、受け入れ、拒否)もメッセージエンベロープから取得できます。エンベロープごとに、この情報はメソッドGET_CONFIRMATION_STATEとを介して取得できます GET_DELIVERY_STATE。また、封筒はメソッドGET_MESSAGEとGET_QOSメッセージの送信時に使用されたメッセージ属性とQoSレベルを取得します。
このメソッドは、確認状態処理IF_AMQP_SENDER~GET_PENDING_ENVELOPES中の送信者オブジェクトのすべてのエンベロープのリストを返します。このメソッドの目的は、AMQPクライアントが切断された場合に、保留中のすべてのメッセージを簡単に取得することです。アプリケーションは、AMQP接続が再度確立されるとすぐにメッセージを再送信するために、この情報を保存したい場合があります。
このメソッドIF_AMQP_SENDER~GET_CREDITは、AMQPメッセージの送信に使用可能なリンククレジットを返します。AMQPクライアントは、リンククレジットが使用可能な場合にのみピアにメッセージを送信するため、送信者はこの方法を使用して、メッセージを送信するためのこの前提条件が満たされていることを確認する必要があります。ただし、SEND送信クレジットが利用できない場合、この方法は必ずしも失敗しないことに注意してください。便宜上、AMQPクライアントはメッセージを内部でバッファリングしようとし、受信者(この場合はピア)がリンククレジットを再度許可するとすぐにメッセージを送信します。送信バッファがいっぱいの場合、SENDメソッドは例外をスローします。
このメソッドIF_AMQP_RECEIVER~SEND_CREDITは、AMQPフロー制御フレームをピアに送信して、送信者が使用できるリンククレジットを更新します。この方法の使用は、受信機のリンク接続中に指定されたAMQP受信機オプションでAMQP受信機の自動リンククレジットがオフになっている場合にのみ意味があることに注意してください。デフォルトでは、ABAPAMQPレシーバはリンククレジットを自動的に付与します。
メソッドIF_AMQP_RECEIVER~GET_SOURCEとIF_AMQP_RECEIVER~GET_RECEIVER_OPTIONSは、レシーバーリンクの接続が確認された後に使用される送信元アドレスとレシーバーオプションを返します。これらの方法の理由は、送信元アドレスと一部の受信者オプションが送信者リンク、この場合はピアを制御しているためです。