<?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/index.php/blog/tag/activemessaging/feed" rel="self" type="application/rss+xml" />
	<link>http://railser.cn</link>
	<description>关注Ruby和Rails的学习与开发</description>
	<lastBuildDate>Thu, 05 Aug 2010 03:15:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>在Flex和Rails上实现发布/订阅的消息通信</title>
		<link>http://railser.cn/index.php/blog/publish-subscribe-messaging-with-flex-and-rails</link>
		<comments>http://railser.cn/index.php/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 lang="ruby">
  def self.up
    create_table :sales do |t|
      t.column :customer, :string
      t.column :product, :string
      t.column :quantity, :integer
    end
  end</pre>
</blockquote>
<p>创建一个controller</p>
<blockquote><p> script/generate controller sales index</p></blockquote>
<p>sales_controller.rb代码</p>
<blockquote>
<pre lang="ruby">
class SalesController &lt; ApplicationController
  scaffold :sale
end</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 lang="ruby">
ActiveMessaging::Gateway.define do |s|
  s.destination :sale_queue, '/queue/Sale'
end</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 lang="ruby">
require 'activemessaging/processor'
class SaleObserver < ActiveRecord::Observer
  include ActiveMessaging::MessageSender
  publishes_to :sale_queue

  def after_save(sale)
    record = sale.to_xml
    publish :sale_queue, record
  end
end</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 lang="actionscript">
private var sales : ArrayCollection = new ArrayCollection();

private var stomp : STOMPClient = new STOMPClient();
private var queue : String = "/queue/Sale";

private function init () : void
{
	stomp.connect("localhost", 61613);
	stomp.subscribe( queue );

	stomp.addEventListener(MessageEvent.MESSAGE, handleMessages);
	stomp.addEventListener(ReceiptEvent.RECIEPT, handleReceipts);
	stomp.addEventListener(STOMPErrorEvent.ERROR, handleErrors);

}

private function handleMessages(event : MessageEvent) : void
{
	var incomingMsg : XML = XML(event.message.body);
	var processedSale : ObjectProxy = simplerXMLDecoder(incomingMsg);
	orders.addItem(processedSale);
}

private function handleReceipts (event : ReceiptEvent) : void
{
	trace ("Got receipt: " + event.receiptID)
}
private function handleErrors (event : STOMPErrorEvent) : void
{
	trace ("Error: " + event.error.body)
}

private function simplerXMLDecoder (x : XML) : ObjectProxy
{
	var xdoc : XMLDocument =  new XMLDocument();
	xdoc.ignoreWhite = true;
	xdoc.parseXML(x.toXMLString());
	var decoder : SimpleXMLDecoder =  new SimpleXMLDecoder(true);
	return decoder.decodeXML(XMLNode(xdoc.firstChild)) as ObjectProxy;
}</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 lang="ruby">
private function init () : void
{
        var ch : ConnectHeaders =  new ConnectHeaders();
	ch.clientID = "MYTOTALLYUNIQUECLIENTID";
	stomp.connect("localhost", 61613, ch);

	var sh : SubscribeHeaders = new SubscribeHeaders();
	sh.amqSubscriptionName = "MYSUBSCRIPTION";
	stomp.subscribe( queue, sh );

	stomp.addEventListener(MessageEvent.MESSAGE, handleMessages);
	stomp.addEventListener(ReceiptEvent.RECIEPT, handleReceipts);
	stomp.addEventListener(STOMPErrorEvent.ERROR, handleErrors);
}</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/index.php/blog/publish-subscribe-messaging-with-flex-and-rails/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
