项目中和其它系统交互是利用Mule来进行的,在之前的集成过程中也一直都很顺利,可是在集成一个短信服务时Mule总是不能按照配置文件的配置发送正确的SOAP消息。因为是个简单的集成.NET发布的服务,我就直接用Mule的axis模块来转发SOAP消息,我要集成的这个服务配置是这样配置的:
<axis:endpoint name="MsgSendEndpoint" address="http://192.168.0.2/Service/Service1.asmx?method=MessageSend" soapAction="#[methodNamespace]#[method]">
<axis:soap-method method="qname{MessageSend:Service1}">
<axis:soap-parameter parameter="my_num" type="string" mode="IN" />
<axis:soap-parameter parameter="fee_num" type="string" mode="IN" />
<axis:soap-parameter parameter="user_num" type="string" mode="IN" />
<axis:soap-parameter parameter="msg_content" type="string" mode="IN" />
<axis:soap-parameter parameter="ip" type="string" mode="IN" />
<axis:soap-parameter parameter="process_flag" type="string" mode="IN" />
<axis:soap-parameter parameter="out" type="string" mode="OUT" />
</axis:soap-method>
</axis:endpoint>
<service name="MsgSendService">
<inbound>
<vm:inbound-endpoint path="msgSendService" synchronous="true"
remoteSync="true" transformer-refs="StringToMsgObject" />
<forwarding-router />
</inbound>
<outbound>
<pass-through-router>
<axis:outbound-endpoint ref="MsgSendEndpoint"></axis:outbound-endpoint>
</pass-through-router>
</outbound>
</service>
经过几次测试,我发现如果设置axis:soap-method元素的method属性的qname时,如果是这样的:<axis:soap-method method="qname{MessageSend
:http://Service1/}">,就可以让Mule设置正确的QName,发送正确的SOAP消息,但是如果QName的namespace不是http://.../的URL形式就不能发送正确的SOAP消息。
如果这个服务的提供方的WebService的方法的namespace是http://.../
的URL形式就好了,可是这个namespace就是"Service1",我必须要解决为什么namespace一定要是http://.../
的URL形式才可以Mule让发送正确的SOAP消息。
后来发现在Mule的mule-module-spring-config模块里,负责解析QName的org.mule.config.spring.editors.QNamePropertyEditor类的protected QName parseQName(String val)方法好像是写错了。原来这个方法也是通过StringTokenizer获得":"分隔的部分来解析QName的,如果能获得2部分,也就是类似于MessageSend:Service1这种写法的情况下,就会执行:return new QName((String) elements.get(0), (String) elements.get(1));查看J2SE 5.0的API知道:public QName(String namespaceURI,String localPart),第一个参数应该是QName 的名称空间 URI,第二个应该是QName 的本地部分,我想这里面的参数顺序应该是写反了吧,我把这句代码改成return new QName((String) elements.get(1), (String) elements.get(0));重新编译,替换掉原来的class,再次运行Mule,发现生成的SOAP消息是正确的了。
不知道最新版本的Mule的QNamePropertyEditor类是否已经改掉了,我现在的Mule 2.1.2是存在这个问题的。
分享到:
相关推荐
Mule ESB 是一个轻量级的基于java的企业服务总线和集成平台, 使得开发人员可以快速,简单的连接多个应用, 使得它们可以交换数据。 Mule ESB 容易集成现有异构系统,包括:JMS, Web Services, JDBC, HTTP, 等. ESB...
Mule 是一个基于ESB架构理念的消息平台。Mule 的核心是一个基于SEDA的服务容器,该容器管理被称为通用消息对象(Universal Message Objects /UMO)的服务对象,而这些对象都是POJO。所有UMO和其他应用之间的通信都是...
Mule是一个企业服务总线(ESB)消息框架,而且Mule是一个轻量级且高度可扩展的ESB。
详细对mule的两个例子进行分析
mule in action 和doc文档详细介绍 Mule的核心组件是UMO(Universal Message Objects,从Mule2.0开始UMO这一概念已经被组件Componse所代替),UMO实现整合逻辑。UMO可以是POJO,JavaBean等等。它支持30多种传输协议...
Mule in Action, Second Edition is a totally-revised guide covering Mule 3 fundamentals and best practices. It starts with a quick ESB overview and then dives into rich examples covering core concepts ...
mule -esb 源码
关于在tomcat上进行mule多线程数量参数配置
Mule is the most widely used open source ESB-with millions of downloads-providing an alternative to expensive commercial options. Mule in Action is acomprehensive tutorial designed for working Java ...
mule,mule esb,Mule,ESB
Mule ESB 项目在Linux中的部署与开发与应用案例
文档主要介绍了Mule ESB的使用方法,并结合具体实例加深对ESB的理解,对新手很有帮助哦!
mule入门文档 mule入门文档 mule入门文档mule入门文档
Mule是一个以Java为核心的轻量级的消息框架和整合平台,基于EIP(Enterprise Integeration Patterns,由Hohpe和Woolf编写的一本书)而实现的。Mule的核心组件是UMO(Universal Message Objects,从Mule2.0开始UMO这一...
mule基本节点解释汇总 <mule> .... ....... ..... ... </mule>
Mule原理图和ESB设计Mule原理图和ESB设计Mule原理图和ESB设计Mule原理图和ESB设计
mule号称开源ESB的最好实现,一个以Java为核心的轻量级的消息框架和整合平台。它使得开发人员可以快速,简单的连接多个应用。 目前许多公司都使用了Mule,比如Walmart,HP,Sony,Deutsche Bank 以及 CitiBank等公司。...