扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
实际上客户端采用哪种调用方式是与接口类型有密切的关系。当提供的接口类型是WSDL类型的,那么客户端的调用方式只能是动态调用方式。由于WSDL是SCA模型中主要的接口方式,这样就导致动态调用方式在SCA编程模型中非常普遍。但是如果提供的接口类型时Java类型的,那么客户端的调用方式可以是动态调用方式,也可以是静态调用方式。
1.5 SCA的第一个例子――HelloWorld
与学习一种语言一样,在初步了解一些基本概念之后,您是不是迫不及待的想自己动手写点东西了?让我们一起来写一个"SCA版"的HelloWorld。我们需要的开发环境就是一个WebSphere Integration Developer V6.0(WID),与IBM的许多其它的开发工具类似,这也是一个基于Eclipse 3.0的开发工具。下面简单描述一下WID与IBM其它开发工具如Rational Application Developer(RAD),Rational Software Architecture(RSA),WebSphere Business Modeler等工具的区别。如果采用基于角色的开发方式,我们一般可以把集成项目的主要开发人员分为下面四大类:业务分析人员,集成开发人员,软件架构师,J2EE/JAVA应用开发人员。他们的主要职责、技术要求和推荐使用的工具可以参见下表:
由上表可知,WID是一个主要针对集成开发人员的工具。除了专门的集成功能之外,WID工具也包含了RAD中的大部分功能。为了便于集成应用的测试,这个开发工具集成了一个测试环境,即WebSphere Process Server V6.0的运行环境。
这个例子的主要目的是帮助大家进一步理解前面描述的那些SCA基本概念。在HelloWorld应用模块中,我们会构建一个用Java实现的SCA组件,其接口为HelloWorldInterface.wsdl,其实现代码为HelloWorldImpl.java。为了使SCA模块外部的JSP文件可以调用这个SCA组件,需要一个Standalone Reference。在模块外部,我们构建一个index.jsp文件通过Standalone Reference来调用HelloWorld服务组件,并在页面上把调用结果显式出来。整个HelloWorld应用的基本图示如下:
图 7: HelloWorld 应用
1.5.1 构建的基本步骤
下面给出创建HelloWorld例子的基本步骤:
1. 创建模块。打开WID,切换到Business Integration透视图,新建一个模块,名称为HelloWorld。
2. 创建接口。通过点击HelloWorld模块左边的"+"号展开,选择"Interface",然后通过右键创建一个接口,名称为HelloWorldInterface。图示如下:
HelloWorld接口包含一个sengMessage操作,输入为一个名为message的字符串,输出一个名为status的字符串。可以通过点击接口编辑器上方的 按钮来添加一个操作。通过 和 分别来添加输入和输出参数。图示如下:
3. 创建服务组件。双击打开HelloWorld模块的图形化编辑器,然后在控制面板上把Java组件图标 拖拉到编辑器中即生成一个Java服务组件,并把名称改为HelloWorld。如下图所示:
通过点击 按钮为HelloWorld组件选择一个接口,即我们前面定义的HelloWorldInterface。
通过双击上图中的HelloWorld组件,WID会自动生成HelloWorld组件实现类的基本框架HelloWorldImpl.java。如下图所示:
上图中高亮处显示的代码行就是我们可以给sendMessage方法添加业务代码的地方。比如,我们可以输入:return message + ". It's our first SCA example!";
4. 创建standalone reference。在工具栏中把 图标拖拉到编辑器中即生成一个standalone reference。如下图所示:
然后把Standalone Reference端点与HelloWorld组件连接起来。工具自动会为Standalone Reference创建一个匹配HelloWorld组件接口的引用。这里要注意的是,向导在自动创建Standalone Reference的引用时会弹出一个窗口询问需要创建一个Java接口类型的引用还是WSDL接口类型的引用。不同类型的接口会使得我们的客户端代码(在本例中是一个名为index.jsp的JSP文件)需要采用不同的调用方式。下面会分析两种不同类型的实现。
5. 生成JSP代码。如果我们在前面的引用接口类型中选择的是WSDL接口。那么Standalone Reference的属性如下图所示:
我们可以看到,引用的名称为HelloWorldInterfacePartner,接口为名称为HelloWorldInterface这个WSDL类型的接口。
如果我们在前面的引用接口类型中选择的是Java接口。那么Standalone Reference的属性如下图所示:
我们可以看到,引用的名称为HelloWorldInterfacePartner,接口为名称为world.hello.hello.world.interface_.HelloWorldInterface这个Java类型的接口。具体JSP代码参考下面的客户端代码分析部分。
6. 检查生成的项目。如果把WID切换到J2EE透视图的导航视图中,我们可以看到与HelloWorld模块对应的J2EE项目。J2EE企业项目为HelloWorldApp,其包含EJB项目HelloWorldEJB,Web项目HelloWorldWeb,J2EE客户端项目HelloWorldEJBClient。另外一个是名为HelloWorld的Java项目,这个项目的内容最终会以一个JAR文件的形式被HelloWorldApp应用使用。上一步中所提到的JSP文件需要在HelloWorldWeb项目中生成。具体如下图所示:
1.5.2 JSP客户端代码片断分析
那么如何在JSP页面中来调用我们的HelloWorld服务组件呢?按照前面的介绍,我们需要通过Standalone Reference来调用。那么我们如何才能得到这个Standalone Reference的引用呢?这里涉及到SCA编程模式中很重要的一个概念,那就是ServiceManager。ServiceManager是一个SCA环境的核心类,全名为com.ibm.websphere.sca.ServiceManager。这个类的作用主要就是能够让客户端去定位一个服务提供方。一般调用的方式是通过ServiceManager的locateService(String serviceRefName)方法。拿到服务之后,客户端就可以调用服务中所提供的方法了。(熟悉J2EE编程的人员可以联系对比JNDI的Lookup方法。)下面分别根据Standalone Reference引用的接口类型来分析主要JSP代码片断。
当接口类型是WSDL接口的情况
1.首先需要在JSP中导入相关的类,主要如下:
<%@ page import="com.ibm.websphere.sca.ServiceManager" %>
<%@ page import="com.ibm.websphere.sca.Service" %>
<%@ page import="commonj.sdo.DataObject" %><%@ page import="commonj.sdo.DataObject" %>
2.生成ServiceManager对象,并拿到相应的服务。
ServiceManager serviceManager = new ServiceManager();
Service service = (Service) serviceManager.locateService("HelloWorldInterfacePartner");
这里locateService()方法中的参数是standalone reference的实际名称。从某种程度上我们可以把外部的JSP/Servlet的Java代码看成是Standalone reference的实现,这样来理解服务组件之间的相互调用。
3.调用服务的方法。
String msg = request.getParameter("message");
DataObject resp = (DataObject) service.invoke("sendMessage",msg);
由于我们这里使用的是WSDL接口类型,因此返回结果是以DataObject的形式存在。
4. 显式得到的结果。
<%=resp.getString("status")%><%=resp.getString("status")%>
通过调用DataObject的getString方法,我们拿到实际的返回结果,名为status的字符串。
当接口类型是Java接口的情况
1.首先需要在JSP中导入相关的类,主要如下:
<%@ page import="com.ibm.websphere.sca.ServiceManager" %>
<%@ page import="com.ibm.websphere.sca.Service" %>
<%@ page import="world.hello.hello.world.interface_.HelloWorldInterface" %><%@ page import="world.hello.hello.world.interface_.HelloWorldInterface" %>
2.生成ServiceManager对象,并拿到相应的服务。
ServiceManager serviceManager = new ServiceManager();
HelloWorldInterface service =
(HelloWorldInterface) serviceManager.locateService("HelloWorldInterfacePartner");
由于Standalone Reference的接口变成了Java接口,因此这里返回的服务可以直接造型成HelloWorldInterface类型。
3.调用服务的方法。
String msg = request.getParameter("message");
String resp = service.sendMessage(msg);
由于我们这里使用的是Java接口类型,因此调用的方式就是正常的Java接口调用。
4. 显式得到的结果。
<%=resp%><%=resp%>
由于静态调用方式得到的就是实际定义的类型,因此这里字符串的显式比较简单。
具体实际项目的代码请参考本文附的项目交换文件包。
1.6 结束语
本文介绍了SCA的主要目的和一些基本的概念,并展示了一个最为简单的服务组件例子。从上面的讨论我们可以看到,SCA不但解决了统一调用的问题,而且提供了一个服务组件架构。这个服务组件架构将在构建面向服务的架构中起到举足轻重的作用,并在IBM的许多产品中会有所体现。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者