10

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

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

4

2 に答える 2

13

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

これは、トポロジ送信時に構成マップにオブジェクトを配置する方法です。

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

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

これは、ボルトまたはスパウトの prepare() メソッドで取得する方法です。

prepare(Map stormConf,TopologyContext context) {

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

} 
于 2013-08-30T22:24:34.623 に答える
3

どういう意味かよくわかりませんが、ボルトクラスは常に初期化時にパラメーターを受け取ることができ、トポロジを作成するときに渡したいオブジェクトでそれを初期化できます。

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

そして、ボルト コンストラクターは、このオブジェクトを引数として受け取ることができます。

編集:コンストラクターに明示的に渡さずにデータにアクセスできるようにする場合は、常に静的クラスを作成してこのデータを保存し、ボルトオブジェクトからアクセスできます

于 2013-08-02T05:55:54.600 に答える