项目中和其它系统交互是利用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是存在这个问题的。