我无法在简单的测试程序中使用EventMachine.我正在运行Ruby 1.9.2(x86_64-darwin10.4.0)和Rails 3.0.1.安装了EventMachine(via gem install eventmachine),gem知道它:
gem list --local *** LOCAL GEMS *** abstract (1.0.0) ... erubis (2.6.6) eventmachine (0.12.10) i18n (0.4.2) ... tzinfo (0.3.23)
然而,当我启动rails控制台(通过rails console)并且只需要eventmachine时,它会爆炸:
ruby-1.9.2-p0 > require 'rubygems'
=> nil
ruby-1.9.2-p0 > require 'eventmachine'
LoadError: no such file to load -- eventmachine
from /Users/russ/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.1/lib/active_support/dependencies.rb:239:in 'require'
from /Users/russ/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.1/lib/active_support/dependencies.rb:239:in 'block in require'
from /Users/russ/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.1/lib/active_support/dependencies.rb:225:in 'block in load_dependency'
from /Users/russ/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.1/lib/active_support/dependencies.rb:591:in 'new_constants_in'
from /Users/russ/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.1/lib/active_support/dependencies.rb:225:in 'load_dependency'
from /Users/russ/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.1/lib/active_support/dependencies.rb:239:in 'require'
from (irb):2
from /Users/russ/.rvm/gems/ruby-1.9.2-p0/gems/railties-3.0.1/lib/rails/commands/console.rb:44:in 'start'
from /Users/russ/.rvm/gems/ruby-1.9.2-p0/gems/railties-3.0.1/lib/rails/commands/console.rb:8:in 'start'
from /Users/russ/.rvm/gems/ruby-1.9.2-p0/gems/railties-3.0.1/lib/rails/commands.rb:23:in '<top (required)>' … 我正在使用合适的Redis EM gem(在我的情况下是'em-hiredis')在EventMachine反应器循环中读取Redis集,并且必须检查一些Redis集是否包含级联中的成员.我的目标是获取非空的集合的名称:
require 'eventmachine'
require 'em-hiredis'
def fetch_queue
@redis.scard('todo').callback do |scard_todo|
if scard_todo.zero?
@redis.scard('failed_1').callback do |scard_failed_1|
if scard_failed_1.zero?
@redis.scard('failed_2').callback do |scard_failed_2|
if scard_failed_2.zero?
@redis.scard('failed_3').callback do |scard_failed_3|
if scard_failed_3.zero?
EM.stop
else
queue = 'failed_3'
end
end
else
queue = 'failed_2'
end
end
else
queue = 'failed_1'
end
end
else
queue = 'todo'
end
end
end
EM.run do
@redis = EM::Hiredis.connect "redis://#{HOST}:#{PORT}"
# How to get the value of fetch_queue?
foo = fetch_queue
puts foo
end
Run Code Online (Sandbox Code Playgroud)
我的问题是:如何告诉EM在'fetch_queue'中返回'queue'的值,以便在reactor循环中使用它?fetch_queue中的简单"return queue ='todo'","return queue ='failed_1'"等会导致"意外返回(LocalJumpError)"错误消息.
我有这个代码:
def create
message = Message.new(text: params[:message][:text], author: params[:message][:author])
if message.save
render json: {result: 'success'}
else
render json: {result: 'failure'}
end
end
Run Code Online (Sandbox Code Playgroud)
我有客户订阅了Faye Server:
var subscription = client.subscribe('/foo', function (message) {
getMessages();
});
Run Code Online (Sandbox Code Playgroud)
我想在创建消息时向Faye发布一些消息.如Faye Ruby Sever文档中所列,我必须这样做:
require 'eventmachine'
EM.run {
client = Faye::Client.new('http://localhost:9292/faye')
client.subscribe('/foo') do |message|
puts message.inspect
end
client.publish('/foo', 'text' => 'Hello world')
}
Run Code Online (Sandbox Code Playgroud)
但是当我将此代码粘贴到我的create方法中时,它会使用EventMachine阻止rails线程,并且服务器不再起作用.
当我client.publish没有使用时EventMachine,我收到错误.
如何从服务器发布到Faye?我知道有宝石喜欢faye-rails或private_pub,但我想知道如何自己做.有没有办法集成EventMachine和Rails?也许我应该在另一个线程上运行EventMachine?
我有一个基本的ruby程序,它侦听端口(53),接收数据然后发送到另一个位置(谷歌DNS服务器 - 8.8.8.8).响应不会回到原来的目的地,或者我没有正确转发它们.
这是代码.NB我正在使用EventMachine
require 'rubygems'
require 'eventmachine'
module DNSServer
def post_init
puts 'connected'
end
def receive_data(data)
# Forward all data
conn = UDPSocket.new
conn.connect '8.8.8.8', 53
conn.send data, 0
conn.close
p data.unpack("H*")
end
def unbind
puts 'disconnected'
end
end
EM.run do
EM.open_datagram_socket '0.0.0.0', 53, DNSServer
end
Run Code Online (Sandbox Code Playgroud)
任何关于调试原因或提示的想法都将非常受欢迎.
我正在运行一个使用eventmachine的守护进程.它必须具有100%的正常运行时间,即使我重新部署代码也是如此.所以我正在寻找零停机时间部署.
有没有办法让EventMachine重新加载代码而不会丢失连接?我想ConnectionHandler在一个单独的文件中定义我,然后重新加载它SIGHUP:
Signal.trap("HUP") do
load "#{path}/connection_handler.rb"
end
Run Code Online (Sandbox Code Playgroud)
但这有缺点:
有什么建议?