标签: eventmachine

无法在Rails控制台中加载Ruby EventMachine - 无需加载此类文件

我无法在简单的测试程序中使用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)>' …

ruby ruby-on-rails eventmachine ruby-on-rails-3

1
推荐指数
1
解决办法
4940
查看次数

Ruby EventMachine和函数

我正在使用合适的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)"错误消息.

ruby eventmachine redis

1
推荐指数
1
解决办法
671
查看次数

如何从Rails控制器推送到Faye Server?

我有这个代码:

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-railsprivate_pub,但我想知道如何自己做.有没有办法集成EventMachine和Rails?也许我应该在另一个线程上运行EventMachine?

ruby ruby-on-rails eventmachine faye

1
推荐指数
1
解决办法
2335
查看次数

转发请求UDPSocket

我有一个基本的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)

任何关于调试原因或提示的想法都将非常受欢迎.

ruby dns udp network-programming eventmachine

0
推荐指数
1
解决办法
946
查看次数

EventMachine和Live Reload

我正在运行一个使用eventmachine的守护进程.它必须具有100%的正常运行时间,即使我重新部署代码也是如此.所以我正在寻找零停机时间部署.

有没有办法让EventMachine重新加载代码而不会丢失连接?我想ConnectionHandler在一个单独的文件中定义我,然后重新加载它SIGHUP:

Signal.trap("HUP") do
  load "#{path}/connection_handler.rb"
end
Run Code Online (Sandbox Code Playgroud)

但这有缺点:

  • 它不会重新加载EventMachine本身(在gem更新的情况下需要它)
  • 我不知道这是否有效.

有什么建议?

ruby eventmachine

0
推荐指数
1
解决办法
232
查看次数