这篇文章介绍如何通过WSO2 ESB实现协议转换的功能:通过 WSO2 ESB 实现SOAP/HTTP和JMS之间的协议转换,实现客户端与 ESB 之间 request/response 的交互方式。
1 系统集成方式的演变
如果你只有两个系统,不用折腾ESB了。
如果你有多个系统,而且这些系统还是异构的,比如有些是java开发的、有些是.net开发的、有些还是C/S的比如是tuxedo、还有些是成熟产品如SAP等 。如何集成?
(1)Spaghetti Integration
传统的解决方式:意大利面条式集成。
由于历史的原因,每个部门都建立了自己的系统。随着新的业务需求的显现,其结果就是一堆各自为营的、条块分割的系统。然后,当系统间需要共享数据时,就加入新的点对点的接口来解决系统集成的需要。随着人们使用系统,他们发现自己需要另一个系统的数据,结果又是一个点对点的集成。最终形成了意大利面式的集成。
这种集成方式可维护性、可扩展性、 故障检测和系统管理都存在问题,为避免意大利面式集成造成的问题,ESB出现了。
(2)ESB集成
2 协议转换
不同系统使用不同协议,比如现在的tuxedo中间件他向外暴露的有服务,他的服务是一种特殊格式的协议、A系统使用的EJP、B系统使用的webservice、C系统使用的servlet、D系统使用的email、E系统使用的RMI等等,ESB是如何实现不同协议间的转换的呢?
WSO2 ESB 支持所有广泛使用的传输协议,如HTTP, HTTPS, POP, IMAP, SMTP, JMS, AMQP, FIX, TCP, UDP, FTP, FTPS, SFTP, CIFS, MLLP, SMS. Transport负责传输指定格式的消息。一个新的传输协议使用Axis2传输框架可以轻松地被添加和插入到ESB中。
Transport包含两个组件:
(1)Message builders:根据内容类型识别消息并转化为XML格式。每一种内容类型都有相应的Message builders。WSO2 ESB包含基于文本的Message builders和基于二进制的Message builders(A->XML、B->XML……)。
(2)Message formatters:与Message builders相反。把XML格式的消息转化为传到Transport前消息的格式(XML->A、XML->B……)。
可以使用axis2框架实现新的Message builders、Message formatters。
参阅协议转换(Working with Transports)
所有的transport都是基于Apache Axis2 transport框架。这个框架提供两个接口,每一个transport必须实现这两个接口,一个receiver,一个sender。配置管理Transport listeners和senders是相互独立的,比如你可以使JMS transport sender可用,而JMS Transport listener不可用。
Wso2 carbon 和所有基于carbon的产品有一个全局配置文件axis2.xml,在目录<PRODUCT_HOME>/repository/conf/axis2下,axis2.xml文件仅在服务器启动时被加载到内存,因此文件的任何改变只有重启服务器才生效。其中<transportReceiver>和<transportSender>部分是配置transport的,HTTP、HTTPS transport默认已经配置。下面以http与jms协议的转换来介绍ESB协议的配置及使用。
3 http与jms转换示例
3.1 准备
3.1.1 配置使用JMS协议
若使用activemq,JMS协议配置如下:
<transportReceiver name="jms" class="org.apache.axis2.transport.jms.JMSListener">
<parameter name="myTopicConnectionFactory" locked="false">
<parameter name="java.naming.factory.initial" locked="false">org.apache.activemq.jndi.ActiveMQInitialContextFactory</parameter>
<parameter name="java.naming.provider.url" locked="false">tcp://localhost:61616</parameter>
<parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">TopicConnectionFactory</parameter>
<parameter name="transport.jms.ConnectionFactoryType" locked="false">topic</parameter>
</parameter>
<parameter name="myQueueConnectionFactory" locked="false">
<parameter name="java.naming.factory.initial" locked="false">org.apache.activemq.jndi.ActiveMQInitialContextFactory</parameter>
<parameter name="java.naming.provider.url" locked="false">tcp://localhost:61616</parameter>
<parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">QueueConnectionFactory</parameter>
<parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>
</parameter>
<parameter name="default" locked="false">
<parameter name="java.naming.factory.initial" locked="false">org.apache.activemq.jndi.ActiveMQInitialContextFactory</parameter>
<parameter name="java.naming.provider.url" locked="false">tcp://localhost:61616</parameter>
<parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">QueueConnectionFactory</parameter>
<parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>
</parameter>
</transportReceiver>
<transportSender name="jms" class="org.apache.axis2.transport.jms.JMSSender"/>
3.1.2 启动activemq
http://activemq.apache.org/下载,解压,运行bin/activemq.bat
3.1.3 启动WSO2 ESB
activemq 5.7.0 拷贝下列3个jar包到esb/repository/components/dropins,其他版本activemq还需要其他包,如activemqmq 5.9.1还需要activemq-client-5.9.1.jar、hawtbuf-1.9.jar
l activemq_core_5.7.0_1.0.0.jar
l eronimo_j2ee_management_1.1_spec_1.0.1_1.0.0.jar
l geronimo_jms_1.1_spec_1.1.1_1.0.0.jar
运行bin/wso2server.bat
3.2 开发
3.2.1 创建后台axis2服务
具体开发部署方法参见http://blog.csdn.net/szh1124/article/details/42125065,代码参见NotaryService.java
注意,这个服务通过JMS协议通信, /src/main/resources/META-INF/services.xml需要配置.
<transports> <transport>jms</transport> </transports> |
开发完成部署到WSO2 Application Server,当然,也可以将wso2 Application Server部署AAR服务的功能添加到WSO2 ESB,因为WSO2是OSGI的,功能可以轻松的添加和卸载。具体添加方法参见“WSO2 ESB添加功能组件”。
3.2.2 创建服务端点
详细配置见NotaryEndpoint.xml,URL如下:
jms:/JMSNotaryService?transport.jms.DestinationType=queue&transport.jms.ContentTypeProperty=Content-Type&java.naming.provider.url=tcp://localhost:61616&java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory&transport.jms.ConnectionFactoryType=queue&transport.jms.ConnectionFactoryJNDIName=QueueConnectionFactory
3.2.3 创建代理服务
客户端发送http请求到通过ESB的代理服务,ESB转发请求消息到后台jms服务NotaryService,ESB从NotaryService接收响应并通过http协议返回给客户端。
详细配置见NotaryProxy.xml
3.3 测试
点击NotaryProxy后面的“尝试调用本服务”,输入“李四”,如下图所示:
通过monitor/soap tracer可以看到NotaryProxy代理服务调用了后台JMSNotaryService。
示例相关配置下载http://download.csdn.net/detail/szh1124/8295673