我在两个单独的模块中有两个类(我知道现在不是很好用:/) 我有这样的事情:
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
有人可以指出我在哪里错了,如果你有任何建议如何解决它?
答案 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,然后检查原始应用程序中的返回值。