多事件机器导致一个人报告未定义的方法`stop'为零:NilClass

时间:2013-10-01 21:53:15

标签: ruby-on-rails jruby

我在两个单独的模块中有两个类(我知道现在不是很好用:/) 我有这样的事情:

module MQ
  class Client

    def self.start(opts = {})
      new(opts).start
    end

    def initialize(queue, message)
      @template_message = message
      @queue = queue
    end

    def start
       EventMachine.run do
          #some code to send message via AMQP
          Signal.trap("INT")  { connection.close { EventMachine.stop { exit } }}
          Signal.trap("TERM") { connection.close {EventMachine.stop { exit(0) } }}
          Signal.trap("INFO") { puts "Current active statements: #{statements.keys.inspect}" }
        end
    end

    def stop
      EventMachine.stop
    end
  end
end

接下来我定义了Server类:

module Esper
  class Server

    def self.start(opts = {})
      new(opts).start
    end

    def initialize(options)
    end

    def start
       EventMachine.run do
          #some code here to receive messages
          Signal.trap("INT")  { connection.close { EventMachine.stop { exit } }}
          Signal.trap("TERM") { connection.close {EventMachine.stop { exit(0) } }}
          Signal.trap("INFO") { puts "Current active statements: #{statements.keys.inspect}" }
        end
    end

    def stop
      EventMachine.stop
    end
  end
end

现在我有了rspec(这里是错误报告):

context "matched messages" do

    before :each do 
      @template_message = { }

      @server = Esper::Server.new
      @client = MQ::Client.new("queue_name", @template_message)

    end

    describe "transfer" do
      it "should receive statements" do
        Thread.new do
          @server.start
        end

        Thread.new do
          @client.start
        end

        puts "Sleep for 6 seconds"
        sleep(6.0)

        #some check here

        @server.stop
        @client.stop  # and here it reports when I am trying to access nil class in class client in method stop.
      end

    end

在尝试呼叫Client时,方法stop中的EventMahine.stop班级正在报告 它说:

undefined method `stop' for nil:NilClass

有人可以指出我在哪里错了,如果你有任何建议如何解决它?

2 个答案:

答案 0 :(得分:0)

sooooo,这有点难以解释......

你试图将代码包装在模型中,这在代码组织方面是一件好事。

事情是,它在这里不起作用!

EventMachine使用一个名为ReactorPattern的方法,如果您想同时处理大量并发连接,这个方法非常有用。如果我不是完全错误,它使用runloop将工作分配给它的客户/反应器以异步处理它。你可以在这里找到一篇好的文章:http://www.igvita.com/2008/05/27/ruby-eventmachine-the-speed-demon/

从我所知道的(不是很多),只有一个runloop。我认为这也反映在您使用EventMachine API的方式中。这只是阶级方法,所以全球状态。如果您说EventMachine.stop一次,则对EventMachine.stop的下一次调用可能无效,它已经停止了。我不知道为什么错误如此奇怪......

当您编写客户端和服务器应用程序时,通常在不同的进程中执行此操作,其中每个进程都有自己的runloop,因此这不应该是一个问题。它只是在你的测试中。

答案 1 :(得分:0)

我遇到了这个问题因为我试图合并esper和ampq。 通过使用稍微不同的方法显示我克服的问题。我仍然不知道为什么它给nil指针异常。 我的解决方案是使用deamon-kit gem作为rails。我用这个工具包创造了一个守护神。

deamon是我原始应用程序中的一个单独的应用程序。这样我可以在它的单独文件夹中测试ampq,当我想测试整个应用程序时,我可以从原始应用程序中运行deamon,将数据发送到deamon,然后检查原始应用程序中的返回值。