在 Flex on Rails 上张贴的一篇文章中,Derek Wischusen 与我们分享了他使用 ActionScript 3 STOMP 客户端将 RabbitMQ 与 Flex 3 集成在一起的试验。
RabitMQ 是一个开源的企业消息传递系统:
RabitMQ 是一个完整的、高可靠的企业消息传递系统。RabbitMQ 客户端类库及后台程序(broker daemon)可一起被用于创建一个 AMQP 网络,或者单独使用它们以便给建立起来的网络带来 RabbitMQ 的好处。
RabitMQ 是 AMQP 协议的实现,该协议是消息传递中间件的一个开放标准。 STOMP 则是面向流文本的消息传递协议。Wischusen 所尝试的是去利用 RabbitMQ 的 STOMP 适配器。
为了使读者理解该试验是如何工作的,Wischusen 给我们共享了相应的资源和源代码:
- 按照其指南所示步骤,让带有 STOMP 适配器的 RabbitMQ 来运行。
- 下载 Flex 例子应用的项目文件。
接下来,Wischusen 解释了这个 Flex 例子项目到底实现了什么:
该项目有两个单独的应用组成:ImageSender 和 ImageReceiver。该项目文件也包含了已编译的 as3-stomp 类库,这样你就无需单独下载它了。
ImageSender 和 ImageReceiver 应用将通过 STOMP 协议使用 RabbitMQ 交换消息来进行通讯。为了证明来自两个应用的 Flex 代码是如何与 STOMP 客户端一起工作的,Wischusen 分享了这一代码片断。
在 ImageSender 方面:
"stomp" /><br></br> ...<p><span>private</span> <span>function</span> init () : <span>void</span> </p><br></br> { <br></br><span>var</span> ch: ConnectHeaders = <span>new</span> ConnectHeaders(); <br></br> ch.login = <span>"guest"</span>; <br></br> ch.passcode = <span>"guest"</span> <br></br> stomp.connect(<span>"localhost"</span>, 61613, ch); <br></br> }<br></br> ...<br></br><span>private</span> <span>function</span> sendImage():<span>void</span> <br></br> {<br></br><span>var</span> image: ByteArray = ImageSnapshot.captureImage(canvas).data; <br></br> stomp.send(destination, image); <br></br> } <br></br>
在 ImageReceiver 方面:
"stomp" message=<span>"handleMessages(event)"</span> /><br></br>...<br></br><span>private</span> <span>var</span> destination: String = <span>"/queue/images"</span>; <p><span>private</span> <span>function</span> init () : <span>void</span> </p><br></br> { <br></br><span>var</span> ch: ConnectHeaders = <span>new</span> ConnectHeaders(); <br></br> ch.login = <span>"guest"</span>; <br></br> ch.passcode = <span>"guest"</span> <br></br> stomp.connect(<span>"localhost"</span>, 61613, ch); <br></br> stomp.subscribe( destination ); <br></br> } <br></br>...<p><span>private</span> <span>function</span> handleMessages(<span>event</span> : MessageEvent) : <span>void</span> </p><br></br> { <br></br><span>var</span> bd: BitmapData = <span>new</span> BitmapData(canvas.width, canvas.height); <br></br><span>var</span> loader : flash.display.Loader = <span>new</span> flash.display.Loader(); <br></br> loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onBytesLoaded); <br></br> loader.loadBytes(<span>event</span>.message.body); <br></br><span>function</span> onBytesLoaded (<span>event</span> : Event) : <span>void</span> <br></br> { <br></br><span>var</span> content : DisplayObject = LoaderInfo( <span>event</span>.target ).content; <br></br> bd.draw( content ); <br></br> canvas.graphics.beginBitmapFill(bd); <br></br> canvas.graphics.drawRect(0,0, canvas.width, canvas.height); <br></br> canvas.graphics.endFill(); <br></br> } <br></br> } <br></br>
该试验示范了一个图像是如何从 Flex 应用端(ImageSender)被捕获的,该图像怎么被发送至 RabbitMQ 服务器,消息如何被发送到消息消费者应用(ImageReceiver),以及这个消息怎样触发了一个事件而从 RabbitMQ 服务器装载这个图像。这是面向消息的 RIA 应用概念的 一个有趣的演示。
评论