关于Mule ESB,简单来说Mule接受一个消息,按照某种顺序处理这个消息,这样的处理可导致多种结果。有时,Mule改变或变换消息返回到原来的消息来源(request-response)。或者,在其原有的基础上改变形式发送到一个或多个第三方(router, transfer)。而在其他一些情况下,如果消息没有达到的具体要求,Mule可以拒绝处理的消息validation, throttling)。
Mule 从3.0开始采用 flow 为单元的配置方式控制消息流(Mule 2.x 中使用 <service>),利用 Mule IDE 通过可视化的 flow blocks 来组装 flow。就像一个管道,消息从一端流向另一端。流动的消息,在 Mule 里被定义为 MuleMessage,它的结构就像下面这个样子:
它由三大部分组成:1. header(消息头):按照范围划分的属性;2. payload(消息体);3. attachments(附件)。我们可以在 flow blocks 中,通过编程方式读取或者设置这些内容。在 Mule 开发中,会遇到一个概念:"transport barrier" (传输障碍)。比如:调用子流程没有“transport barrier",而跨端点则需要跨越"transport barrier"。其中,消息头的按照范围划分属性具有以下的特性:
<flow name="mule-maven-testFlow1" doc:name="mule-maven-testFlow1"> <http:inbound-endpoint exchange-pattern="request-response" address="http://localhost:8089/test" doc:name="HTTP"/> <logger message="#[headers:INBOUND:*]" level="INFO" doc:name="Logger Headers"/> <scripting:component doc:name="Groovy"> <scripting:script engine="Groovy" file="scripts/build-response.groovy"/> </scripting:component> <logger message="#[groovy:message.toString()]" level="INFO" doc:name="Logger Message"/> </flow>
def contentType = message.getInboundProperty("Content-Type"); def response = ""; if (contentType == "application/xml") { response = "<string>hello world</string>" } else { response = '{"string":"hello world"}' } responsegroovy脚本判断 request 的 content-type 如果是 application/xml 那么返回 xml 内容,如果是 application/json 那么返回 json 内容。
org.mule.DefaultMuleMessage { id=edced872-0297-11e3-ada6-610a86bd1f23 payload=java.lang.String correlationId=<not set> correlationGroup=-1 correlationSeq=-1 encoding=UTF-8 exceptionPayload=<not set> Message properties: INVOCATION scoped properties: INBOUND scoped properties: Connection=false Content-Type=application/xml Host=localhost:8089 Keep-Alive=false MULE_ORIGINATING_ENDPOINT=endpoint.http.localhost.8089.test MULE_REMOTE_CLIENT_ADDRESS=/0:0:0:0:0:0:0:1:24210 User-Agent=Fiddler http.context.path=/test http.context.uri=http://localhost:8089/test http.headers={Host=localhost:8089, User-Agent=Fiddler, Keep-Alive=false, Connection=false, Content-Type=application/xml} http.method=GET http.query.params={} http.query.string= http.relative.path= http.request=/test http.request.path=/test http.version=HTTP/1.1 OUTBOUND scoped properties: MULE_ENCODING=UTF-8 SESSION scoped properties: }