コンポーネントの呼び出し

モジュールを含むコンポーネントは、WebSphere Process Server クラスターの任意のノード上でコンポーネントを使用することができます。

始める前に

コンポーネントを呼び出す前に、WebSphere® Process Server に、コンポーネントを含むモジュールがインストールされていることを確認してください。

このタスクを使用する理由とその時期

コンポーネントは、コンポーネントの名前を使用し、コンポーネントに適したデータ型を渡すことによって、WebSphere Process Server クラスター内で使用可能なすべてのサービス・コンポーネントを使用することができます。この環境内でコンポーネントを呼び出すには、必要なコンポーネントを見つけてから、そのコンポーネントへの参照を作成する操作が必要です。
注: モジュール内のコンポーネントは、同一のモジュール内のコンポーネントを呼び出すことができ、これはモジュール内呼び出しと呼ばれます。 提供側コンポーネント内のインターフェースをエクスポートし、呼び出し側コンポーネント内でインターフェースをインポートすることによって、外部呼び出し (モジュール内呼び出し) をインプリメントしてください。
重要: 呼び出し側モジュールが稼動するサーバーと異なるサーバー上に存在するコンポーネントを呼び出す場合は、サーバーへの追加構成を実行する必要があります。必要な構成は、コンポーネントが非同期に呼び出されるか、同期して呼び出されるかによって異なります。この場合のアプリケーション・サーバーの構成方法は、関連タスクで説明されています。

このタスクのステップ

  1. 呼び出し側モジュールに必要なコンポーネントを判別します。

    コンポーネント内のインターフェースの名前と、そのインターフェースに必要なデータ型を書き留めます。

  2. データ・オブジェクトを定義します。

    入力または戻りは Java™ クラスでかまいませんが、サービス・データ・オブジェクトが最適です。

  3. コンポーネントを探します。
    1. ServiceManager クラスを使用して、呼び出し側モジュールが使用できる参照を取得します。
    2. locateService() メソッドを使用して、コンポーネントを探します。

      インターフェースは、コンポーネントに応じて、Web サービス記述言語 (WSDL) ポート・タイプまたは Java インターフェースのいずれかを使用することができます。

  4. コンポーネントを同期式、または非同期に呼び出します。

    Java インターフェースを使用してコンポーネントを呼び出すことも、 invoke() メソッドを使用してコンポーネントを動的に呼び出すこともできます。

  5. 戻り値を処理します。

    コンポーネントが例外を生成することがあるので、クライアントでは例外の処理が可能である必要があります。

コンポーネントの呼び出し例

コンポーネントの呼び出し例

次の例では、 ServiceManager クラスを作成します。
ServiceManager serviceManager = new ServiceManager();
以下の例は、 ServiceManager クラスを使用して、コンポーネントの参照を含んでいるファイルからコンポーネントのリストを取得します。
InputStream myReferences = new FileInputStream("MyReferences.references");
ServiceManager serviceManager = new ServiceManager(myReferences);
以下のコードは、StockQuote Java インターフェースをインプリメントするコンポーネントを探します。
StockQuote stockQuote = (StockQuote)serviceManager.locateService("stockQuote");
以下のコードは、Java または WSDL ポート・タイプ・インターフェースをインプリメントするコンポーネントを探します。呼び出し側モジュールは、Service インターフェースを使用して、コンポーネントと対話します。
ヒント: コンポーネントが Java インターフェースをインプリメントする場合は、 コンポーネントをインターフェースまたは invoke() メソッドのいずれかを使用して呼び出すことができます。
Service stockQuote = (Service)serviceManager.locateService("stockQuote");
次の例は、別のコンポーネントを呼び出すコード MyValue を示しています。
public class MyValueImpl implements MyValue {

	public float myValue throws MyValueException {
		
		ServiceManager serviceManager = new ServiceManager();

	    // variables
	        Customer customer = null;
	        float quote = 0;
	        float value = 0;

	    // invoke
	        CustomerInfo cInfo =
						(CustomerInfo)serviceManager.locateService("customerInfo");
	        customer = cInfo.getCustomerInfo(customerID);

	    if (customer.getErrorMsg().equals("")) {

	        // invoke
	    		StockQuoteAsync sQuote =
						(StockQuoteAsync)serviceManager.locateService("stockQuote");
	    		Ticket ticket =  sQuote.getQuoteAsync(customer.getSymbol());
				// … do something else …
	    		quote =  sQuote.getQuoteResponse(ticket, Service.WAIT);

	        // assign
	        	value = quote * customer.getNumShares();
	    } else {

	        // throw
	       	throw new MyValueException(customer.getErrorMsg());
	    }
	    // reply
	        return value;
	}
}

次の作業

呼び出し側モジュールの参照とコンポーネントのインターフェースの間のワイヤーを構成します。

コンポーネントの動的呼び出し

Web サービス記述言語 (WSDL) ポート・タイプ・インターフェースを指定したコンポーネントをモジュールから呼び出す場合、モジュールは invoke() メソッドを使用して、そのコンポーネントを動的に呼び出す必要があります。

始める前に

この操作では、呼び出し側コンポーネントがコンポーネントを動的に呼び出すことが前提となっています。

このタスクを使用する理由とその時期

WSDL ポート・タイプ・インターフェースの場合は、呼び出し側コンポーネントは invoke() メソッドを使用して、コンポーネントを呼び出す必要があります。呼び出し側モジュールから、この方法で Java インターフェースを指定したコンポーネントも呼び出すことができます。

このタスクのステップ

  1. 必要なコンポーネントを含んでいるモジュールを判別します。
  2. コンポーネントが必要とする配列を判別します。
    入力配列は、次の 3 つのタイプのいずれかです。
    • 大文字の Java プリミティブ型、またはこの型の配列
    • 通常の Java クラス、またはクラスの配列
    • サービス・データ・オブジェクト (SDO)
  3. コンポーネントからの応答を収容する配列を定義します。

    応答配列は、入力配列と同じタイプでかまいません。

  4. invoke() メソッドを使用して、必要なコンポーネントを呼び出し、配列オブジェクトをそのコンポーネントに渡します。
  5. 結果を処理します。

コンポーネントの動的呼び出しの例

コンポーネントの動的呼び出しの例

以下の例では、モジュールは invoke() メソッドを使用して、大文字の Java プリミティブ・データ型を使用するコンポーネントを呼び出します。
Service service = (Service)serviceManager.locateService("multiParamInf");
		
		Reference reference = service.getReference();

		OperationType methodMultiType =
				reference.getOperationType("methodWithMultiParameter");

		Type t = methodMultiType.getInputType();

		BOFactory boFactory = (BOFactory)serviceManager.locateService
				("com/ibm/websphere/bo/BOFactory");

		DataObject paramObject = boFactory.createbyType(t);

		paramObject.set(0,"input1")
		paramObject.set(1,"input2")
		paramObject.set(2,"input3")

		service.invoke("methodMultiParamater",paramObject);

次の例では、WSDL ポート・タイプ・インターフェースをターゲットとして持つ呼び出しメソッドを使用します。

Service serviceOne = (Service)serviceManager.locateService("multiParamInfWSDL");
	
	DataObject dob = factory.create("http://MultiCallWSServerOne/bos", "SameBO");
			dob.setString("attribute1", stringArg);

	DataObject wrapBo = factory.createByElement
		("http://MultiCallWSServerOne/wsdl/ServerOneInf", "methodOne");
			wrapBo.set("input1", dob); //wrapBo encapsulates all the parameters of methodOne
			wrapBo.set("input2", "XXXX");
			wrapBo.set("input3", "yyyy");

	DataObject resBo= (DataObject)serviceOne.invoke("methodOne", wrapBo);

(c) Copyright IBM Corporation 2005, 2006. All rights reserved.
(c) Copyright IBM Japan 2006
このインフォメーション・センターでは、Eclipse テクノロジー (http://www.eclipse.org) が採用されています。