Ruby on rails Rails和XMPP(Jabber)bot:关于(异步?)队列的建议
因此,我正在使用Rails构建一个小应用程序。我需要使用xmppproto来通知用户,并使用一些命令来更改用户状态 以前的版本是一个使用普通Python(相当丑陋的应用程序)的应用程序,它将普通SQL请求放入数据库。有一个表“jabber_queue”,所以在单独的脚本中,bot每秒检查任何行,处理它(发送消息),删除。这很简单也很愚蠢,但还行 现在我明白了,我需要将这个bot功能集成到Rails中(至少要与RSpec一起工作) 这是我的几个版本的方法:Ruby on rails Rails和XMPP(Jabber)bot:关于(异步?)队列的建议,ruby-on-rails,xmpp,message-queue,background-process,Ruby On Rails,Xmpp,Message Queue,Background Process,因此,我正在使用Rails构建一个小应用程序。我需要使用xmppproto来通知用户,并使用一些命令来更改用户状态 以前的版本是一个使用普通Python(相当丑陋的应用程序)的应用程序,它将普通SQL请求放入数据库。有一个表“jabber_queue”,所以在单独的脚本中,bot每秒检查任何行,处理它(发送消息),删除。这很简单也很愚蠢,但还行 现在我明白了,我需要将这个bot功能集成到Rails中(至少要与RSpec一起工作) 这是我的几个版本的方法: 使用分离异步队列解决方案。例如,Resq
我很抱歉在我的问题中有这么多的话,这只是一个头脑风暴。我看到了一些解决方案,但我真的需要经验丰富的开发人员的建议和建议。所以,这是用“是的,第三种方法”解决的
awesomo.rb
。没什么特别的,真的。我把它放在Rails项目的/lib/
中。第二,config/awesomo.yml
awesomo\u daemon.rb
。同样,在/lib/
中。它包含以下内容:
脚本/awesomo
script/awesomo start
运行它awesomo.rb
中使用我的任何模型!另外,对于队列,我使用了小模型-XMPPJob,其中包含字段jtype(例如,“xmpp_message”)、body(“hey!”)和to(”john@jabber.com"). 在具有限制(5)的bot类的awesomo.rb
idle
函数中获取它。每个do | job | case jtype…
要为我的“awesomo”发布任何新工作,我使用函数send\u message
:
除了XMPP库(
xmpp4r simple
)本身之外,一切都运行得很好,但我很快就会用xmpp4r
重写它。从一些google结果中,我发现了一个使用forked delayed_job的想法:用我的工作设置一个类(XMPP bot的生命周期,我的理解是正确的),但还有另一个问题——我需要在生命周期任务中处理其他任务(例如:send_xmpp_msg)。所以我需要检查另一个任务中的任务队列。所以我需要创建另一个队列。天啊,看来我需要另一个解决办法。有什么想法吗?+1
分享您的解决方案和详细答案:)
development:
xmpp_jid: ...
xmpp_password: ...
#preload rails environment
require File.expand_path(File.join(File.dirname(__FILE__),
'..', 'config', 'environment'))
#load xmpp bot class
require 'awesomo_daemon'
#load xmpp bot configuration file for current environment
AWESOMO_CONFIG = YAML.load_file(File.join(File.dirname(__FILE__),
'..', 'config', 'awesomo.yml'))[Rails.env]
#apply configuration before singleton will be initiated
Awesomo.setup AWESOMO_CONFIG['xmpp_jid'], AWESOMO_CONFIG['xmpp_password']
loop {
Awesomo.instance.idle
sleep 1
}
#!/usr/bin/env ruby
require 'rubygems'
require 'daemons'
Daemons.run "lib/awesomo_daemon.rb", dir_mode: :normal,
dir: File.join(File.dirname(__FILE__), '..', 'tmp', 'pids')
def self.send_message to, body
xmppjob = XmppJob.new :jtype => "xmpp_message", :body => body, :to => to
xmppjob.save
end