使用Mule ESB与Groovy编排RESTful服务
2009-12-01 00:00:00 来源:WEB开发网这全是XML,我们来仔细分析一下:
名为OrderCreationQueue的管道(可以是VM队列或是JMS队列)接收消息。
接收到的消息被直接传递到另一个路由,该路由会将HTTP POST的结果发送到下一个服务,该服务通过名为OrderCreationResultQueue(异步的VM队列)的管道对调用结果进行分析。
通过标准的输出端点在Groovy转换器上执行该HTTP POST请求:
请求订单的微格式是通过一个特定的传送器创建的,下一节将对其进行详细介绍。
通过一小段脚本将结果代码抽取出来并与期望值进行比对。进行比较的目的在于将后面的服务与纯的HTTP隔离开来:我们所创建的boolean类型的属性OrderPlaced是独立的,其名称与进行的编排密切相关。
类似的,在更具上下文含义的OrderResourceLocation名字下复制Location头。注意,该头 有可能丢失(在失败的情况下),在这种情况下,我们将其值默认设为空字符串以避免将null属性加到消息中。
我们使用了一个对象——字符串转换器来“分离”HTTP响应(以流的形式返回)。多亏有了这个转换器,流得到了完全的处理,其内容也通过使用与 HTTP交换相关的编码转换为字符串。当流关闭时,HTTP连接得到了释放;我们不想一直开着它,等待后面的服务从 OrderCreationResultQueue中拿出响应消息。
Groovy MarkupBuilder的好处
OrderMapToMicroformat转换器完成了服务中的重头戏,而它是由Groovy的MarkupBuilder实现的。MarkupBuilder API提供了一种自然的方式生成兼容于特定微格式的XML实体:
<scripting:transformer name="OrderMapToMicroformat">
<scripting:script engine="groovy"> <![CDATA[
def writer = new StringWriter()
def xml = new groovy.xml.MarkupBuilder(writer)
xml.order(xmlns: 'urn:acme:order:3:1') {
customerId(payload.clientId)
productId(payload.productCode)
quantity(payload.quantity)
}
result = writer.toString() ]]>
</scripting:script>
</scripting:transformer>
更多精彩
赞助商链接