mule in action翻译20 : 3.8 使用VM传输
mule in action翻译20 : 3.8 使用VM传输
VM传输是一个特殊的传输类型,你用它向Mule实例运行的JVM发送消息。通过VM endpoint发送的消息可以处理为事务性的并且可以持久化到磁盘。这使你获得了分层式的可靠性并且解耦了流--不在需要一个外部的消息代理。
本节将看这是如何做到的。在第9章讨论mule对事务的支持时,我们将重新使用VM传输实现可靠的方式。
表3.8展示了一些你可以设置的VM 传输的属性。
3.8.1 介绍VM传输的可靠性
你在列表3.2中看到了Prancing Donkey如何发送支出报表到Arnor Accounting提供的URL.他们想出的方法是从文件系统的一个共享目录读入支出报表然后把电子表格发送到一个URL.文件系统和HTTP都不是事务性资源,那么当其中一个操作失败时将导致支出报表的丢失。因此,我们来做把流变的可靠的第一步--使用VM传输解耦每个endpoint。见下面列表说明。
(图示见3.21)
Listing 3.26 Using VM endpoints to implement reliability patterns
<flow name="readExpensesFromFilesystemFlow"> <file:inbound-endpoint path="./data/expenses/in" pollingFrequency="60000"> <file:filename-regex-filter pattern=".*xls$" caseSensitive="false"/> </file:inbound-endpoint> <!--分发消息到expenses VM queue--> <vm:outbound-endpoint path="expenses"/> </flow> <flow name="postExpenses"> <!--从expenses VM queue接收消息--> <vm:inbound-endpoint path="expenses"/> <http:outbound-endpoint host="${http.host}" port="${http.port}" method="POST" path="expenses/prancingdonkey"/> </flow>
这种方式类似于使用JMS对流进行解耦。这样做的好处是不会导致管理开销和运行JMS代理的性能开销,并且这时消息处理是异步的。通过expenses 队列传送的消息将持久化到磁盘,所以出现Mule关闭或失败事件时,这些消息仍能传送到HTTP outbound endpoint。第9章你将看到怎么使分发和接收都具有事务,提高两个流的真正的可靠性。
VM QUEUES AND FLOWS 在mule2中使用VM 队列把服务组合起来是一种常见的方式。
在mule3中引入的流和其支持的功能,像 flow refs 、 subflows,使得 VM传输
在这种情况下变的不再怎么有用了。但它确实提供了一个可靠模式,这点我们在第7章详谈。
VM传输存储消息的特性可以通过定义VM连接器的子项--队列配置文件 来进行配置。一些配置属性
见表3.9
列表3.27 展示了一个队列配置文件,关闭了持久化(所有消息保存在内存)并限制了消息数量为1000.
如果你能容忍消息丢失且很关心VM队列的吞吐量的话,关闭持久化是有用的。
VM传输的交换方式 VM传输支持 请求-响应的交换方式 ,在这方面它表现的和JMS传输比较相似。
Listing 3.27 Explicitly configuring a VM queue profile
<vm:connector name="fastVMQueue"> <!--注释1 定义非持久化队列 缓冲上限是1000个消息--> <vm:queue-profile persistent="false" maxOutstandingMessages="1000"/> </vm:connector>
VM传输一收到消息就开始运送他们,可认为其速度比JMS快。当你调整流和组件时,请注意一点,VM队列的重载是很容易的。参数maxOutstandingMessages 表明VM传输的缓存最大是1000个消息--如果消息到达的他快以至流不能及时处理时。当缓存满时,再到达的消息将会丢失。我们将在第11章讨论调优的细节。
使用VM传输给你带来了解耦中间件、避免了管理代理的开销。你看到了VM 传输如何促进了可靠模式的实现--可以使不可靠的传输(比如文件、HTTP)变的可靠的技术。你也看到了如何配置 VM队列,允许你覆盖VM传输的默认的队列和持久化行为。