Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

ビジネス・サービスの定義

この章では、ビジネス・サービス・クラスの定義方法について説明します。この章は以下の節で構成されています。

Tip:

Ensemble では、特定の受信アダプタを使用する特殊なビジネス・サービス・クラスとユーザのニーズに適したビジネス・サービス・クラスの 1 つが提供されます。そのため、プログラミングの必要がありません。部分リストは、"Ensemble の紹介" の “接続オプション” を参照してください。

概要

ビジネス・サービスは、外部アプリケーションからの要求を受信します。下の図は、そのしくみを示しています。

generated description: business service

この図に示されているのは、データの入力フローだけで、オプションの応答は含まれていないことに注意してください。

ビジネス・サービスは、以下のアクティビティを実行します。

  • 特定の外部イベント (アプリケーションからの通知や TCP メッセージの受信など) を待ち受けます。

  • イベントなどに付随するデータの読み取り、構文解釈、および検証を行います。

  • 必要に応じて、イベントを受け取ったことを示す確認応答を外部アプリケーションに返します。

  • Ensemble 要求メッセージのインスタンスを作成して、それを処理するために適切なビジネス・プロセスまたはビジネス・オペレーションに転送します。

ビジネス・サービスの主な目的は、データ入力を受け取ることです。大半のケースでは、ビジネス・サービスにはビジネス・サービスと関連付けられた受信アダプタが存在します。ただし、アダプタが不要なケースもあります。アプリケーションが Ensemble 要求メッセージをサービス内に送り込める場合や、ビジネス・サービスが特定の種類の外部呼び出し (例えば複合アプリケーションからの呼び出し) を処理するように既に記述されている場合がこれに該当します。この種のビジネス・サービスは、アダプタ不要型 のビジネス・サービスと呼ばれます。

ビジネス・サービスが受信アダプタを備えている場合は、データ “引き出し” モードとなります (反対は、“押し込み” モード)。このモードでは、ビジネス・サービスはアダプタに対し、データを持っているかどうかを一定間隔で問い合わせます。一方、アダプタは、入力データを検出すると、それを処理するビジネス・サービスを呼び出します。

ビジネス・サービスにアダプタが備わっていない場合は、データを “引き出しません”。代わりに、クライアント・アプリケーションがビジネス・サービスを呼び出して入力の処理を指示します (これがデータ “押し込み” モードです)。

基本原理

初めに、“Ensemble のプログラミング” の章をお読みください。

ビジネス・サービス内では、ビジネス・サービスの Adapter プロパティとして使用可能な関連アダプタのプロパティとメソッドにアクセスできます。これは、アダプタのデフォルト動作を変更できることを意味します。それが適切な場合と適切でない場合があります。カプセル化の原理を思い出せば役に立ちます。カプセル化のアイデアとは、アダプタ・クラスに技術固有のロジックを担当させ、ビジネス・サービス・クラスにプロダクション固有のロジックを担当させるというものです。

ビジネス・サービス・クラス内部からアダプタ・クラスの動作を大幅にまたは頻繁に変更する必要がある場合は、アダプタ・クラスのサブクラスをカスタマイズする方がより適切です。“あまり一般的ではないタスク” を参照してください。

この原理はビジネス・オペレーションにも適用されます。

ビジネス・サービス・クラスの定義

ビジネス・サービス・クラスを作成するには、次のようにクラスを定義します。

  • クラスは、Ens.BusinessServiceOpens in a new tab (またはサブクラス) を拡張する必要があります。

  • クラス内では、ADAPTER パラメータを、使用するビジネス・サービス用のアダプタ・クラスの名前と一致させる必要があります。

    Tip:

    Ensemble の外部のイベントを気にせず、定期的にビジネス・サービスを呼び出して実行させるだけの場合は、アダプタ・クラスの Ens.InboundAdapterOpens in a new tab を使用します。

  • クラスには OnProcessInput() メソッドを実装する必要があります。これについては、“OnProcessInput() メソッドの実装” で説明します。

  • クラスは設定を追加または削除できます。前述した “設定の追加と削除” を参照してください。

  • クラスでは、任意のまたはすべてのスタートアップ・メソッドおよびティアダウン・メソッドを実装できます。後述する “開始動作と停止動作の上書き” を参照してください。

  • クラスにはその内部で作業を完了するためのメソッドを含めることができます。

Note:

スタジオには、クラスを初めから作成するためのウィザードが用意されています。このウィザードにアクセスするには、[ファイル]→[新規作成] をクリックし、[プロダクション] タブをクリックします。次に [ビジネス・サービス] をクリックして [OK] をクリックします。

ビジネス・サービス・クラスの例は、"アダプタ・ガイド" を参照してください。

OnProcessInput() メソッドの実装

ビジネス・サービス・クラス内では、OnProcessInput() メソッドに次の汎用シグニチャを含めることができます。

Method OnProcessInput(pInput As %RegisteredObject, pOutput As %RegisteredObject) As %Status

ここで、pInput はアダプタがこのビジネス・サービスに送信する入力オブジェクトで、pOutput は出力オブジェクトです。

最初に、選択したアダプタ・クラスを確認してください。アダプタで必要な特定の入力引数を使用するように OnProcessInput() メソッド・シグニチャを編集することをお勧めします。

OnProcessInput() メソッドは、以下の一部またはすべてを実行する必要があります。

  1. オプションで、ビジネス・サービス・クラスのプロパティを設定します (適時)。最も重要なビジネス・サービスのプロパティは、%WaitForNextCallInterval です。その値によって、Ensemble がアダプタの OnTask() メソッドを呼び出す頻度が制御されます。

    その他のプロパティについては、Ens.BusinessServiceOpens in a new tab に関する "クラス・リファレンス" を参照してください。

  2. 必要に応じて、入力オブジェクトを検証します。

  3. 入力オブジェクトを検査してその使用方法を決定します。

  4. ビジネス・サービスから送信される要求メッセージ・クラスのインスタンスを作成します。

    メッセージの作成方法は、“Ensemble メッセージの作成” の章を参照してください。

  5. 要求メッセージの場合は、必要に応じて、入力オブジェクト内の値を使用してそのプロパティを設定します。

  6. 要求メッセージの送信先を決定します。メッセージを送信するときに、プロダクション内のビジネス・ホストの構成名を使用する必要があります。

  7. 要求メッセージをプロダクション内の宛先 (ビジネス・プロセスまたはビジネス・オペレーション) に送信します。次の節を参照してください。

  8. 必ず出力引数 (pOutput) を設定します。通常、受信した応答メッセージと同じように設定します。この手順は必須です。

  9. 適切なステータスを返します。この手順は必須です。

要求メッセージの送信

ビジネス・サービス・クラスでは、OnProcessInput() の実装が要求メッセージをプロダクション内のいずれかの宛先に送信する必要があります。そのためには、必要に応じて、以下のビジネス・サービス・クラスのインスタンス・メソッドのいずれかを呼び出します。

これらのメソッドはそれぞれ、ステータス、つまり、%StatusOpens in a new tab のインスタンスを返します。

また、これらのメソッドは、Ens.BusinessProcessOpens in a new tabEns.BusinessOperationOpens in a new tab 内で同じメソッド・シグニチャを使用して定義されますが、そのインターナルはクラス内とは異なります。これは、これらのインスタンス・メソッドをビジネス・プロセス・クラスとビジネス・オペレーション・クラスの内部から呼び出せることを意味します。

SendRequestSync() メソッドの使用法

同期の要求を送信するには、以下のように SendRequestSync() メソッドを使用します。

  Set tSC = ..SendRequestSync(pTargetDispatchName, pRequest, .pResponse, pTimeout)

説明 :

  • pTargetDispatchName — 要求の送信先となるビジネス・プロセスまたはビジネス・オペレーションの構成名。

  • pRequest — 要求メッセージ。“Ensemble メッセージの定義” を参照してください。

  • pResponse — (参照渡し) 応答メッセージ。このオブジェクトは、応答によって返されるデータを受信します。

  • pTimeout — (オプション) 応答を待機する秒数。デフォルトは -1 (永久に待機) です。

このメソッドは、ステータス、つまり、%StatusOpens in a new tab のインスタンスを返します。

応答を期待しない場合は、SendRequestSync() の代わりに SendRequestAsync() を使用できます。

SendRequestAsync() メソッドの使用法

非同期の要求を送信するには、以下のように SendRequestAsync() メソッドを使用します。

  Set tSC = ..SendRequestAsync(pTargetDispatchName, pRequest)

説明 :

  • pTargetDispatchName — 要求の送信先となるビジネス・プロセスまたはビジネス・オペレーションの構成名。

  • pRequest — 要求メッセージ。“Ensemble メッセージの定義” を参照してください。

このメソッドは、ステータス、つまり、%StatusOpens in a new tab のインスタンスを返します。

SendDeferredResponse() メソッドの使用法

SendDeferredResponse() メソッドはすべてのビジネス・ホストでサポートされています。このメソッドは、ビジネス・ホストの Ensemble 遅延応答メカニズムへの参加を許可します。ビジネス・ホストは、1 つ前の遅延要求を識別して、実際の応答メッセージを作成し、要求を発信したビジネス・ホストに送信します。“Ensemble のプログラミング” の章の “遅延送信の使用法” を参照してください。

このトピックでは、このメカニズムにおけるビジネス・サービスの役割について説明します。例えば、延期された応答トークンと共に受信イベントが Ensemble に到着し、その到着ポイントがビジネス・サービスであるとします。このビジネス・サービスは、SendDeferredResponse() を呼び出して応答を作成し、要求の送信元に転送します。この SendDeferredResponse() 呼び出しは、以下のようになります。

   Set sc = ..SendDeferredResponse(token, pResponseBody)

説明 :

  • token — 延期された要求を識別するための文字列。これにより、呼び出し元は、延期された要求を元の要求と照合できます。ビジネス・サービスは、プロダクション固有のメカニズムを通じて、このトークン文字列を取得します。

    例えば、外部の宛先が電子メールである場合、延期された応答の受信が必要な要求を送信するときに、送信する電子メールの件名にビジネス・オペレーションでこのトークン文字列を記述します。この電子メールを受信した外部エンティティは、要求の件名からこのトークンを抽出し、応答の件名に使用します。これによりトークンが保持されるので、この応答メールを受信したビジネス・サービスで SendDeferredResponse() を呼び出すときにこのトークンを使用できます。

  • pResponseBody — 応答メッセージ。このオブジェクトは、応答によって返されるデータを受信します。“Ensemble メッセージの定義” を参照してください。

このメソッドは、ステータス、つまり、%StatusOpens in a new tab のインスタンスを返します。

呼び出し間隔単位のイベント処理

ビジネス・サービスで呼び出し間隔ごとに 1 つのイベントしか処理しない場合は、OnProcessInput() の実装内で %WaitForNextCallInterval プロパティを 1 (真) に設定します。

 set ..%WaitForNextCallInterval=1

このように設定すると、複数の入力イベントが存在しても、ビジネス・サービスで CallInterval の期間に入力イベントが 1 つしか処理されないよう制限されます。

この情報は、CallInterval という名前のプロパティを持ち、そのプロパティをポーリング間隔として使用するアダプタを使用するビジネス・サービスに適用されます。

FeedbackOpens in a new tab