创建自定义转换器(Creating Custom Transformers)

作者:wuwenyu | 出处:博客园 | 2011/11/30 9:38:29 | 阅读 16

Creating Custom Transformers

一个自定义转换器是实现了org.mule.api.transformer.Transformer接口用户自定义类。你的类可以根据需要继承

AbstractTransformer 或者 AbstractMessageAwareTransformer

该章节将更加详细的描述如何创建一个自定义转换器。

Mule ESB 提供了很多标准化的转换器,包括XML转换器(例如XML转换成Object,XSLT,和DOM转换成XML),

加密转换器能够对数据进行加密和解密,压缩转换器能够对数据进行压缩和解压缩,还有更多。可以参考

Using Transformers提供了一个标准转换器的列表,使用图形化界面创建你的数据转换器,详情参考

Mule Data Integrator.

转换器类(Transformer Classes)

AbstractTransformer 允许你访问和转换你的源数据而且可以根据需要指定你使用的编码。它定义了一些方法控制

转换器所能支持的数据类型,并且验证预期的返回值类型,留给你的只是一个简单的doTransform()方法去实现。

import org.mule.transformer.AbstractTransformer;
 
public class OrderToHtmlTransformer extends AbstractTransformer
{
 public Object doTransform(Object src, String encoding) throws TransformerException
}
如果你需要转换消息头部和附件信息,你可以使用AbstractMessageAwareTransformer 改变直接传递过来的信息。
这种情况下你通过覆写transform(MuleMessage message, String encoding)方法返回转换后的信息,你可以使用
message.getProperty(Object key)来获取属性值,或者使用message.setProperty(Object key, Object value)设置值到
转换后的信息中。
import org.mule.transformer.AbstractMessageAwareTransformer;
 
public class OrderToHtmlTransformer extends AbstractMessageAwareTransformer
{
 public Object transform(MuleMessage message, String encoding) throws TransformerException
}

注册源数据和返回值类型(Registering Source and Return Types)


你可以设定一个转换器所能接收的源数据类型和返回值类型,这允许在调用转换器之前先验证传入的信息并且在传出的时候
也验证下传出信息,如果你创建了discoverable transformer必须设定源和返回值类型。如下例子:
一个Order bean传递给HTML 转换器,你需要在构造函数中设定你需要转换的类型为Order

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

因为源类型指定之后你就不需要在方法transform()中做类型校验了,不过,如果你添加了多个源类型的话,你就得在方法
transform()
中对每一种类型都进行校验。
注意以上的代码同时也设置了转换器的名字,通常情况下你可以在Mule配置文件中设置转换器的名字,如果这个名字没有
被设置,Mule将根据源类型和返回值类型生成一个名字,如上面的例子如果没有指定名字的话将返回"OrderToString"名字。

使用转换器生命周期方法(Using Transformer Lifecycle Methods)


在Mule中的所有对象都有它的生命周期,对应转换器而言,有两个最常用的生命周期方法。
默认情况下 AbstractMessageAwareTransfromerAbstractTransformer都继承自org.mule.api.lifecycle.Initialisable接口。
转换器中所有的bean属性被设置之后,这个doInitialise()方法将被调用,这有助于转换器做一些初始化和校验工作,例如,一个
转换器要求在转换器操作之前先加载一个外部文件则可以在doInitialise()方法中实现。
如果你想在你的转换器不再使用的时候清除所有资源,你可以实现接口org.mule.api.lifecycle.Disposable,实现里面的dispose()
方法。

创建可被发现的转换器(Creating Discoverable Transformers)


Mule能自动执行转换器,例如当你在MuleMessage中调用一个getPayload()方法的时候,并且通过了要求的类型,如下:

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

Mule检查当前的payload类型尝试着查找一个能够将其转换成org.dom4j.Document类型的转换器,Mule提供了一些标准的
转换器在一些如byte[],String,inputStream等类型中进行交换,同时
transports通常有一些转换器来指定消息类型,如JMSMessage 或者 HttpRequest,
当你创建一个自定义转换器的时候可以设置它的优先级高于其它标准的转换器以便它能获取优先权。
为了使你的转换器可现,它必须实现接口org.mule.api.transformer.DiscoverableTransformer,该接口引进了两个方法:
getPriorityWeighting() and setPriorityWeighting(int weighting),当两个或者两个以上的转换器匹配查询标准的时候,权重weighting用来解决冲突,
这个权重值在1-10之间,而10拥有最高权重,作为一种规则,mule中的转换器拥有的权重为1这样低于任何自定义的转换器。
如下例子使得
OrderToHtmlTransformer可被发现,你必须如下定义:

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;
}
} 

这个转换器将Order对象转换成String对象,这就是标准的ObjectToString转换器的做法,但是ObjectToHtml被使用是因为它有更高的权重,
可以通过下面的例子来测试:

MuleMessage message = new DefaultMuleMessage(new Order(...));
String html = (String)muleMessage.getPayload(java.lang.String.class);

注册转换器(Registering the Transformer)


创建完转换器之后,你必须将它注册以便Mule能够在运行时发现它,你可以在Mule配置文件中通过<custom-transformer>来注册。
此外,如果你想让你的转换器当你的项目在类路径中被mule自动加载的话,你必须添加
registry-bootstrap.properties文件到你
/META-INF/services/org/mule/config
目录下的JAR文件,registry-bootstrap.properties文件内容看起来如下:
orderToHtml=com.foo.OrderToHtml
当mule启动的时候,bootstrap文件将在任何配置文件加载之前被发现并且安装所有在文件中注册的对象。更多信息参考:Bootstrapping the Registry.

例子(Examples)


创建一个消息头中包含有transactionId的HTML消息,你必须继承AbstractMessageAwareTransformer,并且实现transform()方法:

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();
}

Hello World example例子中定义了一个名为StdinToNameString自定义转换器,从字符串中删除换行符和新行,

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>
...
原文地址:http://www.mulesoft.org/documentation/display/MULE2USER/Creating+Custom+Transformers

你可能感兴趣的:(mule)