3

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

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

接下来我定义了服务器类:

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在方法中的类中报告 它说:stopEventMahine.stop

undefined method `stop' for nil:NilClass

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

4

2 回答 2

0

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

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

问题是,它在这里不起作用!

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

据我所知(不是很多),只有一个运行循环。我认为这也反映在您使用 EventMachine API 的方式上。这一切都只是类方法,所以是全局状态。如果你说EventMachine.stop一次,下一次调用EventMachine.stop可能不会起作用,它已经停止了。我不知道为什么错误如此奇怪......

当您编写客户端和服务器应用程序时,您通常在不同的进程中执行此操作,每个进程都有自己的运行循环,所以这应该不是问题。它只是在你的测试范围内。

于 2013-10-06T14:17:34.273 回答
0

我遇到了这个问题,因为我试图合并 esper 和 ampq。我通过使用稍微不同的方法克服了这个问题。我仍然不知道为什么它给出了 nil 指针异常。我的解决方案是使用deamon-kit宝石作为导轨。我使用这个工具包创建了一个守护进程。

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

于 2013-10-14T07:22:54.430 回答