Linux安全网 - Linux操作系统_Linux 命令_Linux教程_Linux黑客

会员投稿 投稿指南 本期推荐:
搜索:
您的位置: Linux安全网 > Linux集群 > Architecture > » 正文

mule示例分析

来源: 未知 分享至:
一、Hello World (主要演示了两个service component链式合作处理一条消息和消息格式转换
1、示例翻译:
展示了如何配置多个service components——它们与一个请求交互(就是说二者合作以链式方式先后处理一个请求消息,处理的方式是添加消息的内容),以及如何管理事件转换(所谓事件就是消息,这里的事件转换是指消息格式的转换,比如从stdio标准输入中输入的字符串转换为一个java bean对象以及不同java bean之间的转换)。这个例子还使用了属性文件来配置i18n国际化的消息文字。还有演示了出站过滤路由。

使用了两个类也就是两个service component组件来先后处理消息,第一个是Greeter 类,它的greet()方法 使用LocalMessage 来从上面提到的属性文件获取greeting问候语,然后把问候语\"Hello\"加到你在控制台输入的名字之前(这样它就第一次修改了消息的内容)。第二个是ChitChatter类,它的chat方法 把\", how are you?\"加到消息内容之后(这样它又一次修改了消息内容):
<service name=\"GreeterUMO\">  
  <inbound>  
    <stdio:inbound-endpoint system=\"IN\" transformer-refs=\"StdinToNameString\"/>  
  </inbound>  
  <component class=\"org.mule.example.hello.Greeter\"/>  
  <outbound>  
    <filtering-router>  
      <vm:outbound-endpoint path=\"chitchatter\"/>  
      <payload-type-filter expectedType=\"org.mule.example.hello.NameString\"/>  
    </filtering-router>  
  </outbound>  
</service>  


流程是这样的:命令行接受用户输入 -> StdinToNameString转换器将字符串格式的消息转换为NameString类型的java bean -> 消息交给Greeter组件处理:把\"Hello\"加到了消息内容之前 -> 处理之后的消息被发往chitchatter队列 -> ChitChatUMO服务组件)StdinToNameString转换器在之前就定义好了:
<custom-transformer name=\"StdinToNameString\"  
 class=\"org.mule.example.hello.StdinToNameString\"/>

注意: Mule是依靠反射获知Greeter内部各个方法需要的传参类型,然后再根据目前消息格式调用正确的消息处理方法。Greeter处理完消息后、mule把消息分发到了端点:vm://chitchatter:名为chitchatter的in-memory queue内存队列。ChitChatUMO服务组件正在监听这个队列(也就是说chitchatter队列是 GreeterUMO的输出、ChitChatUMO的输入,这样来使得两个服务组件先后处理一条消息)
<service name=\"ChitChatUMO\">  
  <inbound>  
    <vm:inbound-endpoint path=\"chitchatter\" transformer-refs=\"NameStringToChatString\"/>  
  </inbound>  
  <component class=\"org.mule.example.hello.ChitChatter\"/>  
  <outbound>  
    <pass-through-router>  
      <stdio:outbound-endpoint system=\"OUT\" transformer-refs=\"ChatStringToString\" />  
    </pass-through-router>  
  </outbound>  
</service>  

ChitChatUMO服务组件又配置了两个转换器:NameStringToChatString、ChatStringToString。ChitChatter组件类的输入参数为 ChatString 类型,所以NameStringToChatString转换器将消息格式从NameString转为 ChatString、然后再调用 ChitChatter组件(流程:GreeterUMO -> vm://chitchatter -> NameStringToChatString -> ChitChatter -> ChatStringToString -> System.out)
注意Java bean是不含有任何路由逻辑的, Mule配置文件将它们组织到一起,任何已有的pojo、web services都可以照此办理并在它们之间传输消息。

二、Stock Quote (演示了如何调用ASPX web service、使用XSLT转换、反序列化StockQuote Java bean以及使用REST和SOAP调用服务。例子需要访问互联网上的公共.NET服务、主要是咱也不知道人家都有哪些股票代码有数据。源码就不看了)
1、示例翻译:通过System.in接收股票代码、调用StockQuote服务、通过XSLT转换器将返回结果转换格式、通过XmlToObject转换器再将结果转换为StockQuote类型、随后将股票报价打印到System.out
(例子用到了类似spring的属性占位符特性来从配置文件取得一些信息、配置多个转换器并“串联”起来、其中还用到xslt转换器)
<model name=\"Sample-Rest\">  
    <service name=\"HTTPPostSample\">  
      <inbound>  
        <vm:inbound-endpoint path=\"stockquote\"  
               responseTransformer-refs=\"ToString XmlDecoder Xslt XmlToObject\"/>  
      </inbound>  
      <http:rest-service-component  
               serviceUrl=\"http://www.webservicex.net/stockquote.asmx/GetQuote\"  
               httpMethod=\"POST\">  
        <http:payloadParameterName value=\"symbol\"/>  
      </http:rest-service-component>  
    </service>  
  </model>  

配置当中还用到所谓的REST service component , 它使用了REST服务包装器代理了一个REST服务、这样使得该service服务看上去似乎是本地的component组件一般(和CXF的web服务包装器差不多),REST服务包装器有一些配置属性:serviceUrl就是 访问REST服务的url、payloadParameterName是传参名 ,本例中只有一个参数\"symbol\"——股票代码、httpMethod是方法名 ——GET或POST。

我随便传了个代码过去返回了无数据的xml:
<string>  
<StockQuotes><Stock><Symbol>002339</Symbol><Last>0.00</Last><Date>N/A</Date><Time>N/A</Time><Change>N/A</Change><Open>N/A</Open><High>N/A</High><Low>N/A</Low><Volume>N/A</Volume><MktCap>N/A</MktCap><PreviousClose>N/A</PreviousClose><PercentageChange>N/A</PercentageChange><AnnRange>N/A - N/A</AnnRange><Earns>N/A</Earns><P-E>N/A</P-E><Name>002339</Name></Stock></StockQuotes>  
</string>  

Web Service版和REST版原理类似,只是服务配置是不同的。Web Service版显式配置了outbound pass-through路由,它将输入从一个endpoint直接传输到outbound Axis endpoint,不作任何改变或处理。另外outbound endpoint向Stock Quote service股票报价服务请求时是带参数的。
<model name=\"Sample-SOAP\">  
  <service name=\"serviceProxy\">  
    <inbound>  
      <vm:inbound-endpoint path=\"stockquote\"  
                  responseTransformer-refs=\"ToString XmlDecoder Xslt XmlToObject\"/>  
    </inbound>  
    <outbound>  
      <pass-through-router>  
        <axis:outbound-endpoint address=\"http://www.webservicex.net/stockquote.asmx?method=GetQuote\"  
                  responseTransformer-refs=\"XmlDecoder Xslt XmlToObject\"  
                  soapAction=\"[methodNamespace][method]\">  
          <axis:soap-method method=\"qname{GetQuote:http://www.webserviceX.NET/}\">  
            <axis:soap-parameter parameter=\"symbol\" type=\"string\" mode=\"IN\"/>  
            <axis:soap-parameter parameter=\"GetQuoteResult\" type=\"string\" mode=\"OUT\"/>  
          </axis:soap-method>  
        </axis:outbound-endpoint>  
      </pass-through-router>  
    </outbound>  
  </service>  
</model>  

三、Error Handler (演示了如何使用Spring beans作为service component以及向多个出站endpoint发布消息,使用了文件监控inbound+邮件outbound)
示例包含两个services: ExceptionManager 异常管理器 和 BusinessErrorManager业务错误管理器。

BusinessErrorManager是个简单的service,它通过JMS接收业务异常消息并将消息记录到控制台,以此模仿真实的异常处理应用。
ExceptionManager接收异常消息并根据异常消息的类型进行某些处理动作。例如如果收到致命异常则会向系统管理员发送邮件;收到标准系统异常则写入本地文件log,例子演示的不是异常处理、演示的是:
(1)所有的service components都是以spring bean的形式在一个mule配置文件当中配置的。
(2)error manager拥有多个outbound endpoints出站端点,例子演示了消息如何发布到不同端点。
(3)消息是Java对象形式,并且需要在XML形式之间互相转换。例子演示了链接多个转换器。
<spring:bean id=\"errorManager\" class=\"org.mule.example.errorhandler.ErrorManager\">
        <spring:property name=\"handlers\">
            <spring:list>
                <spring:ref local=\"fatalHandler\"/>
                <spring:ref local=\"defaultHandler\"/>
                <spring:ref local=\"businessHandler\"/>
            </spring:list>
        </spring:property>
    </spring:bean>

    <model name=\"errorhandler-test\">
        <service name=\"Error Manager\">
            <inbound>
                <inbound-endpoint address=\"file://./test-data/in\"
                               transformer-refs=\"XMLToExceptionBean ExceptionBeanToErrorMessage\">
                
                    <file:filename-wildcard-filter pattern=\"*.xml\"/>
                </inbound-endpoint>
            </inbound>
            
            <pooled-component>
                <prototype-object class=\"org.mule.example.errorhandler.ErrorManager\">
                    <properties>
                        <spring:entry key=\"handlers\">
                            <spring:list>
                                <spring:ref local=\"fatalHandler\"/>
                                <spring:ref local=\"defaultHandler\"/>
                                <spring:ref local=\"businessHandler\"/>
                            </spring:list>
                        </spring:entry>
                    </properties>
                 </prototype-object>
            </pooled-component>

            <outbound>
                <filtering-router>
                    <file:outbound-endpoint path=\"test-data/exceptions\"
                                            outputPattern=\"Exception-[UUID].xml\"
                                            transformer-refs=\"ErrorMessageToExceptionBean ExceptionBeanToXML\"/>
                    <!-- Check ErrorMessage.getThrowable() exception type -->
                    <expression-filter evaluator=\"groovy\" expression=\"payload.throwable instanceof org.mule.api.DefaultMuleException\"/>
                </filtering-router>
                
                <filtering-router>
                    <smtp:outbound-endpoint user=\"${smtp.username}\" password=\"${smtp.password}\"
                                            host=\"${smtp.host}\" port=\"${smtp.port}\"
                                            to=\"${email.toAddress}\" from=\"${email.fromAddress}\"
                                            subject=\"${email.subject}\"
                                            transformer-refs=\"ErrorMessageToExceptionBean ExceptionBeanToXML StringToEmailMessage\"/>
                    <!-- Check ErrorMessage.getThrowable() exception type -->
                    <expression-filter evaluator=\"groovy\" expression=\"payload.throwable instanceof org.mule.api.lifecycle.FatalException\"/>
                </filtering-router>
                
                <filtering-router>
                    <outbound-endpoint address=\"jms://exception.queue\"
                                   transformer-refs=\"ErrorMessageToExceptionBean ExceptionBeanToXML ObjectToJMSMessage\"/>
                    <!-- Check ErrorMessage.getThrowable() exception type -->
                    <expression-filter evaluator=\"groovy\" expression=\"payload.throwable instanceof org.mule.example.errorhandler.exceptions.BusinessException\"/>
                </filtering-router>
                
                <custom-catch-all-strategy class=\"org.mule.routing.LoggingCatchAllStrategy\"/>
            </outbound>
        </service>


                
               



               

            

Tags:
分享至:
最新图文资讯
1 2 3 4 5 6
验证码:点击我更换图片 理智评论文明上网,拒绝恶意谩骂 用户名:
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 发展历史