コントロール ファクトリ : コントロールをまとめて管理する
このトピックでは、Web サービスからコントロールのインスタンスをまとめて動的に管理する方法であるコントロール ファクトリについて説明します。
このトピックを読む前に、WebLogic Workshop のコントロールについて理解しておく必要があります。WebLogic Workshop のコントロールの詳細については、コントロール : Web サービスからリソースを使用するを参照してください。
コントロール ファクトリは、コントロールとの n 方向の関係を 1 つの Web サービスで管理することを可能にします。たとえば、受け取った発注書の品目をそれぞれに分けて、ベンダごとに別々のサービス コントロールを使用して会話を同時に実行する Web サービスが考えられます。
MyControl というコントロール インタフェースがあるとすると、WebLogic Server では、次に示すようにごく簡単な形式の MyControlFactory というコントロール ファクトリ インタフェースが生成されます。
interface MyControlFactory { MyControl create(); }
暗黙的なクラスは、コントロール クラスとして同じパッケージ内に置かれます。たとえば、コントロール インタフェースの完全クラス名が com.myco.mypackage.MyControl の場合、ファクトリの完全クラス名は com.myco.mypackage.MyControlFactory となります。名前の衝突がある場合、つまり MyControlFactory というクラスをユーザが明示的に作成していた場合、自動ファクトリ クラスは生成されません。
コントロール ファクトリ インスタンスは、コントロール インスタンスと同じように JWS ファイルに入れることができます。単一のコントロールの宣言と同じように、ファクトリ宣言の前に Javadoc タグを置きます。
たとえば、通常のサービス コントロールは次のように宣言します。
/** * @jws:control */ MyServiceControl oneService;
一方、サービス コントロール ファクトリは次のように宣言します。
/** * @jws:control */ MyServiceControlFactory manyServices;
ファクトリに対して許可されるコメントと必須のコメントは、対応するコントロールの場合とまったく同じです。ファクトリは、ファクトリによって作成されるどのインスタンスにもそのコメントが含まれているかのように動作します。
Web サービスをコントロール ファクトリの宣言に含めると、新しいコントロール インスタンスは次のように作成できます。
// creates one control MyServiceControl c = manyServices.create();
// then you can just use the control, store it, or whatever. c.someMethot();
// For example, let's associate a name with the service... serviceMap.put("First Service", c);
ファクトリ クラスは、次のように、必要に応じて自動的に生成されます。FooFactory というクラスは次のように解決されます。
クラスは通常のとおり解決されます。つまり、FooFactory の定義を含む CLASS ファイル、JAVA ファイル、または CTRL ファイルが存在する場合、明示的に定義されているクラスが使用されます。
明示的なクラス FooFactory がない場合、クラス名は「Factory」で終わっているので、サフィックスを除いた Foo という明示的なクラスが同じパッケージ内で検索されます。
Foo は見つかったが、コントロール インタフェースを実装していない、つまり @jws:control というコメントが記述されていない場合は、Foo が見つからなかった場合のように、エラーと見なされます。
ただし、Foo が見つかり、コントロール インタフェースを実装している場合は、インタフェース FooFactory が自動的に生成されます。インタフェースには Foo クラスを返す create() メソッドのみが含まれます。
コントロールのすべてのインスタンスは、インスタンスを作成した Web サービスのインスタンスが破棄されると、破棄されます。
1 つのコントロール ファクトリで複数のコントロールを作成することが可能であり、そのインスタンス名はすべて同じになるため、コールバックを送信したコントロール インスタンスを特定するためのメカニズムが用意されています。
たとえば、上記の oneService 例では、イベント ハンドラは次の形式を取っています。
void oneService_onSomeCallback(String arg) { System.out.println("arg is " + arg); }
ファクトリで作成したコントロール インスタンスからコールバックを受け取るコールバック ハンドラの場合、コールバック ハンドラは、コールバックの通常のパラメータに加えて、特別な最初のパラメータを取らなければなりません。最初のパラメータはコントロール インタフェースとして型指定されているので、コントロール インスタンスはイベント ハンドラに渡されます。
manyServices ファクトリ コールバック ハンドラは次のようになります。
void manyServices_onSomeCallback(MyServiceControl c, String arg) { // let's retrieve the remembered name associated with the control String serviceName = (String)serviceMap.get(c);
// and print it out System.out.println("Event received from " + serviceName); }