mule号称开源ESB的最好实现,研究mule也有段时间了, 在“浩如烟海”的xml配置中,保持清醒的头脑确实不容易。
作为学习笔记之一,记录一下一个mule简单应用的实现。
需求:给指定的email地址发送邮件.
一:基本实现:
1: 实现命令行输入发送email:
为了能在命令行接受输入, 需要配置一个输入输出连接器:
2:配置一个UMO,把输入的内容放入一个队列:
outbound节点的配置, 把输入的内容(String) 路由到一个叫“content”的queue中, 此queue为jvm中的内存队列。
3:配置一个UMO,实现发送email:
其中inbound的配置为contentUMO的outbound, contentUMO和EmailBridge这个两个UMO通过名称为“content”的queue连接起来, 实现通讯。EmailBridge接收到输入后, 会依次通过ContentToEmail, StringToMimeMessage两个transformer进行内容的转换。
BTW:为了在mule中使用smtp, 需要在xml的namespace中声明:
xmlns:smtps="http://www.mulesource.org/schema/mule/smtps/2.1"
mule有很多对于具体协议的transport实现,每一个transport的实现作为一个jar包存在(比如mule-transport-email-2.1.2.jar), 在jar中的META-INF/spring.schemas文件中, 写明了xsd文件的对应关系, META-INF/sping.handers配置了相关命名空间的handle class, 可以据此在mule的配置文件中声明命名空间.
完整的mule配置文件如下:
相关class如下:
自定义消息转换器:
自定义smtp连接器(smtp connector):
运行此程序, 根据提示, 在命令行输入:
二: 升级:增加一个component.
修改UMO:EmailBridge配置, 增加一个component:
注意到增加了一个component, 接受命令行的输入(String), 产生一个EmailModel的对象.之后,这个EmailModel对象进入outbound, 并经过
emailModelToString, StringToMimeMessag的处理, 最后发送出去.
其中emailModelToString是新添加的一个自定义transformer:
相关class如下:
EmailModel.java:
EmailComponent.java
需要说明的是:
mule默认采用方法参数类型匹配策略, 所以, 如果有String类型的输入, foo方法自动调用, 也可以详细指定调用哪个方法,比如以下配置明确指定调用component的foo方法:
EmailModelToString.java
三:继续升级:不满足于在命令行输入, 需要在浏览器输入, 也就是发布一个http接口。
修改contentUMO如下:
通过http请求得到输入参数, 经过HttpRequestToString的转换, 放入“content” queue, 为了和content中的数据格式匹配,在浏览器中按如下方式输入:
http://localhost:[email protected],hello
新增了一个class:
HttpRequestToString.java
使用心得:除了xml,还是xml. 如果没有图形化的配置工具, 使用起来还是很麻烦的。对于mule的开发, 主要做component和transfer的开发.至于其他好处, 有待进一步学习。