回首项目中用mule的过程

来源:互联网 发布:chanel赠品围巾 知乎 编辑:程序博客网 时间:2024/06/05 01:52
1.首先就是一个入口  那就从mule-config.xml中说起吧 

首先从flow说起

它是Mule ESB 3.0引入的一个新的概念,它泛指一个模块化的操作系统,它包含之后提到的所有部件,它是一个母体。在3.0之前是service,然而3.0的flow有着比service更强大、灵活、易于使用的特点。
它是一个母体从这个地方进入,然后通过入口地址 访问相应的url,指定它的服务交互模式。然后进入到下一层进行判断 从而进行对消息的格式转换,如果是xml格式则进入到xmlRequestTransformer中去处理消息,这里有一个requestMessage来处理这个消息 它包含了传入来的消息的属性和实体,并通过传进来的消息来赋予属性的值 这里则转换成请求消息,其中也包含了很多验证

然后就是inBoundFilter


经过入栈过滤器之后验证ip并用MDC记录了线程包括系统id 服务id以及密码

然后调用相应的 服务 在进入服务之前 必须进行ip验证 身份权限验证服务能力验证。等等一系列的安全措施验证

如果消息通过验证则进入服务 采用动态的脚本调用

<outbound-endpoint address="vm://invoke#[groovy:payload.sid]"
exchange-pattern="request-response" encoding="UTF-8" />

而mule可以根据相应的sid来进入另外的一个配置文件中

并获得相应服务的调用 例如:

<!--智能提速平台查询-->
<flow name="SC2009000">
<inbound-endpoint address="vm://invokeSC2009000" exchange-pattern="request-response"></inbound-endpoint>
<transformer ref="speedUpAttrMessageTransformer"></transformer>
<component>
<method-entry-point-resolver ><include-entry-point method="obsQueryQos"/></method-entry-point-resolver>
<spring-object bean="speedUpService"></spring-object>
</component>
</flow>

在进入服务后有要进行消息的转换 ,将消息转换成自己多需要的message 利用

RequestMessage reqMessage = (RequestMessage) message.getPayload();
SpeedUpAttr su = new SpeedUpAttr();
Map<String,Object> param = reqMessage.getBody();

su.setLatnId((String)param.get(SpeedMessageKey.LATN_ID.getValue()));

将消息转换成对象并对对象的属性进行验证(例如空 还有 01的判断)

这之后将访问对应服务的对应方法

  public ResponseBussMessage obsQueryQos(RequestBussMessage reqMessage) throws ServiceException {
// 获取经过转换后的参数
SpeedUpAttr su = (SpeedUpAttr) reqMessage;
// 响应的参数
SpeedUpQueryInfo suResp = null;

这里得reqMessage实际上就是刚才转换成su对象的消息体。,由于要调用第三方接口的信息 我们要根据第三方所需要的信息格式 在我们的程序中进行将消息的封装 转变成他们所需要的信息,例如他们需要的是xml

我们经过一系列的拼装之后就封装成了相应的消息体。。


然后通过mule中的 mulecontext 来调用第三方接口的服务

String rspXml = (String)MuleUtil.invokeVM(mc,"vm://invoke.obs.obsQueryQos", req);首先我们需要第三方给定的wsdl并用ant来生成相应的java类来给我们使用

并且在配置文件中我们需要进行服务的配置


port以及方法我们都能从需求和给定的wsdl中获得 地址是第三方给的 class是用wsdl生成类的位置。。这样就能调用通服务了 并返回相应的xml文件 但是客户需要的并不是这个文件 于是我们需要进一步的进行转换
将xml转换成java对象 于是就用到了 xstream 
这里需要注意几点

xstream中的自动侦查注解不能少  类比较多的时候一样要在fromXML的时候加上那个参数

xstream.autodetectAnnotations(true);
xstream.processAnnotations(new Class[]{
OBSQueryQosResponse.class,
UseQosQosResponse.class

以及   OBSQueryQosResponse oqrResp = (OBSQueryQosResponse) xstream.fromXML(rspXml,new OBSQueryQosResponse());

还有一个是对于生成的xml中的“__”替换“_”这个也不能少

   private XStream xstream = new XStream(new StaxDriver(new XmlFriendlyNameCoder("_-", "_")));

这样我们就完美的获得我们的消息 对象与对象之间的传值我们就得到我们想要的数据
在这个过程之中充分的实现了mule对消息的掌控 是对mule为轻量级的消息框架以及整合平台的有力诠释!







原创粉丝点击