3

私は2つの別々のモジュールに2つのクラスを持っています(私は今のところそれが良い使い方ではないことを知っています:/)私はこのようなものを持っています:

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、メソッドのクラスで報告され ますstopEventMahine.stop

undefined method `stop' for nil:NilClass

どこが間違っているのか、それを修正する方法について何か提案があれば教えてもらえますか?

4

2 に答える 2

0

esper と ampq を組み込もうとしていたため、この問題が発生しました。私が示している問題は、多少異なるアプローチを使用して克服しました。なぜ nil ポインター例外が発生したのかはまだわかりません。私の解決策はdeamon-kit、レールに宝石を使用することでした。このキットを使用してデーモンを作成しました。

デーモンは、元のアプリケーション内の別のアプリケーションです。そうすれば、個別のフォルダーで ampq をテストできます。アプリケーション全体をテストする場合は、元のアプリケーション内からデーモンを実行し、データをデーモンに送信してから、元のアプリケーションで返された値を確認できます。

于 2013-10-14T07:22:54.430 に答える
0

うーん、これは説明するのが少し難しいです...

コードをモデルにラップしようとしていますが、これはコード編成の点では良いことです。

問題は、ここではそのようには機能しないということです!

EventMachine は、多数の同時接続を同時に処理する場合に非常に役立つ ReactorPattern というメソッドを使用します。私が完全に間違っていなければ、ランループを使用して作業をクライアント/リアクターに分散し、非同期で処理します。ここで良い記事を見つけることができます: http://www.igvita.com/2008/05/27/ruby-eventmachine-the-speed-demon/

私が知っていることから(これはあまり多くありません)、ランループは1つだけです。これは EventMachine API の使い方にも反映されていると思います。それはすべて単なるクラスメソッドなので、グローバル状態です。一度言うとEventMachine.stop、次の呼び出しEventMachine.stopはおそらく機能しません。既に停止しています。エラーがなぜそんなに奇妙なのかわかりませんが...

クライアントとサーバーのアプリケーションを作成するときは、通常、それぞれが独自の実行ループを持つ異なるプロセスでこれを行っているため、問題になることはありません。それはあなたのテストの範囲内です。

于 2013-10-06T14:17:34.273 に答える