|
| 注意: | Oracle Tuxedo CORBA JavaクライアントとOracle Tuxedo CORBA JavaクライアントORBはTuxedo 8.1で非推奨になり、サポートされなくなりました。すべてのOracle Tuxedo CORBA JavaクライアントおよびOracle Tuxedo CORBA JavaクライアントORBのテキスト・リファレンスとコード・サンプルは、サード・パーティのJava ORBライブラリを実装または実行する際の参考や、プログラマの参照用としてのみ使用してください。 |
| 注意: | サード・パーティのCORBA Java ORBのテクニカル・サポートは、各ベンダーによって提供されます。Oracle Tuxedoでは、サード・パーティのCORBA Java ORBに関する技術的なサポートやドキュメントは提供していません。 |
CORBAネーム・サービスには、CORBAネーム・サービスのサーバー・プロセスの管理、ネームスペースの名前のバインドとアンバインド、およびネームスペースの内容の表示のための次のコマンドが用意されています。
CORBAネーム・サービスのサーバー・プロセスを制御します。
cns CLOPT="[-A] [servopts options] --
[-b bucketcount]
[-c]
[-d]
[-f filename]
[-M maxiterators]
[-p [persiststoragefilename] ]"
CORBAネーム・サービスのサーバー・プロセスでは、CORBA CosNaming準拠のネーム・サービスが提供されます。使用するOracle Tuxedoアプリケーションに対して、そのOracle Tuxedoアプリケーションで使用される他のサーバー・プロセスと同様に、CORBAネーム・サービスのサーバー・プロセスとそのオプションをUBBCONFIGファイルで定義する必要があります。UBBCONFIGファイルのCLOPTパラメータの2つのダッシュ(--)の後に、cnsコマンドライン・オプションを入力します。コマンドライン・オプションは次のとおりです。
-b bucketcount
-c
-p コマンドライン・オプションは、 -c コマンドライン・オプションを指定する場合に指定する必要があります。
-d
-pコマンドライン・オプションは、-dコマンドラインオプションを指定する場合に指定する必要があります。
-f filename
-M maxiterators
CosNaming::NamingContext::list()メソッドを使用する場合に作成されます。バインディング・イテレータを使用してクライアント・アプリケーションを実行した後にバインディング・イテレータを削除するには、クライアント・アプリケーションでCosNaming::BindingIterator::destroy()メソッドを使用する必要があります。クライアント・アプリケーションがバインディング・イテレータを明示的に削除しなかった場合は、-Mコマンドライン・オプションで指定した値に数が達すると、CORBAネーム・サービスのサーバー・プロセスによってバインディング・イテレータが削除されます。バインディング・イテレータの最大数に達してから、新しいバインディング・イテレータを作成しようとすると、クライアント・アプリケーションで使用中のバインディング・イテレータがCORBAネーム・サービスのサーバー・プロセスによって破棄されます。バインディング・イテレータは、使用履歴の最も古いアルゴリズムに基づいて削除されます。デフォルト値は20です。値を0にすると、バインディング・イテレータの数に上限がなくなります(バインディング・イテレータはCORBAネーム・サービスのサーバー・プロセスによって破棄されず、関連するメモリーも解放されません)。0の値を指定した場合は、クライアント・アプリケーションでCosNaming::BindingIterator::destroy()メソッドを使用して、未使用のバインディング・イテレータを明示的に削除する必要があります。
-p [persistentstoragefilename]
CNS_PERSIST_FILE環境変数の値が使用されます。CNS_PERSIST_FILE環境変数が設定されていない場合は、次のファイルが使用されます。
%APPDIR%\cnspersist.dat UNIX $APPDIR/cnspersist.dat 永続ストレージ・ファイルは、CORBAネーム・サービスのサーバー・プロセスの開始時に読み込まれます。永続ストレージ・ファイルは、ネームスペースに変更が加えられると追加されます。新しいネームスペースを作成する場合は、既存の永続ストレージ・ファイルを削除するか、CORBAネーム・サービスのサーバー・プロセスに新しい永続ストレージ・ファイルを作成する必要があります。
アプリケーション・オブジェクトおよびネーミング・コンテキストをネームスペースにバインドします。
| 注意: | cnsbindコマンドは、CosNamingインタフェースとやり取りします。このコマンドを使用するには、CORBAネーム・サービスのサーバー・プロセスを実行している必要があります。 |
cnsbind
[-C]
[-f root_context_filename]
[-h]
[-N]
[-o ior_filename]
[-r]
[-T TObjAddr]
bind_name
cnsbindコマンドでは、CORBA CosNamingインタフェースを使用して新しいアプリケーション・オブジェクトとネーミング・コンテキスト・オブジェクトをネームスペースにバインドします。このコマンドでは、連合型ネームスペースを簡単に作成できます。cnsbindコマンドの起動時に例外が戻された場合は、コマンドが終了し、対応するメッセージが表示されます。
cnsbindコマンドのコマンドライン・オプションは次のとおりです。
-C
cnsbindコマンドで、bind_nameを名前に使用し、-oコマンドライン・オプションで指定したior_filenameを使用してコンテキストを作成するように指定します。-Cコマンドライン・オプションは、任意のネームスペースのネーミング・コンテキスト・オブジェクトを、指定したネームスペースに連合するのに使用されます。
-f root_context_filename
Tobj_Bootstrap::resolve_initial_references()メソッドを使用して、指定したOracle TuxedoドメインでCORBAネーム・サービスのサーバー・プロセスをロケートします。IORのホストとポートはTOBJADDRの値に一致している必要があります。このコマンドライン・オプションは、TOBJADDR環境変数の設定よりも優先されます。コマンドライン・オプションが指定されていない場合は、TOBJADDR環境変数が使用されます。
-h
-N
cnsbindコマンドによって作成されているため、-oコマンドライン・オプションを-Nコマンドライン・オプションとともに指定する必要はありません。-oコマンドライン・オプションを-Nコマンドライン・オプションとともに使用しても、-oコマンドライン・オプションの情報は無視されます。
-o ior_filename
-fコマンドライン・オプションで指定したネームスペースにバインドするオブジェクトのIORを格納するファイルを指定します。-Cコマンドライン・オプションが指定されている場合は、ncontext型のオブジェクトが作成され、指定されていない場合は、nobject型のオブジェクトが作成されます。
-r
-rコマンドライン・オプションを指定しないcnsbindコマンドのデフォルトの動作では、指定したオブジェクトのバインディングがすでに存在する場合に、AlreadyBound例外が発生します。cnsbindコマンドの呼出し時に、AlreadyBoundまたはその他の例外が戻されると、コマンドが終了し、"Error, already bound"のメッセージが表示されます。
T TObjAddr
cnsbindコマンドでログインする必要があります。このコマンドライン・オプションは、TOBJADDR環境変数の設定より優先されます。コマンドライン・オプションが指定されていない場合は、TOBJADDR環境変数の値が使用されます。コマンドライン・オプションが指定されておらず、TOBJADDRが設定されていない場合、プログラムはネイティブ・クライアントとして実行され、TGIOPプロトコルがロードされます。
bind_name
Tobj_Bootstrap::resolve_initial_referencesメソッドから取得されるルート・ネーミング・コンテキスト、または-fコマンドライン・オプションから取得される文字列化されたIORで示されるネーミング・コンテキストに基づいて、ネームスペースに追加されるアプリケーション・オブジェクトまたはネーミング・コンテキスト・オブジェクトにバインドされる名前を指定します。bind_name文字列は、Object Management Group (OMG)のインターオペラブル・ネーム・サービス(INS)仕様で指定した名前の文字列の形式に準拠する必要があります。
次の例は、アプリケーション・オブジェクトのバインディングを示しています。
cnsbind -o ./app_obj_ior.txt MyContext/AppObject1
次の例は、ネーミング・コンテキストのバインディングを示しています。
cnsbind -N MyContext/CtxObject1
次の例は、別のネームスペースへのフェデレーション・ポイントのバインディングを示しています。
cnsbind -C -o ./remote_ior.txt MyContext/RemoteNSCtx1
| 注意: | cnslsコマンドは、CosNamingインタフェースとやり取りします。このコマンドを使用するには、CORBAネーム・サービスのサーバー・プロセスを実行している必要があります。 |
cnsls
[-f root_context_filename]
[-h]
[-s]
[-R]
[-T TobjAddr]
[resolve_name]
cnslsコマンドでは、CORBA CosNamingインタフェースを使用してネームスペースの内容を表示します。非印字文字がNameComponentデータ構造体の一部として使用されている場合、cnslsコマンドの動作は未定義です。cnslsコマンドの起動時に例外が発生すると、コマンドが終了し、対応するメッセージが表示されます。
cnslsコマンドのコマンドライン・オプションは次のとおりです。
-f root_context_filename
Tobj_Bootstrap::resolve_initial_references()メソッドを使用して、指定したOracle TuxedoドメインでCORBAネーム・サービスのサーバー・プロセスをロケートします。IORのホストとポートはTObjAddrの値に一致している必要があります。このコマンドライン・オプションは、TOBJADDR環境変数の設定よりも優先されます。コマンドライン・オプションが指定されていない場合は、TOBJADDR環境変数の値が使用されます。
-h
-s
-R
resolve_nameで始まるネームスペースのバインディングを再帰的に表示します。このコマンドライン・オプションをcnslsコマンドに指定すると、このような境界が交差している場合にも何も示されずに境界を越える可能性があります。また、ネームスペース情報に循環が存在する場合に、このコマンドライン・オプションをcnslsコマンドに指定すると、ループに入る可能性があります。
T TObjAddr
cnslsコマンドでログインする必要があります。このコマンドライン・オプションは、TOBJADDR環境変数の設定より優先されます。コマンドライン・オプションが指定されていない場合は、TOBJADDR環境変数が使用されます。
resolve_name
Tobj_Bootstrap::resolve_initial_references()メソッドによって取得されるルート・ネーミング・コンテキスト、または-fコマンドライン・オプションから取得される文字列化されたIORで示されるネーミング・コンテキストに基づいて、ネーム・サービスで解決する名前を指定します。resolve_name文字列は、OMG INS仕様で指定した名前の文字列の形式に準拠する必要があります。バックスラッシュ(\)文字は、名前コンポーネントを区切るのに使用され、ピリオド(.)文字はidフィールドとkindフィールドを区切ります。
cnsls -R MyContext.kind/AnotherContext
[context] MyContext.kind/AnotherContext
[object] Obj1
[object] Obj2
[context] Ctx1
[object] AnotherObject
cnsunbind
[-D]
[-f root_context_filename]
[-h]
[-T TObjAddr]
bind_name
cnsubindコマンドでは、ネームスペースのバインディングを解除します。cnsunbindコマンドの起動時に例外が戻されると、コマンドが終了し、対応するメッセージが表示されます。
cnsunbindコマンドライン・オプションは次のとおりです。
-D
bind_nameにバインドされているネーミング・コンテキストを破棄します。コンテキストの削除時に-Dコマンドライン・オプションを指定しても、コンテキストが別のバインディングの一部になっている場合は孤立しません。このコマンドライン・オプションでは、同時に複数のネーミング・コンテキスト・オブジェクトにバインドされた場合などに、バインディングが保留される可能性があるため、使用する場合は注意してください。
-f root_context_filename
Tobj_Bootstrap::resolve_initial_references()メソッドを使用して、指定したOracle Tuxedoドメイン用のサーバー・プロセスをロケートします。
-h
T TObjAddr
cnsbindコマンドでログインする必要があります。このコマンドライン・オプションは、TOBJADDR環境変数の設定より優先されます。コマンドライン・オプションが指定されていない場合は、TOBJADDR環境変数が使用されます。
bind_name
Tobj_Bootstrap::resolve_initial_references()メソッドから取得されるルート・ネーミング・コンテキスト、または-fコマンドライン・オプションから取得される文字列化されたIORで示されるネーミング・コンテキストに基づいて、ネームスペースから削除されるバインディングの名前を指定します。bind_name文字列は、OMG INS仕様で指定した名前の文字列の形式に準拠する必要があります。
次の例は、ネームスペースのバインディングの解除を示しています。
cnsunbind MyContext/CtxObject1
次の例は、ネームスペースのバインディングの解除、およびバインドされているオブジェクトの破棄を示しています。
cnsunbind -D MyContext/CtxObject1
NULL文字は、id文字列とkind文字列の終端としてのみ使用します(空の文字列は有効とみなされます)。CannotProceed例外をスローしません。
NameService環境オブジェクトは、ネームスペースのルートへの接続に使用できます。NameService環境オブジェクトを使用する場合、オブジェクト・リクエスト・ブローカ(ORB)がネームスペースのルートをロケートします。BootstrapオブジェクトまたはCORBAインターオペラブル・ネーミング・サービス(INS)のブートストラップ処理メカニズムを使用すると、NameService環境オブジェクトへの初期リファレンスを取得できます。OracleクライアントORBを使用する場合は、Oracle専用のメカニズムを使用します。別のベンダーのクライアントORBを使用する場合は、CORBA INSメカニズムを使用します。
ネームスペースへの接続の詳細は、「ステップ3: Oracle Tuxedoネームスペースに接続する」を参照してください。Oracle Tuxedoドメインのブートストラップ処理の詳細は、Oracle Tuxedoオンライン・ドキュメントの『Oracle Tuxedo CORBAプログラミング・リファレンス』の第4章「CORBAブートストラップ処理のプログラミング・リファレンス」を参照してください。
CORBAネーム・サービスでは、次のCosNamingデータ構造体を使用します。
NamingContextオブジェクトは、オブジェクト・リクエスト・ブローカ(ORB)オブジェクトまたは他のNamingContextオブジェクトにバインドされている名前のリストの格納および操作に使用されます。Oracle Tuxedo CORBAクライアント・アプリケーションは、このインタフェースを使用して、コンテキスト内のすべての名前を解決またはリストします。Oracle Tuxedo CORBAサーバー・アプリケーションでは、このオブジェクトを使用して、名前をアプリケーション・オブジェクトまたはネーミング・コンテキスト・オブジェクトにバインドします。リスト2-1は、NamingContextオブジェクトのOMG IDLを示します。
module CosNaming {
interface NamingContext {
void bind(in Name, in Object obj)
raises(NotFound, CannotProceed, InvalidName, AlreadyBound);
void rebind(in Name, in Object obj)
raises(NotFound, CannotProceed, InvalidName);
void bind_context(in Name n, in NamingContext nc)
raises(NotFound, CannotProceed, InvalidName, AlreadyBound);
void rebind_context(in Name n, in NamingContext nc)
raises(NotFound, CannotProceed, InvalidName);
Object resolve(in Name n)
raises(NotFound, CannotProceed, InvalidName);
void unbind(in Name n)
raises(NotFound, CannotProceed, InvalidName);
NamingContext new_context
NamingContext bind_new_context(in Name n)
raises(NotFound, CannotProceed, InvalidName, AlreadyBound);
void destroy()
raises(NotEmpty);
void list(in unsigned long how_many,
out BindingList bl,
out BindingIterator bi);
}
} 最初のNameComponentデータ構造体に関連付けられているコンテキストを解決し、次に新しいコンテキストにオブジェクトをバインドして、指定したオブジェクトを指定の名前にバインドしようとします。
void bind(in Namen, in Objectobj);
n
obj
AlreadyBound
InvalidName
NotFound
bindでバインドされているネーミング・コンテキストは、解決するために複合名が渡されるときに名前解決に参加しません。
このメソッドは、指定したNameがNamingContextオブジェクトに関連付けられている点を除いて、bind()メソッドと同じです。
void bind_context(in Namen, in NamingContextnc);
n
nc
AlreadyBound
InvalidName
NotFound
BAD_PARAM
bind_context()でバインドされているネーミング・コンテキストは、解決するために複合名が渡されるときに名前解決に参加します。
新しいコンテキストを作成し、このコンテキスト内で指定したNameにバインドします。
NamingContext bind_new_context(in Name n); n
AlreadyBound
InvalidName
NotFound
このメソッドでは、CosNaming::NamingContext::new_context()メソッドとCosNaming::NamingContext::bind_context()メソッドを1つのメソッドにまとめます。
新しいNamingContextオブジェクトへの参照を戻します。
NamingContextオブジェクトを削除します。後でNamingContextオブジェクトに対する呼出しを試みると、CORBA::NO_IMPLEMENT例外が発生します。
void destroy(); NotEmpty
このメソッドを使用する前に、NamingContext オブジェクトにバインドされているすべてのすべてのネーム・オブジェクトを、CosNaming::NamingContext::unbind()メソッドを使用してアンバインドしてください。
このネーミング・コンテキストによって格納されているすべてのバインディングを戻します。
void list(in unsigned_longhow_many,
out BindingListbl,
out BindingIteratorbi);
how_many
bl
NameComponentオブジェクトを表すNameを格納するバインディングです)。各Nameは、長さ1の名前のシーケンスである単純な名前です。リスト内のバインディング数がhow_manyの値を超えることはありません。
bi
InvalidName
NotFound
このメソッドでは、名前のバインディングのシーケンスを戻します。blリストに該当するより多くの名前のバインディングが存在する場合は、BindingIteratorオブジェクトが戻されます。BindingIteratorオブジェクトを使用すると、バインディングの次のセットを取得できます。BindingList (C++)オブジェクトでは、リクエストされた番号のバインディングがリストの最後にある場合は、その番号よりも小さい番号のバインディングを戻すことができます。biでNULL参照が戻された場合、blにはすべてのバインディングが格納されています。
新しいネーミング・コンテキストを作成します。新規作成されたコンテキストは、最初はどのNameにもバインドされていません。
NamingContext new_context(); 新しいネーミング・コンテキストをName.にバインドするには、CosNaming::NamingContext::bind_context()メソッドを使用します。
このメソッドは、bind()メソッドと同じです。違いは、rebindメソッドではAlreadyBound例外が発生しないことです。指定したNameがすでに別のオブジェクトにバインドされている場合、そのバインディングは新しいバインディングで置き換えられます。
void rebind(in Namen, in Objectobj);
n
obj
InvalidName
NotFound
Nameまたはそのコンポーネントの1つが見つからなかったことを示します。バインディングがすでに存在するか、バインディングの型が間違っているために例外が発生した場合、例外のrest_of_nameメンバーの長さは1になります。
rebind()でバインドされているネーミング・コンテキストは、解決するために複合名が渡されるときに名前解決に参加しません。
このメソッドは、bind_context()メソッドと同じです。違いは、rebind_contextメソッドではAlreadyBound例外が発生しないことです。指定したNameがすでに別のオブジェクトにバインドされている場合、そのバインディングは新しいバインディングで置き換えられます。
void rebind_context(in Namen, in NamingContextnc);
n
nc
InvalidName
NotFound
rest_of_nameメンバーの長さは1になります。
rebind_contextでバインドされているネーミング・コンテキストは、解決するために複合名が渡されるときに名前解決に参加しません。
Object resolve(in Name n); n
InvalidName
NotFound
指定したNameは、オブジェクトのバインドに使用される名前と正確に一致する必要があります。CORBAネーム・サービスでは、オブジェクトの型を戻しません。オブジェクトを適切な型にナロー変換する操作は、クライアント・アプリケーションで実行します。
bind()メソッドの逆演算を実行し、指定したNameに関連付けられたバインディングを削除します。
void unbind(in Namen);
n
InvalidName
NotFound
このメソッドでは、名前とオブジェクト間のバインディングを削除します。オブジェクトは削除されません。オブジェクトを削除するには、CosNaming::NamingContext::unbind()メソッドを使用してから、CosNaming::NamingContext::destroy()メソッドを使用します。
NamingContextExtオブジェクトでは、CORBAネーム・サービスのURLおよび文字列化された名前を使用するための方法が提供されます。NamingContextExtオブジェクトは、NamingContextオブジェクトから派生したものです。CORBAネーム・サービスのルートはNamingContextExtオブジェクト(ルートはNamingContextオブジェクトでもあります)であることに注意してください。NamingContextExtオブジェクトへの参照を取得するのに特別な操作は必要ありません。リスト2-2は、NamingContextExtオブジェクトのOMG IDLを示しています。
module CosNaming {
interface NamingContextExt : NamingContext {
typedef string StringName;
typedef string Address;
typedef string URLString;
StringName to_string(in Name n)
raises(InvalidName);
Name to_name(in StringName sn)
raises(InvalidName);
exception InvalidAddress {};
URLString to_url(in Address addr, in StringName sn)
raises(InvalidAddress, InvalidName);
Object resolve_str(in StringName n)
raises(NotFound,
CannotProceed,
InvalidName,
AlreadyBound);
}
} 文字列化された名前を取得してNameに変換し、それを解決します。
object resolve_str(in StringNamen);
n
InvalidName
NotFound
CosNaming:NamingContext::resolve()メソッドと同じ方法で解決を実行する便利なメソッドです。このメソッドでは、文字列化された名前をNameオブジェクトではなく引数として受け付けます。文字列化された名前が無効か、メソッドでバインドできない場合は、エラーが戻されます。
文字列化された名前を取得し、Nameオブジェクトを戻します。
Name to_name(in StringNamesn);
sn
InvalidName
このメソッドでは、文字列化された名前を受け付け、Nameオブジェクトを戻します。名前が無効の場合は、エラーが戻されます。
Nameオブジェクトを受け付け、文字列化された名前を戻します。
StringName to_string(in Name n);n
InvalidName
このメソッドでは、Nameを受け付け、文字列化された名前を戻します。名前が無効の場合は、エラーが戻されます。
URLと文字列化された名前を組み合せ、URL文字列を戻します。
CosNaming::NamingContextExt::to_URL()
URLString to_URL(in Addressaddr, in StringNamesn);
addr
sn
InvalidAddress
InvalidName
URLと文字列化された名前を組み合せたURL文字列を戻します。
BindingIterator オブジェクトでは、クライアント・アプリケーションが、NamingContextオブジェクトのlistメソッドで戻されるバインディングのバインドされていないコレクションをたどることができます。BindingIteratorオブジェクトを使用すると、クライアント・アプリケーションは、各呼出しで取得されるバインディングの数を制御できます。BindingIteratorオブジェクトのメソッドの呼出し間でネーミング・コンテキストが変更されると、以降のnext_one()メソッドまたはnext_n()メソッドの呼出しの動作は、実装によって異なります。
クライアント・アプリケーションがBindingIteratorオブジェクトを作成しても、destroyメソッドを呼び出さないと、クライアント・アプリケーションはリソース不足になる場合があります。CORBAネーム・サービスでは、クライアント・アプリケーションに警告することなく、バインディング・イテレータをいつでも破棄できます。BindingIteratorオブジェクトの呼出しでOBJECT_NOT_EXIST例外を予期し、この例外を適切に処理できるようにクライアント・アプリケーションを記述する必要があります。
リスト2-3は、BindingIteratorオブジェクトのOMG IDLを示しています。
module CosNaming {
interface BindingIterator {
boolean next_one(out Binding b);
boolean next_n(in unsigned long how_many,
out BindingList b);
void destroy();
};
} BindingIteratorオブジェクトを破棄し、オブジェクトに関連するメモリーを解放します。このメソッドの呼出しに失敗すると、メモリーの使用量が増加します。
void destroy();
destroyメソッドの呼出し後にクライアント・アプリケーションがBindingIteratorオブジェクトに対する操作を呼び出すと、OBJECT_NOT_EXIST 例外が発生します。
リストからリクエストされたバインディングの番号を格納するBindingListデータ構造体を戻します。戻されるバインディングの番号は、リクエストされた数がリストを超えている場合は、それよりも少なくなります。
boolean next_n(in unsigned_longhow_many, out BindingListbl);
how_many
bl
BAD_PARAM
リストの上限に達した場合にCORBA::FALSEが戻されます。それ以外の場合は、CORBA::TRUEが戻されます。
boolean next_one(out Binding b); b
リストの上限に達した場合にCORBA::FALSEが戻されます。それ以外の場合は、CORBA::TRUEが戻されます。
この項では、CORBAネーム・サービスで発生する例外について説明します。
exception AlreadyBound{}; この例外は、指定した名前にオブジェクトがすでにバインドされている場合に発生します。1つのコンテキストで名前にバインドできるオブジェクトは1つのみです。
exception CannotProceed{};NamingContext cxt
Name rest_of_name
この例外は、予期しない例外が発生して、メソッドで適切に処理できない場合に発生します。
exception InvalidAddress{};exception InvalidName{};Nameが無効の場合に発生します。長さがゼロの名前は無効です。
exception NotEmpty{}; この例外は、バインディングを含むNamingContextオブジェクトでdestroy()メソッドが使用されている場合に発生します。NamingContextオブジェクトは、破棄する前に空になっている必要があります。
exception NotFound{NotFoundReason why; Name rest_of_name;};why
rest_of_name
この例外は、名前のコンポーネントでバインディングを識別しないか、バインディングの型が実行中の操作に対して間違っている場合に発生します。whyパラメータはエラーの理由を示します。rest_of_nameパラメータはエラーの原因を示します。次の原因が表示されます。
|