25 Oracle Business Rulesのスタート・ガイド
Oracle Business Rulesのその他の例は、Oracle Business Process Managementによるビジネス・ルールの設計を参照してください。
一部のスクリーン・ショットは以前のバージョンを表している場合がありますが、内容は適用できます。
25.1 ビジネス・ルール・サービス・コンポーネントの概要
デシジョン・コンポーネント(ビジネス・ルール・サービス・コンポーネントとも呼ばれます)は、SOAコンポジット・アプリケーションでのOracle Business Rulesの使用をサポートしています。
デシジョン・コンポーネントは、次のようにSOAコンポジットで使用できます。
-
デシジョン・コンポーネントは、SOAコンポジット内で使用してBPELコンポーネントに接続できます。
-
デシジョン・コンポーネントは、SOAコンポジット内で使用してビジネス・ルールの実行に直接使用できます。
-
デシジョン・コンポーネントは、メディエータの動的ルーティング機能とともに使用できます。
詳細は、「ルーティング・ルールの作成」を参照してください。
-
デシジョン・コンポーネントは、ヒューマン・ワークフローの拡張ルーティング・ルールとともに使用できます。
詳細は、「ヒューマン・タスクとBPELプロセスの関連付け」を参照してください。
25.1.1 BPELプロセス、ビジネス・ルールおよびヒューマン・タスクの統合
BPELプロセス、ビジネス・ルールおよびヒューマン・タスク・コンポーネントを含むSOAコンポジット・アプリケーションを作成できます。これらのコンポーネントは補完的な技術です。BPELプロセスではシステム、サービスおよびユーザーのオーケストレーションにフォーカスが置かれます。ビジネス・ルールでは、意思決定とポリシーにフォーカスが置かれます。ヒューマン・タスクを使用すると、エンドツーエンド・プロセス・フローの一部として実行するタスクをユーザーまたはグループに対して説明するワークフローをモデリングできます。
ビジネス・ルールを使用できる状況の例を次に示します。
-
動的処理
ルールにより、サービス・レベル合意や他のガイドラインに基づいて、ビジネス・プロセス内でインテリジェント・ルーティングを実行できます。たとえば、顧客が1日以内のレスポンスを必要とする場合は、融資申請をQuickLoan融資エージェントにのみ送信します。顧客に1日以上の余裕がある場合は、申請を3つの異なる融資エージェントにルーティングします。
-
プロセスのビジネス・ルールの外部化
通常ビジネス・プロセスの一部として評価する必要がある条件が多くあります。ただし、これらの条件のパラメータはプロセスに関係なく変更できます。たとえば、信用度が650以上の顧客にのみ融資を提供するとします。この値は、ビジネス・アナリストが設定した新規ガイドラインに基づいて動的に変更できます。
-
データ検証および制約チェック
ルールは、入力データを検証したり、リクエストに対して追加制約を適用できます。たとえば、新規顧客リクエストには、常に雇用確認書と銀行勘定詳細を添付する必要があります。
-
ヒューマン・タスクのルーティング
ビジネス・プロセスでは、次のようにヒューマン・タスクでルールが頻繁に使用されます。
-
ポリシー・ベースのタスク割当てでは、タスクが特定のロールやユーザーにディスパッチされます。たとえば、ポータルからの着信リクエストを処理するプロセスでは、融資申請と見積保険料を異なるロール・セットにルーティングできます。
-
ユーザー間のタスクのロード・バランシング。タスクが一連のユーザーまたはロールに割り当てられると、そのロールの各ユーザーはタスク・セットを取得して、指定された時間内にタスクの処理を行います。新規タスクを受け取った場合は、ポリシーを適用してタスクに優先度が設定され、特定のユーザー・キューに入れられます。たとえば、特定の1人の融資エージェントに対して割り当てる融資を、常に最大で10件にするなどです。
-
ヒューマン・タスク・コンポーネントのヒューマン・タスク・エディタでのビジネス・ルール作成の詳細は、「ビジネス・ルールを使用した詳細タスク・ルーティングの指定方法」を参照してください。
25.2 ルール・デザイナ・エディタ環境の概要
Oracle JDeveloperのSOAコンポジット・アプリケーションにビジネス・ルール・サービス・コンポーネントを作成した後は、そのサービス・コンポーネントをビジネス・ルール・デザイナを使用して設計できます。このデザイナは、SOAコンポジット・エディタでビジネス・ルールをダブルクリックすると表示されます。
ビジネス・ルール・デザイナは、図25-1に示す主要なセクションで構成されています。これらのセクションでは、Oracle JDeveloperのビジネス・ルールを使用できます。
SOAインストールには、動詞ルールおよびビジネス・フレーズがないことに注意してください。これはBPMの機能です。
25.2.1 「アプリケーション」ウィンドウ
「アプリケーション」ウィンドウには、プロジェクトのファイルが表示されます。各プロジェクトに格納できるのは、1つのコンポジットのみです。ただし、各コンポジットには、同じタイプまたは異なるタイプ(ビジネス・ルール、BPELプロセス、Oracle Mediatorおよびヒューマン・ワークフロー)の複数のコンポーネントを指定できます。
ビジネス・ルールの設計時には、追加ファイル、フォルダおよび要素を「アプリケーション」ウィンドウに表示できます。
25.2.2 ルール・デザイナ・ウィンドウ
ルール・デザイナ・ウィンドウには、選択したディクショナリ・コンポーネントのビジュアル・ビューが表示されます。ルール・デザイナのナビゲーション・タブを使用して、使用するディクショナリの様々な部分を選択します。ルール・デザイナ・ウィンドウは、次のいずれかの処理を実行すると表示されます。
-
コンポジット内でビジネス・ルール・コンポーネントをダブルクリックした場合
-
SOAコンポジット・エディタでビジネス・ルール・コンポーネントをダブルクリックした場合
-
BPELプロセス内でビジネス・ルールをダブルクリックした場合
-
「アプリケーション」ウィンドウで、ビジネス・ルールのディクショナリ・ファイル(.rules拡張子付きのファイル)をダブルクリックした場合。
-
.rulesファイルが選択されている状態の「設計」タブをクリックした場合
表25-1では、ルール・デザイナでディクショナリを使用する際の情報を検索できるナビゲーション領域について説明します。
表25-1 ルール・デザイナのナビゲーション領域の説明
ルール・デザイナのナビゲーション領域の詳細および説明は、『Oracle Business Process Managementによるビジネス・ルールの設計』を参照してください。
25.2.3 「構造」ウィンドウ
「構造」ウィンドウには、ルール・デザイナ・ウィンドウで現在選択しているビジネス・ルール・ディクショナリのデータが構造的に表示されます。このセクションで要素を選択または右クリックすると、次のような様々なタスクを実行できます。
-
ファクト、関数、グローバル、値セット、ディクショナリ・リンク、デシジョン関数などの要素の管理(作成、編集、リフレッシュおよび削除)
-
ルールセット、ルールおよびデシジョン表へのアクセス
図25-2に、「構造」ウィンドウを示します。
25.2.4 「ビジネス・ルール検証 - ログ」ウィンドウ
ルール・デザイナでは、図25-3に示すように、ビジネス・ルール検証ログにディクショナリ検証のステータスが表示されます。
ディクショナリが無効な場合、ルール・デザイナでは警告メッセージのリストが生成されて関連ディクショナリ・オブジェクトがリスト表示されるため、ディクショナリ・オブジェクトの検索と問題の解決に使用できます。ルール・デザイナを使用したルールの作成時に表示される検証警告は、無視しても問題ありません。検証警告はルールを作成すると削除されますが、ルール作成時の中間ステップ中は表示されます。ルールをテストまたはデプロイする際は、関連ディクショナリに警告が表示されていない必要があります。
ビジネス・ルールの検証の詳細は、『Oracle Business Process Managementによるビジネス・ルールの設計』を参照してください。
25.3 ビジネス・ルールの作成および編集の概要
ビジネス・ルールを開始する方法を学習し、ビジネス・ルールの設計に使用するOracle JDeveloperの主要なセクションについて簡単に紹介します。
25.3.1 ビジネス・ルール・コンポーネントの作成方法
ビジネス・ルール・コンポーネントは、SOAコンポジット・エディタを使用して追加できます。
ビジネス・ルール・コンポーネントを作成するには:
-
表25-2の説明に従って、Oracle JDeveloperを起動します。
表25-2 Oracle JDeveloperの起動
起動対象 Windowsの場合 UNIXの場合 Oracle JDeveloper
JDev_Oracle_Home
\JDev\bin\jdev.exe
をクリックするか、ショートカットを作成します。$ORACLE_HOME
/jdev/bin/jdev
-
次のいずれかの方法を使用して、ビジネス・ルール・サービス・コンポーネントを作成します。
既存のSOAコンポジット・アプリケーションのサービス・コンポーネントとして、「ビジネス・ルール」サービス・コンポーネントを「コンポーネント」ウィンドウからSOAコンポジット・エディタにドラッグします
新規アプリケーションに追加する方法:
-
「アプリケーション」ウィンドウから、「ファイル」→「新規」→「アプリケーション」→「SOAアプリケーション」の順に選択します。
これにより、SOAアプリケーションの作成ウィザードが起動します。
-
「アプリケーションの名前付け」ページで、「名前」フィールドにアプリケーション名を入力します。
-
「ディレクトリ」フィールドに、SOAコンポジット・アプリケーションおよびプロジェクトを作成するディレクトリ・パスを入力します。
-
「次へ」をクリックします。
-
「プロジェクトの名前付け」ページで、「プロジェクト名」フィールドに一意のプロジェクト名を入力します。プロジェクト名は、SOAコンポジット・アプリケーション間で一意である必要があります。これは、コンポジットの一意性は、そのコンポジットのプロジェクト名によって確定されるためです。たとえば、表25-3に説明するような操作は実行しないでください。
表25-3 SOAプロジェクトの名前付けに関する制限
作成するアプリケーションの名前 作成するSOAプロジェクト名 Application1
Project1
Application2
Project1
デプロイ時に、2番目にデプロイされたプロジェクト(コンポジット)で最初にデプロイされたプロジェクト(コンポジット)が上書きされます。
-
「次へ」をクリックします。
-
「SOA設定の構成」ページで、「ビジネス・ルールを使用するコンポジット」を選択します。
-
「終了」をクリックします。
それぞれの方法を実行すると、「ビジネス・ルールの作成」ダイアログが表示されます。
-
-
必要な詳細を指定します。入力および出力に関する情報およびこのダイアログで「ディクショナリのインポート」オプションを使用する方法の詳細は、『Oracle Business Process Managementによるビジネス・ルールの設計』を参照してください。
-
「OK」をクリックします。
25.4 BPELプロセスへのビジネス・ルールの追加
デシジョン・コンポーネント(ビジネス・ルール・サービス・コンポーネントとも呼ばれます)を使用すると、BPELプロセスでビジネス・ルールを実行できます。
ビジネス・ルールは、「Business Rule」コンポーネントを使用してBPELプロセスに追加します。ビジネス・ルール・コンポーネントをBPELプロセスに追加する場合は、ルールに対して入力を提供し、ビジネス・ルールから結果を取得するために、入力変数と出力変数を指定する必要があります。
ビジネス・ルール・コンポーネントを使用して、ビジネス・ルールを実行し、ルールに基づいてビジネス上の意思決定を作成できます。ビジネス・ルール・コンポーネント(デシジョン・コンポーネントとも呼ばれます)を作成するには、「コンポーネント」ウィンドウから「ビジネス・ルール」をBPELプロセスにドラッグ・アンド・ドロップします。
ビジネス・ルールをBPELプロセスに追加するには:
25.4.2 ビジネス・ルールの出力の追加方法
ビジネス・ルールの出力を追加するには:
-
「ビジネス・ルールの作成」ダイアログで、「追加」アイコンの横にあるドロップダウン・メニューから「出力変数の追加...」を選択します。「出力変数の追加」ダイアログが表示されます。このダイアログを使用して出力変数を作成します。たとえば、入力変数の作成と同様の方法で
GetCreditRating
の出力変数を作成します。 -
「出力変数の追加」ダイアログで、「プロセス」の下の「変数」フォルダを選択することで、スコープを選択します。
-
右クリックして、ドロップダウン・リストから「変数の作成...」を選択します。「変数の作成」ダイアログが表示されます。
-
「変数の作成」ダイアログで、「名前」フィールドに出力変数名を入力します。たとえば、
Rating
と入力します。 -
「変数の作成」ダイアログの「タイプ」領域で、「要素の参照」アイコンを選択し、「タイプ・チューザ」ダイアログを使用して出力変数のタイプを入力します。たとえば、
CreditRatingTypes.xsd
を開き、rating
という要素タイプを選択します。 -
「タイプ・チューザ」ダイアログで「OK」をクリックします。
-
「変数の作成」ダイアログで「OK」をクリックします。
-
「出力変数の追加」ダイアログで「OK」をクリックします。
図25-10に示すように、「ビジネス・ルールの作成」ダイアログが表示されます。
25.4.3 オプションを設定してデシジョン・サービスとビジネス・ルール・ディクショナリを作成する方法
デシジョン・サービスとビジネス・ルール・ディクショナリを作成するには:
-
デフォルトのサービス名を使用しない場合は、「詳細」タブを選択し、「サービス名」フィールドにサービス名を入力します。たとえば、
CreditRatingService
というサービス名を入力します。 -
デシジョン・コンポーネントがステートフルかステートレスかの判断は、「セッションのリセット」を使用して行います。詳細は、「デシジョン・コンポーネントのステートフル操作に関する必知事項」を参照してください。
-
「ビジネス・ルールの作成」ダイアログで「OK」をクリックします。図25-11に示すように、Oracle JDeveloperでデシジョン・コンポーネントとディクショナリが作成され、ルール・デザイナが表示されます。
ルール・デザイナの詳細は、『Oracle Business Process Managementによるビジネス・ルールの設計』を参照してください。
25.4.4 BPELプロセスへのビジネス・ルール追加時の処理内容
ビジネス・ルールをBPELプロセスに追加すると、Oracle JDeveloperによってデシジョン・コンポーネントが作成され、ビジネス・ルール・サービス・エンジンを使用してビジネス・ルールが制御および実行されます。
デシジョン・コンポーネントの構成内容は次のとおりです。
-
Rules Engineを使用して評価されるルールまたはデシジョン表。これらはルール・デザイナを使用して定義され、ビジネス・ルール・ディクショナリに格納されます。
-
特定のルールを評価する際に必要なファクト、およびコールするデシジョン関数の説明。ルールまたはデシジョン表が格納される各ルールセットは、入力および出力されるファクトとOracle Business Rulesデシジョン関数の名前が指定されているサービスとして公開されます。ファクトは、ビジネス・ルールの入力および出力を定義する際に、XSD定義を介して公開されます。デシジョン関数は、Oracle Business Rulesディクショナリに格納されます。詳細は、『Oracle Business Process Managementによるビジネス・ルールの設計』を参照してください。
-
入力、出力および基礎となるビジネス・ルール・サービス・エンジンのコールがラップされているWebサービス。
ビジネス・プロセスでは、このWebサービスを使用して、プロセスの一環としてファクトをアサートしたり取り消すことができます。すべてのファクトをビジネス・プロセスから1単位としてアサートできる場合があります。また、ビジネス・プロセスでファクトを増分アサートし、最終的にルール・エンジンによる推論を参照する場合もあります。したがって、サービスはステートレスとステートフルの両方の相互作用をサポートしています。
このような様々なデシジョン・コンポーネントを作成できます。
詳細は、『Oracle Business Process Managementによるビジネス・ルールの設計』を参照してください。
25.4.5 ビジネス・ルール・ディクショナリ作成時の処理内容
アプリケーション、プロジェクトおよびルール・ディクショナリを作成すると、Oracle JDeveloperの構造ペインにルール・ディクショナリが表示され、メイン・キャンバスにルール・デザイナが開きます。
「ビジネス・ルールの作成」ダイアログの一環として選択した既存のディクショナリまたは新規ルール・ディクショナリは、事前にロードされている次のデータを使用して作成されます。
-
ビジネス・ルールの入力および出力情報に基づいたXMLファクト・タイプ・モデル。
-
ルールまたはデシジョン表を追加して完成させる必要があるルールセット。既存のディクショナリでは、インポート・オプションを使用して、ルールまたはデシジョン表がすでに組み込まれているディクショナリを指定します。
-
デシジョン・コンポーネントの入力および出力が規定されているサービス・コンポーネント。
-
ルール・ディクショナリのデシジョン・コンポーネント、およびBPELプロセスへのワイヤ。
ノート:
ビジネス・ルールの入出力を作成すると、関連ディクショナリに作成されるXMLファクト・タイプには、「ビジネス・ルールの作成」ダイアログで指定した入出力のスキーマ・タイプに基づいて名前が指定されます。入力と出力のスキーマ・タイプを指定すると、ルール・デザイナでは、入力と出力のタイプ選択に関連するファクト・タイプと別名が定義されます。入力と出力の両方に単一のタイプを使用した場合にのみ、デシジョン・コンポーネントで単一のファクトが作成され、ルール・デザイナの「ファクト」タブに表示されます。このファクトには、指定したファクト・タイプが示され、入力変数名と出力変数名を連結した別名が使用されます。ファクト・タイプのデフォルトの命名方式を使用しない場合は、この別名をルール・デザイナで変更できます。
25.4.6 BPELプロセスでのビジネス・ルールの起動に関する必知事項
ビジネス・ルールをBPELプロセスに追加すると、Oracle JDeveloperによって、指定の入力情報を使用したOracle Business Rulesのコールと、結果が格納された出力の取得をサポートするデシジョン・サービスが作成されます。デシジョン・サービスは、実行時にWebサービスとしてOracle Business Rulesエンジンへのアクセスを提供します。詳細は、『Oracle Business Process Managementによるビジネス・ルールの設計』を参照してください。
25.4.7 デシジョン・コンポーネントのステートフル操作に関する必知事項
ビジネス・ルール・サービス・エンジンで実行されるデシジョン・コンポーネントは、ステートフルまたはステートレス操作をサポートしています。これら2つの操作モードの切替えは、「ビジネス・ルールの作成」ダイアログの「セッションのリセット」チェック・ボックスで提供されています。
デフォルトでは、「セッションのリセット」チェック・ボックスが選択されており、これはステートレス操作を示します。ステートレス操作とは、実行時にデシジョン・コンポーネントが起動した後、ルール・セッションがリリースされることを意味します。
「セッションのリセット」チェック・ボックスの選択が解除されている場合は、基礎となるOracle Business Rulesオブジェクトが独立した場所にあるビジネス・ルール・サービス・エンジンのメモリーに保持されます(したがって、オブジェクトは操作終了時にルール・セッション・プールに返されません)。その後のデシジョン・コンポーネントの使用では、callFunctionStateful
の起動以降にキャッシュされたすべてのRuleSessionオブジェクトとその状態の情報が再利用され、callFunctionStateless
操作の終了後にルール・セッション・プールにリリースされて戻されます。したがって、「セッションのリセット」の選択が解除されている場合は、後続リクエストのためにルール・セッションが保存され、同じBPELプロセスからの一連のデシジョン・サービスの起動が常にステートレス起動で終了する必要があります。
25.5 SOAコンポジット・アプリケーションへのビジネス・ルールの追加
Oracle Business RulesをSOAコンポジット・アプリケーションで使用するには、アプリケーションを作成してビジネス・ルールを追加します。
ビジネス・ルール・サービス・コンポーネントを使用して、SOAコンポジット・アプリケーションとビジネス・ルールを統合できます。これにより、ビジネス・ルール・ディクショナリが作成され、ビジネス・ルールを実行し、ルールに基づいてビジネス上の決定を下すことができます。
Oracle JDeveloperでプロジェクトを作成した後は、そのプロジェクト内にビジネス・ルール・サービス・コンポーネントを作成する必要があります。ビジネス・ルールを追加する際、入力変数および出力変数を作成して、サービス・コンポーネントに入力を提供し、サービス・コンポーネントから結果を取得できます。
ビジネス・ルールをOracle JDeveloperで使用する手順は、次のとおりです。
-
ビジネス・ルール・サービス・コンポーネントを追加します。
-
サービス・コンポーネントの入力変数および出力変数を作成します。
-
Oracle Business Rulesディクショナリの作成
25.5.1 SOAコンポジット・アプリケーションへのビジネス・ルールの追加方法
SOAコンポジット・アプリケーションでOracle Business Rulesを使用するには、Oracle JDeveloperを使用してアプリケーションとプロジェクトを作成し、ビジネス・ルール・コンポーネントを追加します。
ビジネス・ルールを使用するSOAアプリケーションを作成するには:
25.5.1.3 オプションを設定してデシジョン・サービスとビジネス・ルール・ディクショナリを作成する方法
デシジョン・サービスとビジネス・ルール・ディクショナリを作成するには:
図25-17 SOAコンポジット・アプリケーションの新規ディクショナリが表示されているルール・デザイナ
「図25-17 SOAコンポジット・アプリケーションの新規ディクショナリが表示されているルール・デザイナ」の説明
ルール・デザイナの詳細は、『Oracle Business Process Managementによるビジネス・ルールの設計』を参照してください。
SOAインストールには、動詞ルールおよびビジネス・フレーズがないことに注意してください。これはBPMの機能です。
25.6 コンポジット・アプリケーションでのビジネス・ルールの実行
ビジネス・ルールは、SOAコンポジット・アプリケーションのデシジョン・コンポーネントの一部として実行します。ビジネス・ルールは、ビジネス・ルール・サービス・エンジンによって実行されます。
Oracle Enterprise Manager Fusion Middleware Controlを使用して、ビジネス・ルール・サービス・エンジンを監視したり、デシジョン・コンポーネントが含まれているSOAコンポジット・アプリケーションをテストできます。詳細は、『Oracle SOA SuiteおよびOracle Business Process Management Suiteの管理』を参照してください。
25.6.1 スタンドアロン・デシジョン・サービス・コンポーネントのテストに関する必知事項
25.7 ビジネス・ルールとOracle ADF Business Componentsファクト・タイプの使用
Oracle ADF Business Componentsファクト・タイプおよびActionTypes
は、ビジネス・ルール・サービス・エンジンから使用できます。通常、デシジョン・コンポーネントはSOAコンポジット内で使用され、BPELコンポーネントおよびXMLタイプに関するOracle Business Rulesのルールに接続できます。ビジネス・ルール・サービス・エンジンは、XMLスキーマ・タイプのインスタンスを含むペイロードが指定されたWebサービスとしてコールされ、同様の方法でレスポンスを返します。
Oracle ADF Business Componentsファクト・タイプはデシジョン・コンポーネントから使用することもできます。Oracle ADF Business Componentsファクト・タイプ・インスタンスをロードしてビジネス・ルール・サービス・エンジンに渡すかわりに、Oracle ADF Business Componentsビュー・オブジェクト行のロード方法を記述した構成情報を指定してビジネス・ルール・サービス・エンジンをコールします。その結果、DecisionPointDictionary
の特別なOracle Business Rulesデシジョン関数およびOracle Business Rules SDKデシジョン・ポイントAPIのクラスによって行がロードされ、Oracle ADF Business Componentsファクト・タイプ・インスタンスがアサートされます。Oracle ADF Business Componentsファクト・タイプを使用する場合は、基礎となるデータベース行を更新するようなOracle ADF Business Componentsファクト・タイプ・インスタンスの変更など、操作に影響を与えるActionTypeから継承するユーザー定義Javaクラスを使用するルールを記述します。
デシジョン・コンポーネントには、入力としてXML文書が必要です。Oracle Business Rulesデシジョン・ポイント・ディクショナリには、この入力として機能するSimpleDecisionPointInput
というXMLファクト・タイプが用意されています。ビジネス・ルール・サービス・コンポーネントには、Oracle ADF Business Componentsの主キーが渡されます。ビジネス・ルール・サービス・コンポーネントはユーザー定義のデシジョン関数を起動します。このデシジョン関数は、Oracle ADF Business Componentsビュー・オブジェクト・インスタンスをロードし、ルール・エンジンでアサートし、結果を次の順にマーシャリングします。
-
DecisionPointDictionary.DecisionPoint_Preprocessing_Webserviceルールセット: 事前処理ルールセットがデータベースからビジネス・コンポーネントを読み取り、ファクトとしてアサートします。
-
ユーザー定義ルールセット: ユーザー・ルールセットがこれらのファクトを照合し、ビジネス・コンポーネントを更新するために
ActionType
を拡張するファクトをアサートします。 -
DecisionPointDictionary.DecisionPoint_Postprocessing_Webserviceルールセット: 実際の更新は、事後処理ルールセットによって実行されます。
ActionTypes
の使用はオプションです。
ビジネス・ルール・サービス・エンジンからOracle ADF Business Componentsファクト・タイプおよびActionTypes
を使用する方法の詳細は、Oracle SOA Suiteサンプルに使用可能なルール・デザイナ固有のサンプルのソース・コードを参照してください。