Rich UI アプリケーションからのサービスの非同期呼び出し

Rich UI では、サービスを非同期に呼び出すには call ステートメントを使用します。

call serviceName.operationName(argumentList)
   returning to myCallbackFunction onException myExceptionHandler
   {timeout = milliseconds};
serviceName
インターフェース・パーツに基づく変数の名前
operationName
インターフェース・パースの関数プロトタイプの名前
argumentList
それぞれが次の値とコンマで区切られた、引数のリスト

引数に関する制約については、『サービス・アクセスのプロトタイプ』を参照してください。

myCallbackFunction
call ステートメントで使用可能なコールバック関数または委譲の名前。ほとんどの場合、関数または委譲は、同じ Rich UI ハンドラー内またはライブラリー内にあります。コールバック関数については、このトピックで後述します。
myExceptionHandler
オプション。call ステートメントで使用可能な例外ハンドラーまたは委譲の名前。ほとんどの場合、例外ハンドラーまたは委譲は、同じ Rich UI ハンドラー内またはライブラリー内にあります。例外ハンドラーについては、この後このトピックで説明します。
独自の例外ハンドラーがない場合は、委譲 serviceLib.serviceExceptionHandler を指定できます。 以下に、影響を示します。
  • デフォルトでは、この委譲を指定することによって、例外の message フィールドの内容を標準出力に書き込むシステム関数が自動的に呼び出されます。この製品では、標準出力はコンソール・ビューです。外部ブラウザーでは、標準出力は Web ページの下部です。
  • あるいは、委譲によってカスタム例外ハンドラーが呼び出されることがあります。この代替方法を使用して、一連のアプリケーションにわたって一貫性のあるカスタム・エラー処理を実現することもできます。
    例えば、以下のようにします。
    1. myLibrary という名前のライブラリーを作成し、カスタム例外ハンドラー myExceptionHandler とセットアップ関数の両方を組み込みます。
    2. セットアップ関数に次のステートメントを組み込みます。
      serviceLib.serviceExceptionHandler = myLibrary.myExceptionHandler;
    3. on-construction 関数を使用して、各 Rich UI アプリケーションでセットアップ関数を呼び出します。

    call ステートメント (ステートメントに serviceLib.serviceExceptionHandler が含まれる場合) によって呼び出されるすべてのサービスについて、EGL ランタイム・コードは、カスタマイズ済みの例外ハンドラーを実行する (この場合は、myLibrary.myExceptionHandler を実行する) ことによって、ランタイム例外に応答します。

milliseconds
EGL Rich UI プロキシーが (アプリケーション・サーバーで) Web サービスを呼び出したときと、プロキシーが応答を受け取ったときの間に経過する有効な最大ミリ秒数。これを超える時間が経過すると、EGL ランタイム・コードは ServiceInvocationException をスローします。ただし、専用サービスへのアクセス中にはタイムアウトは施行されません。
タイムアウトを設定するには、次のようにします。
  • ローカル・ネットワーク・トラフィック、インターネット・トラフィック、サーバー応答時間など、さまざまな要素を考慮します。それらの要因は、異なる条件下では同じサービスの 2 つの呼び出しにかかる時間が異なる可能性があることを意味します。
  • ご使用のアプリケーションの性質を考えてみましょう。コードがクレジット承認を待機している場合、ユーザーに対して 2 回課金する可能性を防ぐために、タイムアウト値を大きく設定できます。オンライン・オークションの入札を実行するコードの場合、ユーザーが迅速に別の入札を実行できるように、タイムアウト値を小さく設定できます。
  • その差が 1 秒以上ある複数のタイムアウト値を使用します。

milliseconds のデフォルト値は、defaultServiceTimeout ビルド記述子オプションで設定できます。defaultServiceTimeout ビルド記述子オプションには設定されているデフォルト値はありません。 defaultServiceTimeoutmilliseconds のいずれにも値を指定していない場合、サービス呼び出しはタイムアウトしません。詳しくは、『defaultServiceTimeout』を参照してください。

call ステートメントのキー・ストローク支援

以下の種類のキー・ストローク支援を使用できます。
  • call ステートメントで returning to または onException キーワードを入力した後で、Ctrl+スペースを押して、コンテンツ・アシストを要求できます。関数のリストが表示され、関数を 1 つ選択できます。
  • 最後にセミコロンを付けて call ステートメントを入力し、存在しないコールバック関数または onException 関数への参照を含めた場合は、以下のようにして、ワークベンチが欠落しているロジックを作成することを要求できます。
    • Ctrl+1 を押します。
    • あるいは、セミコロンの後で右クリックして「コールバック関数の作成」を選択します。

コールバック関数

コールバック関数は、サービスによって送信された応答内に値がある場合は、その値を受け取ります。コールバック自体は戻り値を持ちません。

コールバック関数がサード・パーティーの REST サービスから呼び出される場合、関数にゼロまたは 1 つのパラメーターが使用されている可能性があります。パラメーターが指定されている場合は、その型は、インターフェース・パーツで指定された戻りの型と一致する必要があり、パラメーター修飾子は IN です。

コールバック関数が SOAP サービスまたは EGL REST-RPC サービスから呼び出された場合は、関数パラメーターとサービス呼び出しパラメーターの関係は、以下の例を使用すると一番わかりやすく説明できます。
  • インターフェース・パーツの次の関数プロトタイプを考えてみます。
    Interface EmployeeService {}
       Function GetEmployeeDetail(employeeCode STRING IN, 
                                  employeeSalary FLOAT OUT, 
                                  employeeStatus STRING INOUT) 
                returns(myEmployeeRecordPart);
    end
  • 以下の例で、サービスを呼び出すために使用されるインターフェース宣言と call ステートメントを示します。
    myInterface EmployeeService;
    
    call myInterface.GetEmployeeDetail("A123", 25.8, "Full-time")
         returning to myCallback onException myExceptionHandler;
  • 以下に、コールバック関数の概要を示します。
    Function myCallBack(salary FLOAT IN, 
                        status STRING IN, 
                        myRecord myEmployeeRecordPart IN)
        // statements here
    end

    関数には、OUT または INOUT であるサービス操作パラメーターごとに 1 つのパラメーターが含まれています。コールバック関数におけるこれらのパラメーターの順序は、サービス操作での順序と同じです。 サービス操作の戻り値は、コールバック関数内での最後のパラメーターとして表されます。

通常、Web SOAP サービスまたは EGL REST-RPC サービスの コールバック関数を設計するための規則は、以下のとおりです。
  • 関数には、サービス呼び出しでの OUT パラメーターと INOUT パラメーターと順序が同じである一連のパラメーターがあります。
  • サービス呼び出しに戻り値がある場合は、コールバック関数には、戻り値を受け入れるための最後のパラメーターが追加で含まれています。
  • 関数内の各パラメーターには IN 修飾子が付いています。

onException 関数

onException 関数には、次の特性があります。
  • 戻り値なし
  • この関数は型 AnyException の例外レコードを受け入れます。ユーザーは、そのレコードをテストして、受け取る特定の型を判別できます。

以下に、onException 関数の概要を示します。

Function myExceptionHandler(exp AnyException)
   case 
      when (exp isa ServiceBindingException)
         ;
      when (exp isa ServiceInvocationException)
         ;
      otherwise
         ; 
   end
end
エラーは次の場所で発生する可能性があります。
  • サービス・バインディング。つまり、サービス・アクセスをコードで指定する方法。このエラーには、デプロイメント記述子の問題が関連している可能性があります。
  • Rich UI アプリケーションと EGL Rich UI プロキシーとの通信
  • EGL Rich UI プロキシー
  • EGL Rich UI プロキシーとサービスとの通信
  • サービス

サービス・バインディングの問題により、ServiceBindingException が発生します。 その他の問題によって ServiceInvocationException または RuntimeException が発生することがありますが、発生する可能性は高くありません。


フィードバック