gpt4 book ai didi

ruby-on-rails - 多事件机器导致一个报告未定义的方法 `stop' 为 nil :NilClass

转载 作者:行者123 更新时间:2023-12-04 03:52:52 26 4
gpt4 key购买 nike

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

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

当尝试调用 EventMahine.stop 时,它在方法 stop 中的 Client 类中报告它在说:

undefined method `stop' for nil:NilClass

谁能指出我哪里错了,如果您有任何解决方法的建议?

最佳答案

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

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

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

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

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

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

关于ruby-on-rails - 多事件机器导致一个报告未定义的方法 `stop' 为 nil :NilClass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19126632/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com