2016-04-12 56 views
0

モバイルデバイスが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パラメータを使用せずに非同期タスクを効率的に待つことは可能ですか?

敬具、 トビアス

答えて

0

私は手でコードを持っていないが、私は、SAPゲートウェイの周りではなかったし、あなたがあなた自身のRESTサービスを構築するために持っていたときの前に、この問題を解決しました。

2秒の処理にタイムアウトを使用しました。その後、サーバーは何かを返さなければなりません。処理が完了していない場合(async汎用モジュールを使用)、サーバーはHTTP Status 202 Acceptedで応答します。クライアントは、その後、別の要求を送信して、前の要求の状態を尋ねることができる。

このパターンは非常にうまく機能しました。フロントエンドの開発者は、すべての要求に対して非同期モデルを使用し、SAPの応答時間が変動しても遅延が発生しないアプリケーションを作成しました。たとえば、ピーク時に販売注文をコミットするには1〜15秒かかります。

+0

これが私たちの最初の解決策でした。残念ながら、クライアントがネットワークなしでこのメッセージを受信せず、接続を閉じてしまう可能性があるため、モバイルデバイスへのメッセージは機能しません。私たちの技術を使いたいお客様は、Wi-Fiカバレッジが悪いことがわかります。 ユーザーは、あなたが提案したようにクライアントが非同期にこれらの要求を送信できるので、待つ必要はありません:-)。 お寄せいただきありがとうございますが、モバイルデバイスの接続動作により、私たちの場合は動作しません。 :-( –

+0

クライアントがサーバーに要求を送信するたびに、即座に応答が返されます。「201 Accepted」と表示されます。「要求を受け取り、処理を開始します。クライアントが接続するたびに、最初のリクエストのステータスを確認できるので、2回目は無関係です。ほとんどの場合、処理され、適切な応答が発行されます。モバイル用。 –

関連する問題