2017-02-02 3 views
1

私は、同時に実行されている2つのスレッドがある大きなデータアプリケーションをプログラミングしています。スレッドAはネットワークからデータを受け取り、JSONOBJECTとしてBlockingQueueに配置します。スレッドB、嵐吐き出し、BlockingQueueから読み取り、それらを処理します。嵐の噴出口でBlockingQueueを共有

私はBlockingQueueオブジェクトをクラスコンストラクタのspoutクラスに渡します。私が見つけた問題は、スパウトのBlockingQueueが空であることです。この問題をどうやって解決するのか教えてください。

答えて

1

トポロジを構築してオブジェクトのセットとして構成し、そのオブジェクトのコレクション(jarファイルとともに)をNimbusサーバーに送信するクラスを実行して、ストームアプリケーションを起動します。これらのオブジェクトのいくつかは、スパウトとボルトのインスタンスであり、トポロジの提出の一部としてシリアル化されます。クラスタ上のボルトとスパウトの各インスタンスは、これらの逆シリアル化されたオブジェクトの1つです。したがって、トポロジを最初に起動すると(通常はエッジノード上で)、クラスタ上ではなくすべてのボルトとスパウトが構築されます。

これは、クラスの初期化とオブジェクトの構築時にスパウトによって参照されるオブジェクトがすべて、spoutインスタンスとともにシリアル化されることを意味します。これにはBlockingQueueが含まれます。あなたのBlockingQueueはシリアル化され、クラスタに配布されており、旅行中に生き残っていないように思えます。

あなたがしたいことは、ブロックキューの変数をコンストラクタでnullのままにして、open()メソッドで変数を設定することです。実際のキューオブジェクトを作成するときには、spoutのopen()メソッドで使用できるように、パブリック静的変数に格納することができます。

関連する問題