ActiveMessaging for Rails简介

介绍

Rails已经在数据库驱动的Web应用程序的基础上牢固地树立了自己的旗帜。 ActiveMessaging是一个Rails插件框架,通过添加简化的消息传递集成来扩展Rails领域的边界。 现在,通过ActiveMessaging和Rails,您可以与大型系统(例如发送MQ消息或J2EE Web应用程序的大型机,卸载处理长期运行的任务或创建具有事件或消息驱动的体系结构的应用程序)之间的系统松散集成。 正如其他人所说的那样,ActiveMessaging试图做消息传递,而ActiveRecord对数据库所做的事情。 本文将向您介绍ActiveMessaging和相关技术,并立即开始在Rails应用程序中使用它。

消息传递标准和代理

要使消息传递正常运行,您需要做三件事:一个通信协议,一个代理在说这个协议,以及一个应用程序的客户端库在说这个协议。 从技术上讲,第四件事是向其发送消息的系统,但是在此示例中,我们将创建一个有点可怜并且与自己对话的系统。 对于该协议,ActiveMessaging支持Stomp :流式文本消息协议。 Stomp是一种消息传递标准,用于通过有线连接(通常为tcp / ip)交换基于文本的消息。 这个想法是要使协议足够简单,以便可以用几乎任何语言轻松地创建其客户端和服务器(例如,Ruby Stomp客户端大约有400行,浸入了注释和空白行),因此应该可以集成几乎任何系统。

尽管可以使用其他代理选项 ,但Apache ActiveMQ消息代理本身就支持Stomp ,并且还会有更多选择 。 实际上,最近宣布的StompConnect项目使任何JMS代理都成为Stomp代理,这实际上将Stomp和ActiveMessaging打开到每个开源和专有消息传递产品 。 在客户端,ActiveMessaging支持使用适配器模式的协议,对于Stomp,它将Stomp RubyGem扩展为该适配器。 可能有更多的适配器正在开发中,但Stomp是当今唯一受支持的适配器。

对于本文,我将使用ActiveMQ作为代理,并使用尚未发布的4.2分支。 ActiveMQ具有适用于所有平台的安装说明 ,但是下面的简单过程假定您具有Java 1.4或更高版本:

cd /usr/local/src
#unix and cygwin
wget http://people.apache.org/repo/m2-snapshot-repository/org/apache/activemq/apache-activemq/4.2-SNAPSHOT/apache-activemq-4.2-20070221.081507-10-src.tar.gz
#os x
curl -O http://people.apache.org/repo/m2-snapshot-repository/org/apache/activemq/apache-activemq/4.2-SNAPSHOT/apache-activemq-4.2-20070221.081507-10-src.tar.gz

cd ..
tar xvfz apache-activemq-4.2-20070221.081507-10-src.tar.gz
cd apache-activemq-4.2-incubator-SNAPSHOT
./bin/activemq

而已! 默认情况下,ActiveMQ的Stomp支持应配置为自动启动,但如果没有,则应在conf / activemq.xml中添加以下行:

<transportConnectors>
...
<!-- Add this line -->
<transportConnector name="stomp" uri="stomp://localhost:61613"/>
</transportConnectors>

这是最低配置,以便按照您的意愿配置ActiveMQ,请查看ActiveMQ上ActiveMessaging Wiki页面 ,以及使用ActiveMQ指南

Rails设置

假设您已经拥有Rails 1.1+和MySql,则还需要另外2个RubyGems: daemonsStomp

sudo gem install daemons
sudo gem install stomp

让我们从一个新创建的Rails'MessageMonster'(它的数据库)开始,然后安装ActiveMessaging插件:

cd /usr/local/dev
rails MessageMonster
mysqladmin create messagemonster_development -u root
cd MessageMonster
script/plugin install http://activemessaging.googlecode.com/svn/trunk/plugins/activemessaging

所有先决条件都已准备就绪,因此是时候编写应用程序了。

处理消息

我们将从创建一个“处理器”开始,在ActiveMessaging术语中,该处理器是订阅目的地以便接收消息并对其进行操作的类。 它是消息驱动的,等同于您的控制器,以及模型,您将在其中放置大部分代码。

正如Rails教您的那样,有一个生成器可以创建处理器。 让我们创建一个保存收到的消息以显示ActiveRecord集成的消息:

script/generate processor PersistMessage

第一次运行此生成将输出以下内容:

create  app/processors
create app/processors/persist_message_processor.rb
create config/messaging.rb
create config/broker.yml
create app/processors/application.rb
create script/poller
  • app/processors是所有处理器的目录。
  • app/processors/persist_message_processor.rb是新处理器,具有默认实现,供您使用。
  • app/processors/application.rb是处理器扩展的公共超类。 使用它来放置共享代码,例如错误处理。
  • config/broker.yml配置在每种环境中如何连接到消息代理。 它等效于database.yml ,但适用于消息代理。
  • config/messaging.rb用于其余消息传递配置,例如目标和消息头。
  • script/poller程序是ActiveMessaging用于侦听消息的守护程序。 稍后将对此脚本进行更多介绍。

让我们首先检查broker.yml文件,以查看选项并确保开发代理配置正确:

development : 
adapter : stomp
login : ""
passcode : ""
host : localhost
port : 61613
reliable : true
reconnectDelay : 5
...

所有这些值正是我们默认ActiveMQ安装所需要的,但对于生产而言,您将可能具有用户名和密码,如果远程运行代理,则将使用其他主机和端口。

现在让我们看一下persist_message_processor.rb

class  PersistMessageProcessor < ApplicationProcessor 
subscribes_to :persist_message
def on_message ( message )
logger . debug " PersistMessageProcessor received: " + message
end
end

默认情况下,您将看到它已订阅:persist_message并具有一种方法on_message ,当用于:persist_message订阅的消息到达时,它将由ActiveMessaging调用。 消息的主体作为字符串参数message传入,但是如果您需要访问Stomp消息对象本身,则可以在@message处理器属性中使用它。 处理器可以订阅多个队列,只需花药调用添加到subscribes_to

:persist_message符号是该处理器订阅的目标的逻辑名称,该目标的定义在config/messaging.rb生成:

ActiveMessaging :: Gateway . define do | s | 
s . queue :persist_message , ' /queue/PersistMessage '
end

要使用比较的Rails, messaging.rb是最喜欢routes.rb 。 它允许您将逻辑名( :persist_message )映射到代理上的目标( /queue/PersistMessage )。 尽管可以在此处配置更多内容,但是对于此示例,可以使用生成的默认值。

现在,我们将指导处理器为下雨天保存其消息,从为消息创建模型开始。

script/generate model message

现在,使用另外2列更新'db / migrate / 001_create_messages.rb':

create_table :messages do | t | 
t . column :body , :text
t . column :received_date , :datetime
end

调用迁移以创建表...

rake db:migrate

...然后更新处理器的on_message方法以使用新的Message模型:

def  on_message ( message ) 
logger . debug " PersistMessageProcessor received: " + message
my_message = Message . create ( :body= > message , :received_date= > DateTime . new )
end

现在,您正在查看此内容,并认为这并不是什么新鲜事物-这就是您在Rails控制器中编写相同内容的方式。 关键是,当您使用ActiveMessaging时,可以使用Rails应用程序环境的所有便利。

使用处理器来捕获它们,是时候开始抛出消息了(瓶单独出售)。

传送讯息

要发送消息,我们将在同一应用程序中使用Rails视图和控制器:

脚本/生成控制器的SendMessage索引

编辑视图以提交消息文本,并显示以前保留的消息的可刷新列表:

<p style= "color: green" > <%= flash [ :notice ] %> </p> <h1> Send Message </h1> <%= start_form_tag :action => 'new' %> <label > Message </label> <%= text_field_tag :message , @message %>  <%= submit_tag "submit" %> <%= end_form_tag %> <%= link_to "Refresh List" , :action => "index" %> <table> <% @messages . each do | m | -%>   <tr><td> <%= m . received_date %> </td><td> <%= m . body %> </td></tr> <% end %> </table> 

编辑控制器以发送消息。 为了简化从任何类的发送,ActiveMessaging提供了一个mixin MessageSender ,它提供了一种简单的发布方法。 publishes_to方法声明一个类打算将目标发送到哪个目标,但是只不过要验证目标是否在config/messaging.rb 。 控制器如何使用以下方法:

require ' activemessaging/processor ' 

class SendMessageController < ApplicationController

include ActiveMessaging :: MessageSender
publishes_to :persist_message

def index
@messages = Message . find :all
end

def new
@message = params [ :message ]
publish :persist_message , @message
flash [ :notice ] = " ' #{@message} ' sent "
@messages = Message . find :all
render :action => ' index '
end
end

正如他们所说,就是那样。 控制器将在提交时发送一条消息,然后当您下次查看或刷新页面时,您将看到处理器保存的消息。

运行示例

ActiveMessaging在自己的进程中运行,该进程由script/poller ,这可能是一个陷阱–如果要接收消息,仅启动Rails服务器是不够的,并且消息接收到与Rails不同的运行进程中。 要运行此示例,我们需要3个过程:ActiveMQ代理,正在运行以发送消息的Rails服务器以及用于接收消息的script/poller ,每个过程都在各自的终端中运行:

启动ActiveMQ:

cd /usr/local/apache-activemq-4.2-incubator-SNAPSHOT
./bin/activemq

启动Rails:

cd /usr/local/dev/MessageMonster
script/server

运行ActiveMessaging:

cd /usr/local/dev/MessageMonster
script/poller run

script/poller遵循通常的守护程序语义。 除了将运行置于前台的“运行”之外,您还可以将其传递给“开始”,“停止”,“重新启动”和“状态”。 它还使用允许您同时运行多个实例,这对于处理大量消息很有用。

现在,导航到测试页面(即http:// localhost:3000 / send_message ),然后输入一条消息,例如规范的“ Hello World”。 发送消息后,您应该在轮询器窗口中看到以下内容:

Loading /usr/local/dev/MessageMonster/app/processors/application.rb
Loading /usr/local/dev/MessageMonster/app/processors/persist_message_processor.rb
=> Subscribing to /queue/PersistMessage (processed by PersistMessageProcessor)
=> All subscribed, now polling
PersistMessageProcessor received: Hello World

poller始终显示启动时加载的处理器以及代理程序上的订阅请求。 如果代理不可用或丢失,它将根据您的broker.yml配置尝试重新连接。 轮询器开始输出之后,现在您还可以看到ActiveMessaging处理器已接收到Rails发送的消息。 同样,如果使用“刷新列表”按钮,ActiveMessaging处理器将其保留后,就会在Rails视图中看到该消息。

从这往哪儿走

我希望您喜欢ActiveMessaging的简介,希望您能看到它的潜力和易用性。 ActiveMessaging具有本文未涵盖的更高级功能,例如,改进的异常处理,将由多个轮询器运行的处理器分组或如何将Stomp和ActiveMQ消息头用于同步消息传递,JMS集成和选择性订阅之类的技巧。 如果您在看过ActiveMessaging的基本知识后仍在考虑这些问题,我想您可能会感到惊喜。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值