モバイルデバイスがXMLインターフェイス経由で汎用モジュールを呼び出すことを可能にするSAP ICFサービス(HTTP)を開発中です。 与えられたXMLには、呼び出す関数モジュールと使用するパラメータに関するデータが含まれています。 汎用モジュールが終了するたびに、結果がモバイルデバイスに返されます。我々はIF_HTTP_EXTENSION
ハンドラを使用しています。クライアントが切断されたときにSAP ICFの実行が終了しないようにする
機能モジュールの実行に時間がかかるたびに、モバイルデバイスがタイムアウトして接続を閉じ、要求を再接続して再送信するという問題があります。 これが発生するたびに、IF_HTTP_EXTENSION
ハンドラのhandle_request
メソッドがただちに終了します。 しかし、クライアントが同じシーケンス番号でリクエストを再送するので、呼び出された関数の実行を続行する必要があります。 実際の関数を2回呼び出すのではなく、以前に呼び出された関数が完了するのを待つ「待機」メソッドです。 データベースを定期的にチェックして(WHILE
ループ、各反復でWAIT UP TO 2 SECONDS
)繰り返します。
クライアントがタイムアウトしない限り、できるだけ早くレスポンスを送信したいと考えています。 したがって、最初の要求では、2秒の遅延でwhileループを実行することは適切ではありません。
我々の現在のアプローチは、(handle_request
に)以下の通りです:と呼ばれる、とすぐにクライアントが接続を切断するなど、
WAIT UNTIL a_running <> 'X'.
しかし:
この後CALL FUNCTION 'CLIENT_DESIRED_FUNCTION'
STARTING NEW TASK l_client_id
CALLING processing_finished ON END OF TASK
EXPORTING
...
、私たちがすることによって、その完了を待ちます関数(と同様にhandle_request
メソッド)が終了します。
CALLING processing_finished ON END OF TASK
を削除すると、実際に機能が続行されます。 これが私たちが望む動作です。ただし、WAIT UNTIL
ステートメントがsy-subrc = 4
(Async rfc関数呼び出しなし)で返されるため、関数が完了するまで待つ方法はありません。
私たちは単純にWHILE
- WAIT UP TO 2 SECONDS
-loopを使用することができますが、実際には防止するために遅延があります。 もう一つの解決策は、タイムアウトが発生する直前にHTTPコード102をクライアントに送信することでした。しかし、これは良い解決策ではありません。モバイルデバイスがネットワークを持たず、時間内に102を受信しない可能性があるからです。
SAP ICFがhandle_request
メソッドを終了させないようにする方法はありますか?CALLING ... ON END OF TASK
パラメータを使用せずに非同期タスクを効率的に待つことは可能ですか?
敬具、 トビアス
これが私たちの最初の解決策でした。残念ながら、クライアントがネットワークなしでこのメッセージを受信せず、接続を閉じてしまう可能性があるため、モバイルデバイスへのメッセージは機能しません。私たちの技術を使いたいお客様は、Wi-Fiカバレッジが悪いことがわかります。 ユーザーは、あなたが提案したようにクライアントが非同期にこれらの要求を送信できるので、待つ必要はありません:-)。 お寄せいただきありがとうございますが、モバイルデバイスの接続動作により、私たちの場合は動作しません。 :-( –
クライアントがサーバーに要求を送信するたびに、即座に応答が返されます。「201 Accepted」と表示されます。「要求を受け取り、処理を開始します。クライアントが接続するたびに、最初のリクエストのステータスを確認できるので、2回目は無関係です。ほとんどの場合、処理され、適切な応答が発行されます。モバイル用。 –