mule in action翻译24 : 4.3 使用核心转换器
mule in action翻译24 : 4.3 使用核心转换器
mule的核心库有很多转换器。他们提供不依赖传输的转换功能,比如压缩、加密、抽取payload值。本节将讲述六个常用的payload类型和属性转换器。
1、处理字节:使用字节转换器对字节和流类型的payload进行类转换。
2、压缩数据:使用gzip压缩或解压缩payload。
3、修改属性:和转换器一起工作,用来修改消息属性。
4、使用表达式语言:使用能计算表达式的转换器创建一个新的payload。
5、扩展消息(Enriching messages):不需要完整的转换它而在消息中增加更多的信息。
6、自动转换:自动选择使用最佳的转换器来得到期望的结果。
先来看一对处理字节的转器。
4.3.1 处理字节
字节数据是不同系统交换数据的细粒度数据单元。在这些系统中字节的处理往往以流或数组的方式,
前者(流)适合大批量的数据,后者适合数据量小的情况。
mule的核心库中,转换器ByteArrayTo的输入既可以是流也可以是byte数组。这意味着在endpoint中声明的可以处理流的转换器,也将能直接处理流而不需要首先转换为数组。
先来看功能多样的 byte-array-to-object-transformer。如果这个转换器接受了字节类型的payload--一个序列化后的Java对象,输出结果是一个反序列化后的对象。如果payload不是一个序列化对象,转换器将使用这些字节数据创建一个String。下面的代码展示了这个转换器,配置为反序列化字节数组或流为一个java.util.Map的实例。
<byte-array-to-object-transformer name="ByteArrayToMap" returnClass="java.util.Map"/>
这个转换器使用在任何的不是接受序列化的java.util.Map对象的 endpoint 中时,会抛出TransformerException异常,并会停止对消息的处理。
另一个对应的转换器是object-to-byte-array-transformer。正如你猜想的一样,这个是进行反向处理的;它把字符串和流转换为字节数组,它使用Java标准的序列化机制吧可序列化的payload转换为字节数据。注意,不可序列化的payload将阻塞这个转换器,因为对他不可能执行任何的转换。下面展示了一个简单的转换器的声明,它复制所有的流的输入到一个字节数组。
<object-to-byte-array-transformername="ObjectToByteArray" />
注意: 有时对一个对象你可能需要一个让人易读的描述,比如当需要进行调试时。为了正确说明类型你可以使用object-to-string来替代object-tobyte-array,object-to-string会自动的“考虑”编码。
复制全部的输入流数据到数组会对mule实例的内存造成重大影响。这不会轻易的发生。你为什么会做那么傻的事情?当处理异步事件时,你不能保证在消息处理过程中输入流总是保持打开的。如果 inbound endpoint认为它已经接受完了响应,它将关闭连接,关闭所有打开的流。在接受完消息后,转换器再把payload填充到消息中,这样的处理是安全的。这是一种从传输(transport)分离消息的一种方式。
最佳实践 一定要考虑你使用的转换器对内存的影响。
最佳实践 在处理瞬时数据时可能没有足够的时间处理完整个流(比如 FTP 数据),这时可以考虑使用
file, VM或JMS传输把数据发送到一个可靠的outbound endpoint,在哪里进行处理。
如果你列出所有mule的核心的字节相关的转换器,你会发现还会有其他几个。这里把他们罗列出来:
1、byte-array-to-serializable-transformer 和 serializable-to-bytearray-transformer 。
这些是byte-array-toobject-transformer和object-to-byte-array-transformer的特殊版本,他们只能转换为
序列化的Java对象或从序列化的Java对象转换为来。
2、byte-array-to-hex-string-transformer 和 hex-string-to-byte-arraytransformer。
这对转换器和别的转换器无关。顾名思义,他们从(或转换为)16进制数据。
3、 byte-array-to-string-transformer 和 string-to-byte-array-transformer
这两个转换器会依赖当前的编码方式。
上一篇: Java Socket收发异步长连接