调用组件

包含模块的组件可以使用 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. 确定该组件所需的数组。
    输入数组可以具有下列三种类型:
    • 大写的 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);

以下示例使用 invoke 方法并将 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.
本信息中心基于 Eclipse 技术(http://www.eclipse.org)。