`
winnie825
  • 浏览: 120010 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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" beanClass="org.mule.test.fruit.Orange">
            <bean-property property-name="brand" evaluator="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" class="org.mule.example.hello.StdinToNameString" />
...
<service name="GreeterUMO">
    <inbound>
    <stdio:inbound-endpoint system="IN" transformer-refs="StdinToNameString" />
</inbound>
...
 
分享到:
评论
2 楼 zoboy 2016-04-06  
的撒旦撒旦撒啊盛大盛大的撒大声的
1 楼 zoboy 2016-04-06  
洒洒的奋斗过

相关推荐

    MuleEsb开源框架简介.pdf

    Mule ESB 是一个基于 Java 的轻量级企业服务总线和集成平台,允许开发人员快速便利地连接多个应用,并支持应用间的数据交换。Mule ESB 支持集成现有系统而无论其底层采用何种技术,如 JMS、Web Services、JDBC、...

    Mule ESB开发一个小例子

    Mule ESB,全称Mule Enterprise Service Bus,是一种强大的企业级服务总线,用于构建灵活、可扩展的集成解决方案。它提供了一个平台,使得不同系统间的通信变得更加简单,支持多种协议和数据格式。在本文中,我们将...

    mule ESB 3 user guider

    描述:本手册旨在为用户提供对Mule ESB 3的基础使用指导,强调了Mule ESB作为一个社区成熟且文档丰富的开源企业服务总线(ESB)的使用方法。 知识点说明: 1. Mule ESB概述: Mule ESB是一个开源的中间件平台,...

    mule esb 项目 例子 入门

    Mule ESB(Enterprise Service Bus,企业服务总线)是一款强大的开源集成平台,它帮助企业将不同的系统、应用程序和服务连接在一起,实现数据的高效流转。本教程将带您入门Mule ESB项目,通过实例学习其核心概念和...

    Mule ESB开发工具以及相匹配的英文手册和中文手册(翻译狗充值翻译)

    Mule ESB(Enterprise Service Bus,企业服务总线)是一种开源的集成平台,由Mulesoft公司提供,它主要用于构建和管理API及企业内部系统的集成。Mule ESB的核心特性是轻量级、高性能和易用性,它允许开发者快速地...

    MuleEsb开源框架简介

    #### 一、MuleEsb框架概览 Mule Enterprise Service Bus(ESB)是一种先进的开源框架,专为现代企业的集成需求设计。Mule ESB的核心价值在于其强大的连接性和灵活性,使企业能够轻松整合多种应用和服务,无论它们的...

    Mule ESB 开发例子

    #### 一、Mule ESB 概述与应用场景 Mule ESB (Enterprise Service Bus) 是一种用于集成不同系统和服务的企业级平台。它提供了一个灵活且强大的架构,使得开发者能够轻松地连接不同的应用程序和服务,并通过一系列的...

    MULE esb 节点使用说明中文文档

    MULE ESB(Enterprise Service Bus)是一种强大的集成平台,用于构建高度可扩展的应用程序和服务。它允许开发人员轻松地连接不同的应用程序、API 和数据源。本文档将详细介绍MULE ESB 的核心概念、节点使用说明及其...

    MuleESB系统集成设计文档

    **MuleESB:** MuleESB是一种基于Java的轻量级企业服务总线,用于连接不同的应用程序和服务,支持它们之间的数据交换。它可以无缝地集成现有的各种系统,不论它们采用了何种底层技术。 **ESB的作用:** - **降低...

    mule 开发使用包

    【描述】虽然描述中提供的信息有限,但通过提供的博文链接——,我们可以推测这可能是一个关于Mule ESB的教程或指南,旨在帮助开发者快速入门并熟悉Mule 3版本的相关开发工作。这个博客文章可能包含了Mule的基本概念...

    Mule讲解.docx

    Mule,全称为Mule ESB(Enterprise Service Bus,企业服务总线),是一种开源的集成平台,由Mulesoft公司开发。它主要用于构建和运行连接应用程序、系统和服务的集成解决方案,帮助企业实现数据和流程的无缝连接。 ...

    mule in action

    《Mule in Action》是一本专注于Mule ESB(企业服务总线)的入门教程,旨在帮助读者系统地学习和理解这一强大的集成平台。Mule ESB是开源领域中的一个重量级选手,常用于构建灵活、可扩展的企业级集成解决方案。这...

    MULE DEMO实验

    通过这个MULE DEMO实验,参与者不仅可以学习Mule ESB的基础知识,还能掌握实际操作技巧,这对于理解和应用企业级集成解决方案至关重要。这个实验提供了宝贵的实践经验,对于进一步探索Mule ESB的高级特性,如ESB的...

    ESB解决方案-mule分享.docx

    Mule 是一种开源的 ESB 框架,提供了基本的 ESB 功能,包括消息传递、服务集成、数据转换等。Mule 的整体结构包括 Model、Service、Transport、Transformer 等组件。Model 表示托管各个服务的运行时环境。Service 是...

    soap-rest-attachments:如何在 Mule ESB 中通过 SOAP 和 REST 调用处理附件的 E2E 示例

    Mule ESB 是一个强大的集成平台,它允许开发者轻松地连接各种系统,实现数据交换。在这个具体的案例中,我们将关注如何处理涉及文件附件的场景,这在现代企业集成中是非常常见的需求。 首先,让我们了解 SOAP 和 ...

    json-sanitizer-transformer:净化 JSON 的 Mule ESB 转换器

    JSON Sanitizer 转换器用作不受信任的 JSON 字符串的第一遍。 它利用了 OWASP 的 JSON Sanitizer 项目。 Mule 支持的版本 骡子 3.5.x 安装 对于 beta 连接器,您可以下载源代码并使用 DevKit 构建它,以便在您的...

Global site tag (gtag.js) - Google Analytics