<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>里克的自习室 &#187; ActiveMessaging</title>
	<atom:link href="http://railser.cn/blog/tag/activemessaging/feed" rel="self" type="application/rss+xml" />
	<link>http://railser.cn</link>
	<description>关注Ruby和Rails的学习与开发</description>
	<lastBuildDate>Sun, 26 Feb 2012 12:20:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>在Flex和Rails上实现发布/订阅的消息通信</title>
		<link>http://railser.cn/blog/publish-subscribe-messaging-with-flex-and-rails</link>
		<comments>http://railser.cn/blog/publish-subscribe-messaging-with-flex-and-rails#comments</comments>
		<pubDate>Sat, 03 Nov 2007 08:14:11 +0000</pubDate>
		<dc:creator>里克</dc:creator>
				<category><![CDATA[default]]></category>
		<category><![CDATA[ActiveMessaging]]></category>
		<category><![CDATA[ActiveMQ]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[STOMP]]></category>

		<guid isPermaLink="false">http://railser.cn/archives/publish-subscribe-messaging-with-flex-and-rails</guid>
		<description><![CDATA[原文：Publish\Subscribe Messaging with Flex and Rails using Apache ActiveMQ, ActiveMessaging, and STOMP 这是一篇综合性应用很强的文章，介绍如何在Rails和flex的基础上，使用ActiveMQ，Rails上的ActiveMessaging插件，和STOMP协议，创建一个发布/订阅的通信模式。这里使用了一个例子来讲解，flex客户端/终端(consumer)接受Rails服务端发送的消息(messages)。 里克：其实这就是用Rails和flex来实现java上的JMS。java上的东西好久没有看过了。所以在继续学习下面的东西，最好还是看看《JMS简介》吧。 JMS(Java Message Service)是访问企业消息系统的标准API,它便于消息系 统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发。 下面介绍一下本文要使用的各种技术： Apache ActiveMQ Apache ActiveMQ受欢迎的，强大的通信代理[Message Broker]。 它快速，支持多种语言的客户端和协议，拥有许多高级特性，并完全支持JMS 1.1 和 J2EE 1.4。 Apache ActiveMQ 在Apache 2.0 License下发布。 ActiveMessaging ActiveMessaging将Rails带入到消息驱动开发[Messaging]中。消息驱动，或叫事件驱动结构[event-driven architecture]，广泛的应用于企业级集成。这下面的框架包括java的JMS，产品包括ActiveMQ，Tibco，IBM MQSeries等。 STOMP ActiveMessaging支持Stomp协议。这是一个通过无线连接，使用TCP/IP，实现文本型消息流式传输的协议标准。其设计理念要求尽可能将协议简化，以求无论利用哪种语言开发客户端或服务端，都能相当轻松（比如Ruby Stomp客户端代码，连带注释和空行，总行数仅约400）。因此，它几乎可以集成任何系统。[摘自《Rails ActiveMessaging入门》] 需要 Ruby 1.8.6 Rails 1.2.3 ava 1.5.0_07+ MySQL(或其他支持Rails Migrations的数据库) 源文件 Flex Application Rails [...]]]></description>
			<content:encoded><![CDATA[<pre>
<script type="text/javascript"><!--
google_ad_client = "pub-7545275883969710";
//468x60, 创建于 07-11-6
google_ad_slot = "2869362041";
google_ad_width = 468;
google_ad_height = 60;
//--></script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</pre>
<p>原文：<a href="http://flexonrails.net/?p=83">Publish\Subscribe Messaging with Flex and Rails using Apache ActiveMQ, ActiveMessaging, and STOMP</a></p>
<p>这是一篇综合性应用很强的文章，介绍如何在<a href="http://rubyonrails.org/">Rails</a>和<a href="http://labs.adobe.com/technologies/flex/">flex</a>的基础上，使用<a href="http://activemq.apache.org/">ActiveMQ</a>，Rails上的<a href="http://code.google.com/p/activemessaging/wiki/ActiveMessaging">ActiveMessaging</a>插件，和<a href="http://stomp.codehaus.org/">STOMP</a>协议，创建一个发布/订阅的通信模式。这里使用了一个例子来讲解，flex客户端/终端(consumer)接受Rails服务端发送的消息(messages)。</p>
<p>里克：其实这就是用Rails和flex来实现java上的JMS。java上的东西好久没有看过了。所以在继续学习下面的东西，最好还是看看《<a href="http://blog.csdn.net/lifaming15/archive/2007/08/22/1754926.aspx">JMS简介</a>》吧。</p>
<blockquote><p> JMS(Java Message Service)是访问企业消息系统的标准API,它便于消息系<br />
统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发。</p></blockquote>
<p>下面介绍一下本文要使用的各种技术：</p>
<h3><a href="http://activemq.apache.org/">Apache ActiveMQ</a></h3>
<blockquote><p> Apache ActiveMQ受欢迎的，强大的通信代理[Message Broker]。<br />
它快速，支持多种语言的客户端和协议，拥有许多高级特性，并完全支持JMS 1.1 和 J2EE 1.4。<br />
Apache ActiveMQ 在Apache 2.0 License下发布。</p></blockquote>
<h3><a href="http://code.google.com/p/activemessaging/wiki/ActiveMessaging">ActiveMessaging</a></h3>
<blockquote><p> ActiveMessaging将Rails带入到消息驱动开发[Messaging]中。消息驱动，或叫事件驱动结构[event-driven architecture]，广泛的应用于企业级集成。这下面的框架包括java的JMS，产品包括ActiveMQ，Tibco，IBM MQSeries等。</p></blockquote>
<h3><a href="http://stomp.codehaus.org/">STOMP</a></h3>
<blockquote><p> ActiveMessaging支持Stomp协议。这是一个通过无线连接，使用TCP/IP，实现文本型消息流式传输的协议标准。其设计理念要求尽可能将协议简化，以求无论利用哪种语言开发客户端或服务端，都能相当轻松（比如Ruby Stomp客户端代码，连带注释和空行，总行数仅约400）。因此，它几乎可以集成任何系统。[摘自《Rails ActiveMessaging入门》]</p></blockquote>
<h3>需要</h3>
<ul>
<li>Ruby 1.8.6</li>
<li>Rails 1.2.3</li>
<li>ava 1.5.0_07+</li>
<li>MySQL(或其他支持<a href="http://api.rubyonrails.org/classes/ActiveRecord/Migration.html">Rails Migrations</a>的数据库)</li>
</ul>
<h3>源文件</h3>
<ul>
<li><a href="http://www.flexonrails.net/bits/flex_sales_report.zip">Flex Application</a></li>
<li><a href="http://www.flexonrails.net/bits/rails_sales_report.zip">Rails Application</a></li>
</ul>
<h3>创建Rails应用</h3>
<p>里克：创建一个叫sales_report的应用，具体的创建可以参照源码，或者按照自己的喜好啦。</p>
<p>主要的是：</p>
<blockquote><p> script/generate model sale</p></blockquote>
<p>001_create_sales.rb的代码：</p>
<blockquote>
<pre class="ruby">&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">up</span>
    create_table <span style="color:#ff3333; font-weight:bold;">:sales</span> <span style="color:#9966CC; font-weight:bold;">do</span> |t|
      t.<span style="color:#9900CC;">column</span> <span style="color:#ff3333; font-weight:bold;">:customer</span>, <span style="color:#ff3333; font-weight:bold;">:string</span>
      t.<span style="color:#9900CC;">column</span> <span style="color:#ff3333; font-weight:bold;">:product</span>, <span style="color:#ff3333; font-weight:bold;">:string</span>
      t.<span style="color:#9900CC;">column</span> <span style="color:#ff3333; font-weight:bold;">:quantity</span>, <span style="color:#ff3333; font-weight:bold;">:integer</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span></pre>
</blockquote>
<p>创建一个controller</p>
<blockquote><p> script/generate controller sales index</p></blockquote>
<p>sales_controller.rb代码</p>
<blockquote>
<pre class="ruby">&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> SalesController &amp;lt; ApplicationController
  scaffold <span style="color:#ff3333; font-weight:bold;">:sale</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre>
<pre></pre>
</blockquote>
<p>下面要开始ActiveMessaging的部分了。<br />
$ gem install daemons<br />
$ gem install stomp<br />
$ script/plugin install</p>
<p>http://activemessaging.googlecode.com/svn/trunk/plugins/activemessaging</p>
<p>来创建一个ActiveMessaging 的processor，其实本案并不需要一个proccessor，但是它会为我们创建一些其他的文件。<br />
$ script/generate processor sale<br />
create  app/processors<br />
create  app/processors/sale_processor.rb<br />
create  test/functional/sale_processor_test.rb<br />
create  config/messaging.rb<br />
create  config/broker.yml<br />
create  app/processors/application.rb<br />
create  script/poller</p>
<p>打开config/broker.yml ，编辑stomp adapter</p>
<pre>
development:
   adapter:
   stomplogin: ""
   passcode: ""
   host: localhost
   port: 61613
   reliable: false</pre>
<p>打开config/messaging.rb 文件</p>
<blockquote>
<pre class="ruby">&nbsp;
<span style="color:#6666ff; font-weight:bold;">ActiveMessaging::Gateway</span>.<span style="color:#9900CC;">define</span> <span style="color:#9966CC; font-weight:bold;">do</span> |s|
  s.<span style="color:#9900CC;">destination</span> <span style="color:#ff3333; font-weight:bold;">:sale_queue</span>, <span style="color:#996600;">'/queue/Sale'</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre>
</blockquote>
<p>下面我们对sale model 创建一个<a href="http://api.rubyonrails.org/classes/ActiveRecord/Observer.html">Observer</a>。<br />
$ script/generate observer sale</p>
<blockquote>
<pre class="ruby">&nbsp;
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'activemessaging/processor'</span>
<span style="color:#9966CC; font-weight:bold;">class</span> SaleObserver &lt; <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Observer</span>
  <span style="color:#9966CC; font-weight:bold;">include</span> <span style="color:#6666ff; font-weight:bold;">ActiveMessaging::MessageSender</span>
  publishes_to <span style="color:#ff3333; font-weight:bold;">:sale_queue</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> after_save<span style="color:#006600; font-weight:bold;">&#40;</span>sale<span style="color:#006600; font-weight:bold;">&#41;</span>
    record = sale.<span style="color:#9900CC;">to_xml</span>
    publish <span style="color:#ff3333; font-weight:bold;">:sale_queue</span>, record
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre>
</pre>
</blockquote>
<p>这个类监视着sale model，当保存一条记录时，after_save方法被调用，这个方法将sale的AR实例转换成xml格式，发送到sale_queue中。<br />
最后，启动我们的rails服务。<br />
$ script/server</p>
<h3>安装 ActiveMQ</h3>
<p>很简单<br />
1、<a href="http://people.apache.org/repo/m2-snapshot-repository/org/apache/activemq/apache-activemq/5.0-SNAPSHOT/">先看看这个</a><br />
2、<a href="http://activemq.apache.org/getting-started.html#GettingStarted-PreInstallationRequirements">这有其他的一些介绍</a></p>
<h3>flex应用和STOMP AS3客户端</h3>
<p>使flex和ActiveMQ 通信，需要使用STOMP 协议，这有篇文章：<a href="http://docs.codehaus.org/display/STOMP/Flash">ActionScript 3 STOMP client</a>，这里我们需要做的是用flex通过STOMP连接上ActiveMQ，并能解释[consume]rails发布的xml文件。</p>
<p>这是重要的一段代码：</p>
<blockquote>
<pre class="actionscript">&nbsp;
<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> sales : ArrayCollection = <span style="color: #000000; font-weight: bold;">new</span> ArrayCollection<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> stomp : STOMPClient = <span style="color: #000000; font-weight: bold;">new</span> STOMPClient<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> queue : <span style="color: #0066CC;">String</span> = <span style="color: #ff0000;">&quot;/queue/Sale&quot;</span>;
&nbsp;
<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> init <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> : <span style="color: #0066CC;">void</span>
<span style="color: #66cc66;">&#123;</span>
	stomp.<span style="color: #0066CC;">connect</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;localhost&quot;</span>, <span style="color: #cc66cc;">61613</span><span style="color: #66cc66;">&#41;</span>;
	stomp.<span style="color: #006600;">subscribe</span><span style="color: #66cc66;">&#40;</span> queue <span style="color: #66cc66;">&#41;</span>;
&nbsp;
	stomp.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>MessageEvent.<span style="color: #0066CC;">MESSAGE</span>, handleMessages<span style="color: #66cc66;">&#41;</span>;
	stomp.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>ReceiptEvent.<span style="color: #006600;">RECIEPT</span>, handleReceipts<span style="color: #66cc66;">&#41;</span>;
	stomp.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>STOMPErrorEvent.<span style="color: #0066CC;">ERROR</span>, handleErrors<span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> handleMessages<span style="color: #66cc66;">&#40;</span>event : MessageEvent<span style="color: #66cc66;">&#41;</span> : <span style="color: #0066CC;">void</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">var</span> incomingMsg : <span style="color: #0066CC;">XML</span> = <span style="color: #0066CC;">XML</span><span style="color: #66cc66;">&#40;</span>event.<span style="color: #0066CC;">message</span>.<span style="color: #006600;">body</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #000000; font-weight: bold;">var</span> processedSale : ObjectProxy = simplerXMLDecoder<span style="color: #66cc66;">&#40;</span>incomingMsg<span style="color: #66cc66;">&#41;</span>;
	orders.<span style="color: #006600;">addItem</span><span style="color: #66cc66;">&#40;</span>processedSale<span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> handleReceipts <span style="color: #66cc66;">&#40;</span>event : ReceiptEvent<span style="color: #66cc66;">&#41;</span> : <span style="color: #0066CC;">void</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #0066CC;">trace</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Got receipt: &quot;</span> + event.<span style="color: #006600;">receiptID</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#125;</span>
<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> handleErrors <span style="color: #66cc66;">&#40;</span>event : STOMPErrorEvent<span style="color: #66cc66;">&#41;</span> : <span style="color: #0066CC;">void</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #0066CC;">trace</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Error: &quot;</span> + event.<span style="color: #0066CC;">error</span>.<span style="color: #006600;">body</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> simplerXMLDecoder <span style="color: #66cc66;">&#40;</span>x : <span style="color: #0066CC;">XML</span><span style="color: #66cc66;">&#41;</span> : ObjectProxy
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">var</span> xdoc : XMLDocument =  <span style="color: #000000; font-weight: bold;">new</span> XMLDocument<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	xdoc.<span style="color: #0066CC;">ignoreWhite</span> = <span style="color: #000000; font-weight: bold;">true</span>;
	xdoc.<span style="color: #0066CC;">parseXML</span><span style="color: #66cc66;">&#40;</span>x.<span style="color: #006600;">toXMLString</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #000000; font-weight: bold;">var</span> decoder : SimpleXMLDecoder =  <span style="color: #000000; font-weight: bold;">new</span> SimpleXMLDecoder<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">true</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #b1b100;">return</span> decoder.<span style="color: #006600;">decodeXML</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">XMLNode</span><span style="color: #66cc66;">&#40;</span>xdoc.<span style="color: #0066CC;">firstChild</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> as ObjectProxy;
<span style="color: #66cc66;">&#125;</span></pre>
</blockquote>
<p>代码解释：<br />
1、在开始的时候，我们创建了一个STOMPClient<br />
2、接下来我们定义了queue，这是我们的订阅地址，就是在messaging.rb中定义的那个。<br />
3、在这个应用加载的时候，init()方法会自动调用，它会自动连接STOMP代理(ActiveMQ)，然后订阅[subscribe]这个地址。<br />
4、这样我们就建立了一个检查来自ActiveMQ信息的监听。</p>
<p>所有实际的action操作，都是传递到handleMessages方法里：<br />
1、当Rails应用在产生并发送一个xml是调用handleMessages 方法<br />
2、当接受到一个新信息时，我们对这个信息体[body of the message](实际上是rails发送过来的xml)，使用XMLDecoder 类转化成一个可绑定对象[bindable ObjectProxy]。<br />
3、最后，一个新的销售记录增加到销售集合中，并展示在flex的数据表格中。</p>
<h3>运行一下试试</h3>
<p>http://localhost:3000/sales/new</p>
<p><a href="http://railser.cn/wp-content/uploads/2007/11/rails_sales_report.png" title="rails_sales_report.png"><img src="http://railser.cn/wp-content/uploads/2007/11/rails_sales_report.png" alt="rails_sales_report.png" /></a></p>
<p>在你的flex中可以看到<br />
<a href="http://railser.cn/wp-content/uploads/2007/11/flex_sales_report.png" title="flex_sales_report.png"><img src="http://railser.cn/wp-content/uploads/2007/11/flex_sales_report.png" alt="flex_sales_report.png" /></a></p>
<p>当一个销售记录保存到数据库后，SaleObserver 发布这个消息，ActiveMQ 将这个发布给flex应用。</p>
<p>当把你的init()方法改成下面的样子的时候</p>
<blockquote>
<pre class="ruby">&nbsp;
private function init <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span> : void
<span style="color:#006600; font-weight:bold;">&#123;</span>
        var ch : ConnectHeaders =  new ConnectHeaders<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;
	ch.<span style="color:#9900CC;">clientID</span> = <span style="color:#996600;">&quot;MYTOTALLYUNIQUECLIENTID&quot;</span>;
	stomp.<span style="color:#9900CC;">connect</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;localhost&quot;</span>, <span style="color:#006666;">61613</span>, ch<span style="color:#006600; font-weight:bold;">&#41;</span>;
&nbsp;
	var sh : SubscribeHeaders = new SubscribeHeaders<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;
	sh.<span style="color:#9900CC;">amqSubscriptionName</span> = <span style="color:#996600;">&quot;MYSUBSCRIPTION&quot;</span>;
	stomp.<span style="color:#9900CC;">subscribe</span><span style="color:#006600; font-weight:bold;">&#40;</span> queue, sh <span style="color:#006600; font-weight:bold;">&#41;</span>;
&nbsp;
	stomp.<span style="color:#9900CC;">addEventListener</span><span style="color:#006600; font-weight:bold;">&#40;</span>MessageEvent.<span style="color:#9900CC;">MESSAGE</span>, handleMessages<span style="color:#006600; font-weight:bold;">&#41;</span>;
	stomp.<span style="color:#9900CC;">addEventListener</span><span style="color:#006600; font-weight:bold;">&#40;</span>ReceiptEvent.<span style="color:#9900CC;">RECIEPT</span>, handleReceipts<span style="color:#006600; font-weight:bold;">&#41;</span>;
	stomp.<span style="color:#9900CC;">addEventListener</span><span style="color:#006600; font-weight:bold;">&#40;</span>STOMPErrorEvent.<span style="color:#9900CC;">ERROR</span>, handleErrors<span style="color:#006600; font-weight:bold;">&#41;</span>;
<span style="color:#006600; font-weight:bold;">&#125;</span></pre>
</blockquote>
<p>当连接的时候增加一个clientID和在订阅的时候增加一个subscriptionName，我们创建了一个永久的订阅者[durable subscriber]。<br />
好了，可以再次运行看一下效果了。</p>
<p>本文中文翻译：里克，guxing203 at gmail dot com，http://railser.cn</p>
<p>参考资料：<br />
<a href="http://blog.csdn.net/pengrg166/archive/2006/12/31/1471435.aspx">Apache Geronimo 的 JMS 实现：ActiveMQ  </a></p>
<p><a href="http://www.blogjava.net/cctvx1/archive/2007/02/08/98835.html">ActiveMQ 实践之路(一) 启动你的ActiveMQ</a></p>
<p><a href="http://activemq.apache.org/">http://activemq.apache.org/</a></p>
<p><a href="http://code.google.com/p/activemessaging/wiki/ActiveMessaging">ActiveMessaging is a messaging framework for Ruby and Ruby on Rails</a></p>
<p><a href="http://www.infoq.com/cn/articles/intro-active-messaging-rails">Rails ActiveMessaging入门</a></p>
]]></content:encoded>
			<wfw:commentRss>http://railser.cn/blog/publish-subscribe-messaging-with-flex-and-rails/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

