首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Mule ESB的transformer(1)——基础transform及自定义transformer

2012-12-26 
Mule ESB的transformer(一)——基础transform及自定义transformer1. transformer的作用? ? transformer将ser

Mule ESB的transformer(一)——基础transform及自定义transformer

1. transformer的作用

? ? transformer将services间传递的message的payload转化为它们所需要的格式。

?

2. 配置transformer

? ? 2.1 配置分类

? ? ? ? transformer分为locally(本地的)和globally(全局)。当transformer在endpoint上或flow中,它是locally的,而transformer配置在<modle>或<flow>标签之前,它是globally的。

?

? ? 2.2 transformer链

? ? ? ? 用户可以使用多个transformer,将message的payload格式进行转化。

? ? ? ? 方法一:在一个transformer-refs或responseTransformer-refs中使用空格分隔多个transformer

? ? ? ? transformer-refs="ByteArrayToString StringToObject ObjectToInputStream"

? ? ? ? 方法二:使用多个transformer-refs或responseTransformer-refs

? ? ? ? <transformer ref="ByteArrayToString"/>

? ? ? ? <transformer ref="StringToObject"/>

? ? ? ? <transformer ref="ObjectToInputStream"/>

?

3. 可使用的Transformer

? ? 3.1 基础transformer

? ? ? ? 3.1.1 BeanBuilderTransformer

? ? ? ? 用定义的对象构造一个bean对象,然后设置一些表达式,用于配置bean的属性。

        <bean-builder-transformer name="testTransformer3" beanevaluator="mule" expression="message.payload" optional="true"/>            <bean-property property-name="segments" evaluator="mule" expression="message.header(SEGMENTS)"/>        </bean-builder-transformer>
?? ? ? ??

? ? ? ? 3.1.2 ByteArrayToHexString <-> HexStringToByteArray

? ? ? ? 将字节数组类型和16进制串进行转换

?

? ? ? ? 3.1.3 ByteArrayToMuleMessage <-> MuleMessageToByteArray

? ? ? ? 将字节类型和Mule的Message进行转换。

?

? ? ? ? 3.1.4 ByteArrayToObject <-> ObjectToByteArray

? ? ? ? 将字节类型和对象之间进行转换,如果字节数组没有序列化(serialized),ByteArrayToObject将会返回一个由字节数组创建的一个String类型串。

?

? ? ? ? 3.1.5 ByteArrayToSerializable <-> SerializableToByteArray

? ? ? ? 将字节类型的数组进行序列化和反序列化。

?

? ? ? ? 3.1.6 ExpressionTransformer

? ? ? ? ExpressionTransformer将执行message的一个或多个表达式,并将表达式的结果作为当前message的payload。

? ? ? ? 假设component的接口:

        public interface ShippingRequestMessage        {            public Customer getCustomer();            public Item[] getShippingItems();            //etc        }

?? ? ? ? <expression-transformer>设计,required属性标记该属性是否是必须的

        <expression-transformer>            <return-argument evaluator="bean" expression="customer"/>            <return-argument evaluator="bean" expression="shippingItems"/>            <return-argument evaluator="attachment" expression="supportingDocs" required="false"/>        </expression-transformer>
?? ? ? ? 3.1.7 MessagePropertiesTransformer

? ? ? ? 允许用户对当前message的属性进行增、删、改等操作。下面的例子将xml中head的ID标签和body标签拼接为message的GUID属性:

        <message-properties-transformer>            <add-message-property key="GUID" value="#[string:#[xpath:/msg/header/ID]-#[xpath:/msg/body/@ref]]" />        </message-properties-transformer>
?? ? ? ? 3.1.8 ObjectArrayToString <-> StringToObjectArray

? ? ? ? 将对象数组类型和字符串类型进行转换。

?

? ? ? ? 3.1.9 ObjectToInputStream

? ? ? ? 将可序列化的对象转化为一个输入流,但是当对象为String时,将会调用getBytes方法将Stirng转化为byte数组后再操作。

?

? ? ? ? 3.1.10 ObjectToOutputHandler

? ? ? ? 将一个String对象转化为输出流。

?

? ? ? ? 3.1.11 ObjectToString

? ? ? ? 将各类对象转化为人类可识别的字符串。该transformer常用语debug。

?

? ? ? ? 3.1.12 StringAppendTransformer

? ? ? ? 在当前的String串后面添加指定的字符串。

? ? ? ??

? ? ? ? 3.1.13 StringToObjectArray

? ? ? ? 将一个字符串转化为一个对象数组。

?

? ? 3.2 其他类型

? ? ? ? 以下transformer涉及知识点较多,不进行详细介绍

? ? ? ? 3.2.1 xml类型

? ? ? ? XmlToObject <-> ObjectToXml

? ? ? ? JAXB XmlToObject <-> JAXB ObjectToXml

? ? ? ? XSLT

? ? ? ? XQuery

? ? ? ? DomToXml <-> XmlToDom

? ? ? ? XmlToXMLStreamReader

? ? ? ? XPath Extractor

? ? ? ? JXPath Extractor

? ? ? ? XmlPrettyPrinter

?

? ? ? ? 3.2.2 JSON类型

? ? ? ? 支持json格式的相关转换,需要配置文件需要引入json的命名空间:

        <?xml version="1.0" encoding="UTF-8"?>        <mule xmlns="http://www.mulesoft.org/schema/mule/core"        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"        xmlns:json="http://www.mulesoft.org/schema/mule/json"        xsi:schemaLocation="        http://www.mulesoft.org/schema/mule/core        http://www.mulesoft.org/schema/mule/core/3.0/mule.xsd        http://www.mulesoft.org/schema/mule/json        http://www.mulesoft.org/schema/mule/json/3.0/mule-json.xsd">        </mule>
?? ? ? ??

? ? ? ? 3.2.3 Scripting【脚本】

? ? ? ? 使用脚本进行对象转化,目前支持javascript和groovy。

?

? ? ? ? 3.2.4 Encryption【加密】

? ? ? ? Encryption <-> Decryption:使用EncryptionStrategy接口的实现类对数据进行加密和解密操作。

?

? ? ? ? 3.2.5 Compression【压缩】

? ? ? ? GZipCompressTransformer <-> GZipUncompressTransformer:对数据进行压缩和解压缩操作。

?

? ? ? ? 3.2.6 Encoding

? ? ? ? Base64Encoder <-> Base64Decoder:使用Base64对数据进行编码和解码操作。

? ? ? ? XMLEntityEncoder <-> XMLEntityDecoder:对xml的节点信息进行编码和解码操作。

?

? ? ? ? 3.2.7 Email

? ? ? ? 包含一系列transformer用于将email转化为字符串、对象转换为MIME等。

?

? ? ? ? 3.2.8 File

? ? ? ? File transformer允许对本地的文件系统进行读写操作。

?

? ? ? ? 3.2.9 HTTP

? ? ? ? HTTP transformer支持一些列transformer,用于将http请求转换为字符串或是将mesage转化为http请求。

?

? ? ? ? 3.2.10 JDBC

? ? ? ? JDBC Transformer可以将CSV或xml文件中的数据转移到数据库中。

?

? ? ? ? 3.2.11 JMS

? ? ? ? 支持将JMS格式message转化为其他类型的数据。

?

? ? ? ? 3.2.12 Strings and Byte Arrays

? ? ? ? Multicast Transport和TCP Transport均提供了byte array和对象之间转换的transformer。

?

? ? ? ? 3.2.13 XMPP

? ? ? ? 支持XMPP包和字符串之间的转换操作。

?

?

?

? ? 3.3 transformer的通用属性及配置

? ? ? ? returnClass:指定transformer返回的java类名称。

? ? ? ? ignoreBadInput:如果设置true,transformer将忽略它不识别的类型,但是transformer链中的其他transformer会执行;如果设置false,transformer依旧忽略它所不识别的类型,但是其他的transformer不会被调用。

? ? ? ? mimeType:设置通过该transformer的message的迷你类型。

? ? ? ? encoding:设置通过该transformer的message编码格式。

?

4. 自定义transformer

? ? 如果Mule自带的transformer不能满足用户的需求,可以定制化transformer。定制的transformer需要继承AbstractTransformer或AbstractMessageAwareTransformer,然后定制化个性转化。

?

? ? 4.1 注册源和返回类型

? ? ? ? 在构造方法中,使用registerSourceType(Class class)方法指定期望输入的数据类型,使用setReturnClass(Class class)指定返回的数据类型:

        public class OrderToHtmlTransformer extends AbstractMessageAwareTransformer        {            public OrderToHtmlTransformer() {                registerSourceType(Order.class);                setReturnClass(String.class);                setName("OrderToHTML");            }        }

?

? ? 4.2 使用声明周期方法

? ? ? ? AbstractTransformer或AbstractMessageAwareTransformer类都实现了org.mule.api.lifecycle.Initialisable接口,该接口提供doInitialise()方法。

? ? ? ? 当所有的bean属性配置到transformer(如果有bean属性),doInitialise()将被调用。这个方法可以用于初始化transformer所需要的信息。

?

? ? 4.3 创建可覆盖的transformer

? ? ? ? Mule提供自动的转换。当调用getPayload()方法时,mule将尝试使用标准的transformer进行类型转换:

? ? ? ? Document doc = (Document)muleMessage.getPayload(org.dom4j.Document.class);

?

? ? ? ? 如果想使用自定义的转换器进行转化(与Mule的冲突时),需要实现org.mule.api.transformer.DiscoverableTransformer接口:

? ? ? ? 接口包含两个方法getPriorityWeighting()和setPriorityWeighting(int weighting),用于设置权重,权重从1到10,10的权重最大。Mule的transformer权重默认是1,通常比任何自定义transformer的权重都低。

?

? ? ? ? 自定义transformer的权重:

        public class OrderToHtmlTransformer extends AbstractMessageAwareTransformer implements DiscoverableTransformer        {            private int weighting = DiscoverableTransformer. DEFAULT_PRIORITY_WEIGHTING + 1;            int getPriorityWeighting() {                return weighting;            }                        void setPriorityWeighting(int weighting) {                this.weighting = weighting;            }        }
?? ? 4.4 注册transformer

? ? ? ? 使用<custom-transformer>配置自定义transformer。但是如果需要自动被加载,需要添加registry-bootstrap.properties文件到/META-INF/services/org/mule/config目录下,registry-bootstrap.properties示例如下:

? ? ? ? orderToHtml=com.foo.OrderToHtml

? ? ? ??

? ? 4.5 完整示例:

? ? ? ? 将包含transactionId的HTML的message进行转化,实现AbstractMessageAwareTransformer:

public Object transform(MuleMessage message, String encoding) throws TransformerException{    Order order = (Order)message.getPayload();    StringBuffer html = new StringBuffer();    html.append("");    html.append("");    html.append("");    html.append("Dear ").append(order.getCustomer().getName()).append("");    html.append("Thank you for your order. Your transaction reference is: <strong>");    html.append(message.getProperty("transactionId").append("</strong>");    html.append("("");    return html.toString();}

?

实现AbstractTransformer

package org.mule.example.hello;import org.mule.api.transformer.TransformerException;import org.mule.transformer.AbstractTransformer;public class StdinToNameString extends AbstractTransformer{    public StdinToNameString()    {        super();        this.registerSourceType(String.class);        this.setReturnClass(NameString.class);    }    public Object doTransform(Object src, String encoding) throws TransformerException    {        NameString nameString = new NameString();        String name = (String) src;        nameString.setName(name.replaceAll("\r", "").replaceAll("\n", "").trim());        return nameString;    }}

?

? ? 配置文件

<custom-transformer name="StdinToNameString" />...<service name="GreeterUMO">    <inbound>    <stdio:inbound-endpoint system="IN" transformer-refs="StdinToNameString" /></inbound>...
?

热点排行