使用 WebSphere ESB 实现协议转换和数据转换概要.docx

上传人:小飞机 文档编号:5010499 上传时间:2023-05-29 格式:DOCX 页数:26 大小:826.41KB
返回 下载 相关 举报
使用 WebSphere ESB 实现协议转换和数据转换概要.docx_第1页
第1页 / 共26页
使用 WebSphere ESB 实现协议转换和数据转换概要.docx_第2页
第2页 / 共26页
使用 WebSphere ESB 实现协议转换和数据转换概要.docx_第3页
第3页 / 共26页
使用 WebSphere ESB 实现协议转换和数据转换概要.docx_第4页
第4页 / 共26页
使用 WebSphere ESB 实现协议转换和数据转换概要.docx_第5页
第5页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《使用 WebSphere ESB 实现协议转换和数据转换概要.docx》由会员分享,可在线阅读,更多相关《使用 WebSphere ESB 实现协议转换和数据转换概要.docx(26页珍藏版)》请在三一办公上搜索。

1、使用WebSphere ESB实现协议转换和数据转换简介:本文主要介绍如何通过WebSphere ESB实现协议转换和数据转换功能:通过Websphere ESB实现SOAP/HTTP和JMS之间的协议转换;实现JMS Object Message 与 Business Object 之间、以及 Business Object 与 Java Object的数据转换;实现客户端与ESB之间request/response的交互方式, 客户端向ESB发送带有数据对象的请求,ESB请求Web服务后,将结果以数据 对象的形式返回给客户端。引言已有许多文章介绍了如何将xml message传入ESB进行

2、协议转换和数据 转换,而在实际的应用环境中,面向对象的设计会显得更实用些。本文主要介绍 如何基于JMS和WebSphere ESB构建企业服务总线,实现SOAP/HTTP和JMS 之间的协议转换;实现 JMS Object Message, Business Object 及 Java Object 之间的数据转换;以及如何实现通过ESB来实现request/response的交互方 式。示例场景图1:示例场景图1示例展示了一个典型的端到端的SOA场景:(1)Service Provider 以 SOAP/HTTP 方式发布 Web Service,该 Web Service 输入和返回都是J

3、ava Object;(2)客户端以JMS方式去调用这个Web Service,需要经过WehSphere ESB进 行协议转换,WehSphere ESB将客户端的JMS协议转换为服务端需要的 SOAP/HTTP 协议;(3)客户端将 JMS Object Message 发送给 WehSphere ESB, WehSphere ESB 通 过SOAP/HTTP方式请求Web Service。在服务请求的过程中,WehSphere ESB将 客户端传入的 JMS Object Message 转换为 Business Object,又将 Business Object转换为服务端需要的Jav

4、a Object;在服务返回的过程中,WehSphere ESB 将服务端返回的 Java Object 转换为 Business Object,又将 Business Object 转换为客户端能识别的JMS Object Message;(4) 客户端向WebSphere ESB发送请求和接收返回数据分别在两个队列上进 行,客户端只需关注如何将请求的数据转化为JMS Object Message并放入 WehSphere ESB的接收队列,以及如何从WehSphere ESB的发送队列里取出JMS Object Message并解析所需的结果即可。本示例是基于WID6.0.2和ESB6.0

5、.2实现的,下面来详细介绍如何实现这一示 例场景。创建 Service provider建立工程 BookOrderService,来担任 Service Provider。该 service 提 供了一个接口方法order(),其输入和输出分别是java object: OrderRequest 和OrderResponse,将此方法发布成Web Service,如下:1. 建立一个 Dynamic Web Project: BookOrderService2. 添加对象类、接口和实现类对象类:Address.java包含属性:private String street;private St

6、ring city;OrderRequest.java包含属性:private String name;private int count;private Address address;OrderResponse.java包含属性:private double totalPrice;接口类:BookOrderIf.java public interface BookOrderIf ( public OrderResponse order(OrderRequest req);实现类:BookOrderImpl.java实现了一个简单的业务逻辑。public OrderResponse orde

7、r(OrderRequest req) ( double totalPrice = 10.0 * req.getCount();OrderResponse resp = new OrderResponse();resp.setTotalPrice(totalPrice);System.out.println(Service Provider: The book is + req.getName() + , the city is+req.getAddress().getCity()+, total price is +totalPrice);return resp;3. 将 BookOrder

8、Impl 发布为 SOAP/HTTP Web service,产生 WSDL 文件 BookOrderImpl.wsdl。创建 WebSphere ESBWebSphere ESB的数据转换和协议转换功能通过Mediation Module工程来 实现,Mediation Module工程包含三个重要组件:Mediation Flow Import和 Export组件。Mediation Flow组件实现数据转换功能;Import组件负责对 Service Provider 的 Web Service 进行调用;Export 组件是外界(JMS Client) 访问 Mediation Mod

9、ule 的接口。创建新的 Mediation Module 建立新的 Mediation Module: SOAPHTTP2JMSBinding。建立Mediation Module的同时,会自动创建名称为Mediationl的Mediation Flow的组件。Mediation Module需要访问刚刚创建的Service Provider,就需要导入 BookOrderImpl.wsdl 文件。从 BookOrderService Porject 里找到 BookOrderImpl.wsdl,复制到 SOAPHTTP2JMSBinding Projecto WebSphere ESB 就

10、 是通过 BookOrderImpl.wsdl 来建立对 Service Provider 调用的。添加Import组件Import组件负责完成对Service Provider的Web Service进行调用。打开 SOAPHTTP2JMSBinding 的 Assemble Diagram,添加 Import,更名为: SOAPHTTPImport。选择 SOAPHTTPImport,添加接口 “Add Interface”,选择 BookOrderImpl,这正是 BookOrderImpl.wsdl 提供的接口。Import组件有几种方式可以访问Mediation Module之外的s

11、ervice provider:Messaging Binding 方式,包括 JMS Binding、MQ Binding 和 JMS MQBinding;Web Service Binding 方式。因为我们刚才建立的service provider的接口是SOAP/HTTP Web Service,所 以Import组件需要选用Web Service Binding方式。为 SOAPHTTPImport 添加绑定:“Generate Binding”,选择 Web Service Binding,如图 2。图 2: Web Service Binding在接下来的对话框中选择 “Use

12、an existing web service port”,并“Browse”选择service ports: BookOrderImpl (因为之前已经导入了BookOrderImpl.wsdl 文件,该文件提供了访问 service provider 的 web service port)。新建 Business ObjectMediation Module要进行数据对象的转换,就需要建立内部的数据对象Business Object,来担任数据转换的中间者。为 SOAPHTTP2JMSBinding 建立新的 Business Object:OrderBO:添加属性:bookname, c

13、ount, city 和 streetRespBO:添加属性:totalPrice新建接口建立新的WebSphere ESB接口,为service provider提供新的展现方式,以 便向外界提供各种接口方式(各种Binding方式,见添加Export组件”)。添口 Request Response Operation”,修改 operation name 为:order,修改参数,如图3:InputName: orderBOType: OrderBOOutPutName: respBOType: RespBO图 3: New Interface添加Export组件为了使外界(JMS Cli

14、ent)访问到Mediation Module,需要添加Export组件。添加 Export,更名为 JMSExport。为 JMSExport 添加接口,“Add Interface”, 选择“BookOrderIF”(注意是新建的接口,不是BookOrderImpl.wsdl提供的 接口)。Mediation Module可以向外界提供几种方式的接口: Messaging Binding:包括 JMS Binding、MQ Binding 和 MQ JMS Binding; SCA Binding: SCA 方式提供给其他 Mediation Module 来访问; Web Service

15、 Binding:提供外界 Web Service 的访问方式。这里,我们提供JMS的访问方式。为 JMSExport 添加绑定:Generate Binding,选择“JMS Binding”,如图 4。图 4: JMS Binding弹出对话框,JMS Export Binding需要复杂的资源设置,如图5:图 5: JMS Export Binding Configuration因为JMS协议要求访问者(JMS Client和JMSExport都是ESB资源的访问 者)通过JNDI来访问队列、队列工厂等ESB资源的,因此需要在ESB上设置 各资源的JNDI (参见WAS配置ESB)。在此

16、处需要为JMSExport指定各资源 的 JNDI。选择“use pre-configured messaging provider resource”,设置激活规范、 接收目标和发送目标: JNDI name for activation specification: jms/JMSBindingAS4Export 这个JNDI是JMSExport访问队列的激活规范(参见WAS配置ESB); JNDI name for receive destination: jms/JMSBingQExportRecv这个JNDI指向ESB的接收队列(参见WAS配置ESB); JNDI name for

17、send destination: jms/JMSBingQExportSend这个JNDI指向ESB的发送队列(参见WAS配置ESB);选择 serialization type: “Serialized Business Object usingJMSObjectMessage”。因为ESB队列接收和返回的数据都是JMSObjectMessage 对象,因此需要选择此项。如果接收到数据是XML,可选择“Business Object XML using JMSTextMessage”。为了使WebSphere ESB能将数据返回给客户端,还需要设置CallBack Desitination

18、 和 Managed Connection Factory。如图 6 和图 7。图 6: CallBack Desitination在 JMSExport Properties 的 Binding / End-point configuration 窗口,设置:JMS Destinations/Callback Destination Properties: jms/JMSBindingQ图 7: Managed Connection Factory Properties在 JMSExport Properties 的 Binding / End-point configuration 窗口,

19、设置:Response Connection/ Managed Connection Factory Properties: jms/JMSBindingQCFCallback Destination 和 Managed Connection Factory 是为 JMSExport 返回 数据而设置的,如果JMS客户端不需要返回数据,则此两项可以不设置。创建JMSExport的自定义实现类 为实现JMS客户端的JMSObjectMessage对象与Service Provider端的纯 Java对象进行数据转换,就需要建立JMSExport的自定义实现类,通过该类先 实现 JMSObject

20、Message 和 Business Object 的转换。为 SOAPHTTP2JMSBinding 新建 JMSExport 自定义实现类: JMSObjectBindingImpl.java。接口选择 com.ibm.websphere.sca.jms.data.JMSObjectBinding。此接口提供了 一些数据转换的方法。添加JMSExport自定义实现类的代码: 首先新建java类:为SOAPHTTP2JMSBinding新建普通的java数据对象,以承载从JMSExport传 入的JMSObjectMessage对象,该类也可以作为JMS客户端的业务对象,客户 端在访问ESB

21、队列时,将此业务对象与JMSObjectMessag对象进行转换(详见 客户端 Servlet 和 ServiceConsumer 的代码):JMSDataObject.java实现接口: java.io.Serializable添加以下属性到该类:private String bookname;private int count;private String city;private String street;private double totalPrice;打开实现类JMSObjectBindingImpl,添加下列代码:public class JMSObjectBindingImp

22、l implements JMSObjectBinding ( private JMSDataObject jmsdata;private DataObject bo;public void setObject(Object arg0) throws DataBindingException ( System.out.println(set JMS Object.);jmsdata = (JMSDataObject)arg0;public Object getObject() throws DataBindingException (return jmsdata;public boolean

23、isObjectType() (return false;public void setObjectType(boolean arg0) (public int getMessageType() (return JMSObjectDataBinding.OBJECT_MESSAGE;public void read(Message arg0) throws JMSException (System.out.println(read JMS Message.);jmsdata = (JMSDataObject)(ObjectMessage)arg0).getObject();com.ibm.we

24、bsphere.sca.ServiceManager serviceManager =new com.ibm.websphere.sca.ServiceManager();com.ibm.websphere.bo.BOFactory factory =(com.ibm.websphere.bo.BOFactory)serviceManager.locateService(com/ibm/websphere/bo/BOFactory);DataObject orderBO =factory.create(http:/SOAPHTTP2JMSBinding,OrderBO);orderBO.set

25、String(bookname,jmsdata.getBookname();orderBO.setString(city,jmsdata.getCity();orderBO.setString(street,jmsdata.getStreet();orderBO.setInt(count,jmsdata.getCount();try (setDataObject(orderBO); catch (DataBindingException e) (throw new JMSException(e.getLocalizedMessage();public void write(Message ar

26、g0) throws JMSException (System.out.println(write JMS Message.);try (DataObject bo = getDataObject();JMSDataObject jmsobj = new JMSDataObject();jmsobj.setTotalPrice(bo.getDouble(totalPrice);(ObjectMessage) arg0).setObject(jmsobj); catch (DataBindingException e) (throw new JMSException(e.getLocalized

27、Message();public boolean isBusinessException() (return false;public void setBusinessException(boolean arg0) (public DataObject getDataObject() throws DataBindingException ( return bo;public void setDataObject(DataObject arg0) throwsDataBindingException (System.out.println(set Service Data Object.);b

28、o = arg0;该类实现了以下功能:当客户端向JMSExport发出请求时,该类负责将外部传入的JMSObjectMessage转变为内部的Business Object,转变过程依次经过以下方法:(1) read (message)(2) getDataObject () 当JMSExport向客户端返回数据时,该类负责将内部的Business Object转变 为外部的JMS Object Message,转变过程依次经过以下方法:(1)setDataObject ()(2)getMessageType ()(3)write (message)设置JMSExport的自定义实现类将JMS

29、Export的Method Bindings设置为自定义的实现类: JMSObjectBindingImpl。返回 Assembly Diagram,选择 JMSExport,选择 Method bindings,如图 8:图 8: Method Bindings选择Show Advanced”,设置以下属性,选择刚刚定义的实现类。如图9:Input data binding format:Serialization type: User SuppliedInput data binding class name: order.JMSObjectBindingImplOutput data b

30、inding format:serializationr+ype- User SuppliedInpur+dar+a binding class namerrT三二M,r*$-cxJvitL-FB-order JMSOb jecr+Bindinglmplffl 9 Data Binding Format#n I!rGjtJfrH-B*-lAllh-iL4,!*.Iersllwj.GL-.也&.u-airaLE.i-Erl ?=?*Z3L4-W3L &1 口 ?.-= r-M lr 0 JU- Q-rad pH* nW 6Mwlt二 w,MIMrlrEqtr :s*lrll 11Fwf*41.*

31、LLrMIJits !.IlllaIH-hl _*= Mb LJP-III-I0li;7L 朴E-srE-I2.r三 rrE .mlrWMFLE:r&JrFbl-u醐ExporrMediation 挡 Import;沛辙 JMSExporLsAdd wire。aMediar+i onr沛辙 Me di ar+i on 1s Add wire。aSOAPHTTP I mporr+k。Export Mediar+i on 挡 ImportK e w10。图 10: Add Wire配置Mediation Flow,做数据对象转换因为Service Provider的service有输入对象和返回对

32、象,因此需要作 输入对象和返回对象分别做转换:一是 Business Object 到 Service Provider 的输入对象的转换;二是 Service Provider 的返回对象与 Business Object 的转换。从 Mediation的菜单里选择“Generate Implementation”,进入 MediationFlow Editor窗口,连接两个order方法,如图11:图 11: Mediation Flow先为请求的数据对象作mapping:在“Request: order”的窗口里,添加 XML Transformation,命名为 XML Transfo

33、rmation,并将 XML Transformation、 order:BookOrderIF 和 order:BookOrderImpl 连接起来,如图 12:ffl 12” XML Transformationeeljt- FL ,nJ!J JLmfJ*3* SNtal- ,SMT!mE3J r & F.葛 -ws,su fllHM !ll= uAs*% dsfs LaOr=? FA lh= 0?可3 .-5wf .:-:E-Mr-dKrw tHMU-L-TL -i-i .H& *-tHddlrlligiLEwrnM 日 IrMrarnA-a-Fwi-L4lpirTrfFLrEKs-vl

34、Er KI -nr1 k*七忠等jk jrHn51-*r* g i I 1 i=rrfrJiIhr r-,H Iirae=wMapping file。XML Transformar+ionL 沛辙 propertiessDerails。 w13”H13 Create Mapping FileEa.*3*,-FTEqi-s-MLKALMMkL,?F-JDIFTaJD若 胃TKTgrul- w-x:*4ds-p-5111c&15*日 3rl- .-* M T SSM n- w 二二Q ?du3 ?上=蒙. g-i=FTlh= &F03 .-号直 . .TE-HJraETR; -iT 牝#, -wr

35、Eq 二-二 t.tMr-dlT73Lpc&BKm aA- EKn.-lim.vs 品.-v-M-L+IJnlpirToh-Mrfi.3活lfm*=Fs-4t =$efi-T.FLrEKs-wcrJ.-rSMJa5-*a ?rxfrn t_FtF-Fhwh-rrn*Enr3.TEHF-K1 等F -hAIiem- - Ek w .二.*rHJETLl-rlL Ti-E =lrl.l*rp7DMklwrsErnEl:f q 14宣二二t口丈1:9IFf -rlillu选择New,跳过New XSLT Mapping窗口,显示Mapping窗口,展开所有属 性,将属性一一做 mappingo 这样

36、,通过 XSLT Mapping,就将 Business Object 转换为Service Provider的输入对象,如图14:图 14: Data Mapping 1同样,为返回的数据对象作Mappingo在“Response: order窗口,添加 XML Transformation,命名为 XML Transformation?。将 Service Provider 的返回数据对象和 Business Object属性一一作Mapping。如图15:图 15: Data Mapping 2WAS配置ESBMediation Module提供给客户端JMS的访问方式。因此需要在ESB

37、上建立队 列以及JMS的JNDI访问对象,以实现客户端和ESB的JMS访问。建立总线目标打开 admin console,选择服务集成- 总线,选择“SCA.SYSTEM.widCell.Bus”。新建队列目标,建立以下三个队列目标: JMSBingQ JMSBingQExportRecv JMSBingQExportSend建立JMS队列选择资源-JMS提供程序- 缺省消息传递。新建JMS队列,建立下面三个JMS队列:(1)JMSBindingQJNDI 名称:jms/JMSBindingQ队列名:JMSBingQ 总线名:SCA.SYSTEM.widCell.Bus(2) JMSBingQ

38、ExportRecvJNDI 名称:jms/ JMSBingQExportRecv队列名:JMSBingQExportRecv总线名:SCA.SYSTEM.widCell.Bus(3) JMSBingQExportSendJNDI 名称:jms/ JMSBingQExportSend队列名:JMSBingQExportSend总线名:SCA.SYSTEM.widCell.Bus建立JMS队列连接工厂选择资源-JMS提供程序- 缺省消息传递新建JMS队列连接工厂:JMSBindingQCFJNDI 名称:jms/JMSBindingQCF总线名:SCA.SYSTEM.widCell.Bus建立激

39、活规范选择资源-JMS提供程序- 缺省消息传递新建“ JMS激活规范”:JMSBindingAS4ExportJNDI 名称:jms/JMSBindingAS4Export目标类型:队列目标 JNDI 名称:jms/JMSBingQExportRecv总线名:SCA.SYSTEM.widCell.Bus创建 Service Consumer 从 Business Integration Perspective 切换到 J2EE Perspective。创建客户 端的访问程序。创建 web 工程 ServiceConsumerWeb创建新的 Web 工程 ServiceConsumerWeb,

40、EAR project 为 ServiceConsumerWebEAR。客户端将使用JMSDataObject.java类作为其业务对象类(见创建JMSExport 的自定义实现类”)。因此,需要将SOAPHTTP2JMSBinding工程export成 SOAPHTTP2JMSBinding.jar 包,并将 jar 包输出到 ServiceConsumerWebEAR 目录下。并且设置ServiceConsumerWeb的属性:将 SOAPHTTP2JMSBinding.jar 加入到“java Build Path/Libraries”;选择 java JAR Dependencies,

41、选择 SOAPHTTP2JMSBinding.jar。创建 ServiceConsumer 类为 ServiceConsumerWeb 工程新建 java 类:ServiceConsumer,实现客户端请 求的逻辑。public class ServiceConsumer ( private String QCF 二jms/JMSBindingQCF”;private String jndi_recvfrom_esb = jms/JMSBingQExportSend;private String jndi_sendto_esb =jms/JMSBingQExportRecv;public St

42、ring sendMes(Object mes) (/throws ISSXException ( QueueConnectionFactory qcf = null;QueueConnection connection = null;QueueSession session = null;QueueSender sender = null;try (InitialContext ic = new InitialContext();qcf = (QueueConnectionFactory) ic.lookup(QCF);/ Create a connectionconnection = qc

43、f.createQueueConnection();connection.start();session =connection.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);Queue outQueue = (Queue) ic.lookup(jndi_sendto_esb);/ Create a QueueSendersender = session.createSender(outQueue);sender.setTimeToLive(0);Message message = null;if(mes instanceof Objec

44、t)(System.out.println(Service consumer: send request to ESB.”); message = (ObjectMessage)session.createObjectMessage(JMSDataObject)mes);message.setStringProperty(TargetFunctionName,order);message.setJMSType(order); sender.send(message);/ Close the connection sender.close();session.close();connection.close();sender = null;session = null;connection = null; catch (JMSException je) (je.printStackTrace();Exception le = je.getLinkedException();if (le != null)(le.printStackTrace(); catch (Exception e) (e.printSta

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号