2013-08-02 27 views
8

トポロジを作成するときにオブジェクトを渡す必要があります。これにより、ボルトがそのオブジェクトにアクセスしてそのオブジェクトに基づいて処理を行うことができます。 TopplogyContext経由でオブジェクトを渡すことは可能ですか?または、トポロジを送信するときにオブジェクトを渡す他の方法がありますか?その前に、ボルトがハンドル/コントロールを持つことができるようにしてください。ストーム使用時にトポロジーコンテキストからボルトにオブジェクトにアクセスするにはどうすればよいですか?

すべてのボルトがそれにアクセスできるように、コンテキストを介してオブジェクトを渡す必要があります。そのトポロジのすべてのボルトにコンストラクタを強制的に実装する必要はありません。だから、同じことをするAPIがあるかどうかを知りたいのですか?

答えて

11

オブジェクトを渡すことができますストーム構成マップ内のオブジェクトで、シリアル化可能であることを条件とします。 トポロジ内のスパウトまたはボルトのprepare()メソッドでは、このオブジェクトを取得できます。

これは、あなたがトポロジの提出に構成マップであなたのオブジェクトを置く方法です:

Config conf = new Config(); 
MyObject myPreciousObject = new MyObject("precious"); 
conf.put("my.object",myPreciousObject); 

StormSubmitter.submitTopology(args[0], conf, builder.createTopology()); 

これは、あなたがボルトや注ぎ口の準備()メソッドでそれを取得する方法である:

prepare(Map stormConf,TopologyContext context) { 

    MyObject myPreciousObject = (MyObject) stormConf.get("my.object"); 

} 
3

私はあなたが何を意味するかはよく分かりませんが、ボルトクラスは初期化時に常にパラメータを取ることができ、トポロジを作成するときに渡すオブジェクトで初期化できます。

TopologyBuilder builder = new TopologyBuilder(); 
builder.setSpout("spout", new mySpout()); 
builder.setBolt("bolt", new myBolt1(myObj)).shuffleGrouping("spout"); 

あなたのボルトコンストラクタはこのオブジェクトを引数として取ることができます。

編集: あなたはデータがコンストラクタに明示的に渡さずにアクセスできるようにしたい場合は、再度、常にこのデータを格納するための静的クラスを作成し、ボルトからアクセスすることができます

+0

これは1つのボルト実装で解決されましたが、同じオブジェクト "myObj"を持つコンストラクタを使用して、そのトポロジビルディングのすべてのボルトに実装する必要があります...私たちはボルト "myObj"をシームレスに渡す必要がありますすべてのボルトのトポロジで... – user1996684

+2

@ user1996684データが必要な場合o明示的にコンストラクタに渡さずにアクセス可能な場合は、このデータを格納する静的クラスを作成し、ボルトオブジェクトからアクセスすることもできます。 – Munim

関連する問題