ABAPデーモンクラスは、スーパークラスCL_ABAP_DAEMON_EXT_BASEから継承するABAPクラスです。
ABAPデーモンクラスのインスタンス生成は、パブリックタイプである必要があります。
インターフェイスメソッド
ABAPデーモン基本クラスCL_ABAP_DAEMON_EXT_BASEには、インタフェースIF_ABAP_DAEMON_EXTENSIONが含まれています。このインタフェースは、ABAPデーモンクラスによって実装される必要がある以下のイベント処理メソッドを提供します。
IF_ABAP_DAEMON_EXTENSION〜ON_ACCEPTを実行して、ABAPデーモンクラスがABAPデーモンのインスタンス化を受け入れまたは拒否できるようにします。この決定は、クライアントによってオプションで提供されるコンテキスト情報と開始パラメーターに依存する可能性があります。エクスポートパラメータe_setup_modeを設定することにより、デーモンのインスタンス化を承認または拒否できます。
IF_ABAP_DAEMON_EXTENSION〜ON_STARTは、デーモンのインスタンス化が受け入れられた後に1回実行されます。これは、ABAPデーモンクラスの特定のコンテキストを確立するために使用されます(以下の例を参照)。デーモンのインスタンス化がメソッドIF_ABAP_DAEMON_EXTENSION〜ON_ACCEPTによって受け入れられた場合にのみ呼び出されます。
IF_ABAP_DAEMON_EXTENSION〜ON_MESSAGEは、メソッドIF_ABAP_DAEMON_HANDLE〜SENDを使用して、関連付けられたABAPデーモンインスタンスIDを介してクライアントアプリケーションから送信されたメッセージをデーモンが受信するたびに実行されます。
IF_ABAP_DAEMON_EXTENSION〜ON_STOPは、デーモンが停止メッセージを受信するとすぐに実行されます。停止メッセージは、関連するABAPデーモンインスタンスIDを介して送信するか、デーモン自体によってトリガーすることができます。このメソッドを実行すると、デーモンは終了します。
エラーのためにデーモンが再起動された場合、IF_ABAP_DAEMON_EXTENSION〜ON_ERRORが実行されます。たとえば、デーモンメソッドの実行中にエラーが発生すると(たとえば、タイプE / A / XのABAPメッセージ)、ABAP実行ユニットが異常終了し、 ON_ERRORメソッドが呼び出されます。この場合、 ON_ERRORメソッドが呼び出される前に、ABAPメモリ(以下のセッション再開に関する推奨事項を参照)が解放されています。
ON_ERRORメソッドの実行中にエラーが発生した場合、 ON_ERROR処理のビジーループを回避するために、後続のON_ERROR実行は約30秒間遅延されます。したがって、 ON_ERROR処理中のエラーを回避することが重要です。遅延値は構成できません。インポートパラメータI_CODEは、 IF_ABAP_DAEMON_EXTENSION=>CO_ON_ERROR_CODEで定義されている処理済みエラーの特定のコードを提供します。
IF_ABAP_DAEMON_EXTENSION〜ON_RESTARTは、ABAPデーモンクラスがインタフェースメソッドIF_ABAP_DAEMON_CONTEXT〜RESTARTを処理するときに実行されます。この場合、 ON_RESTARTメソッドが呼び出される前に、ABAPメモリ(以下のセッション再開に関する推奨事項を参照)が解放されています。RESTARTメソッドを使用すると、クラスは特定のデーモンコンテキストを再作成できます(メソッドON_STARTおよびON_ERRORと同様)。さらに、 IF_ABAP_DAEMON_CONTEXT〜RESTARTメソッドを呼び出す前に、クラスはメソッドIF_ABAP_DAEMON_CONTEXT〜SET_APPLICATION_PARAMETERを使用して、最後の整合性のあるデーモンコンテキストをデーモンメモリに保存できます。。これが以前に発生した場合、クラスはIF_ABAP_DAEMON_CONTEXT〜GET_APPLICATION_PARAMETERを使用して保存されたデータにアクセスすることにより、デーモンコンテキストを再作成できます。
IF_ABAP_DAEMON_EXTENSION〜ON_BEFORE_RESTART_BY_SYSTEMは、ABAPデーモンセッションが不整合な状態にある場合にシステムによって実行されます。たとえば、ABAPデーモンクラスで使用されるプログラム(クラス、汎用モジュールなど)のプログラムソースバージョンが変更された場合です。このメソッドの実行後、セッションコンテキストは解放されます。その後、ON_RESTARTメソッドがABAPデーモンランタイムによって実行されます。現在のコンテキスト情報を保存することは合理的です。たとえば、SET_APPLICATION_PARAMETERおよびGET_APPLICATION_PARAMETERを使用して、 ON_RESATRTメソッドで復元できるようにします。
IF_ABAP_DAEMON_EXTENSION〜ON_SERVER_SHUTDOWNは、アプリケーションサーバーインスタンスに対してソフトシャットダウンがトリガーされたときに実行されます。このメソッドを処理した直後にデーモンが停止します。デーモンとそのコンテキストをシステム内の代替アプリケーションサーバーインスタンスに再配置することは合理的です。
IF_ABAP_DAEMON_EXTENSION〜ON_SYSTEM_SHUTDOWNは、システム全体のソフトシャットダウンがトリガされたときに実行されます。このメソッドを処理した直後にデーモンが停止します。
推奨事項
ABAPデーモンセッションが(エラーのため、またはRESTARTメソッドを手動で使用して)再開された場合、それぞれのイベントハンドラON_ERRORまたはON_RESTARTが呼び出される前に、以下のリソースがクリーンアップされます。
- セッションのABAPメモリ。
- セッションのすべてのRFC、HTTP、およびWebSocket接続(接続は切断され、未処理のメッセージはすべて破棄されます)。RFC接続は、要求を処理した後、たとえばON_MESSAGEメソッドの後など、実行時にも閉じられます。
- ロックをエンキューします。
最適なリソース管理を保証するために、ABAPガベージコレクタが定期的に開始されます。
これとは対照的に、デーモンセッションの再起動中は、次のリソースが保持されます。
- 開始パラメーターとアプリケーションパラメーター(メソッドGET_START_PARAMETERおよびGET_APPLICATION_PARAMETERは、再起動前と同じ値を提供します)。
- 未処理のデーモンメッセージ。
- ABAPメッセージングチャネル(AMC)の未処理のメッセージ。ただし、未処理のメッセージを処理するには、AMC登録を復元する必要があります(以下を参照)。
したがって、次のアクションをお勧めします。
- デーモンコンテキスト(セッション)情報は、メソッドON_START、ON_RESTART、およびON_ERRORで使用できないため、デーモンインスタンスを起動または再起動した後、デーモンコンテキスト情報を確立するための中央メソッドを設定するのが妥当です。たとえば、メソッドSETUP_CONTEXT(IMPORTING I_CONTEXTTYPE REF TO IF_ABAP_DAEMON_CONTEXT)を登録し、それをON_START、ON_RESTART、およびON_ERRORで呼び出すことができます。
ABAPデーモンコンテキストデータを保存および復元するために、デーモン固有のメモリ領域、つまりIF_ABAP_DAEMON_CONTEXT〜SET_APPLICATION_PARAMETERおよびIF_ABAP_DAEMON_CONTEXT〜GET_APPLICATION_PARAMETERを使用することもできます。
- デーモンコンテキストが削除されると、つまりデーモンセッションの再起動後に、エンキューロックが削除されます。したがって、ON_STARTおよびON_ERRORメソッドでは、デーモンセッションで取得されたすべてのエンキューが解放されます。シナリオに応じて、エンキューを再度確立する必要があります。
- 未処理のAMCメッセージは、デーモンの再起動中に保持されます。AMC登録を復元し、未処理のAMCメッセージを処理するには、アプリケーション固有のAMCチャネルをメソッドSETUP_CONTEXTのON_ERRORおよびON_RESTARTに登録することを強くお勧めします(上記を参照)。AMC登録が復元されない場合、これらのチャネルの未処理のAMCメッセージは、ON_ERRORまたはON_RESTARTメソッドを処理した直後に破棄されます。
さらに、イベント処理メソッド( ON_STARTやON_MESSAGEなど)の実行中に、インポートパラメータI_CONTEXTは、インタフェースIF_ABAP_DAEMON_CONTEXTへのアクセスを提供します。このインターフェースには、以下のメソッドが含まれています。
- GET_START_PARAMETER:ABAPデーモンの起動フェーズ中にクライアントによって指定されたプッシュチャネルプロトコル(PCP)メッセージを提供します。このメソッドは、 I_CONTEXT_BASEパラメーターを使用するON_ACCEPTメソッドでも使用できます。
- GET_START_CALLER_INFO:クライアント、ユーザー名、プログラムなど、呼び出し元のコンテキストに関する情報を提供します。たとえば、この情報をON_ACCEPTメソッドで使用し、I_CONTEXT_BASEパラメータを使用してアクセス権を確認できます。
- SET_APPLICATION_PARAMETERおよびGET_APPLICATION_PARAMETER:約の非常に限られたサイズを保存および取得する可能性を提供します。ABAPデーモンセッションメモリ内の1メガバイトの情報。この情報は、再起動やエラーが発生した後でも、ABAPデーモンインスタンスの存続期間全体にわたって保持されます。
- GET_INSTANCE_ID:このデーモンにメッセージを送信するために使用されるインスタンスIDを提供します(クラスCL_ABAP_DAEMON_CLIENT_MANAGERを使用)。
- RESTART:ABAPデーモンの再起動につながります。これも:
- ABAPメモリの解放
- メソッドON_RESTARTの処理
- STOP:ABAPデーモンインスタンスを終了します。これにより、メソッドON_STOPがトリガーされます。
ABAPデーモンのイベント処理メソッドに加えて、ABAPデーモンアプリケーションはイベント駆動型のABAPタイマーライブラリを使用できます。ABAPタイマーを使用すると、特定のデーモン固有のイベントが発生していなくても、ABAPデーモンを停止することができます。ABAPタイマーライブラリは、以下のメソッドで構成されています。
- CL_ABAP_TIMER_MANAGER => GET_TIMER_MANAGER :タイプIF_ABAP_TIMER_MANAGERのABAPタイマーオブジェクトを登録します。
- IF_ABAP_TIMER_MANAGER〜START_TIMER :タイプIF_ABAP_TIMER_HANDLERのオブジェクトに対して、ミリ秒範囲のタイムアウトでタイマーを設定します。
- IF_ABAP_TIMER_MANAGER〜STOP_TIMER :タイプIF_ABAP_TIMER_HANDLERのオブジェクトのタイマーを停止します。
プログラムの変更
手動再起動、つまりON_BEFORE_RESTART_BY_SYSTEMの処理、およびデーモンインスタンスの後続のON_RESTARTメソッドは、トランザクションSMDAEMONおよびメニューエントリ を使用してトリガすることができます。