2013-08-02 13 views
8

Podczas tworzenia topologii musimy przekazać obiekt, aby śruba mogła uzyskać do niego dostęp i wykonać dalsze przetwarzanie na podstawie tego obiektu. Czy możliwe jest przekazanie obiektu przez TopplogyContext, a jeśli tak, to w jaki sposób? Czy istnieją jeszcze inne sposoby na przekazanie obiektu podczas składania topologii, przed przesłaniem, aby śruba mogła mieć na sobie uchwyt/sterowanie?Jak uzyskać dostęp do obiektu z kontekstu topologii do śruby podczas korzystania z burzy?

Musimy przekazać obiekt przez kontekst, aby wszystkie śruby mogły uzyskać do niego dostęp i nie ma potrzeby wymuszania implementacji konstruktora we wszystkich śrubach dla tej topologii. Tak, chciał wiedzieć, czy istnieje jakieś API, aby zrobić to samo?

Odpowiedz

11

można przekazać obiekt na mapie konfiguracji burzy, pod warunkiem, że jest możliwy do serializacji. W metodzie prepare() dowolnej wylewki lub śruby w topologii można pobrać ten obiekt.

ten sposób można umieścić obiekt na mapie konfiguracyjnym o poddaniu topologii:

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

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

W ten sposób można odzyskać w sposobie przygotowania() sworznia lub wylewki:

prepare(Map stormConf,TopologyContext context) { 

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

} 
3

Nie jestem bardzo pewien, co masz na myśli, ale twoja klasa śrub może zawsze wziąć parametr inicjalizacji i możesz ją zainicjować za pomocą obiektu, który chcesz przekazać podczas tworzenia topologii.

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

Twój konstruktor śrub może przyjąć ten obiekt jako argument.

Edit: Jeśli chcesz dane mają być dostępne bez przekazania go wprost do konstruktora, można ponownie zawsze statycznych klasy do przechowywania tych danych i dostęp z śrubą obiektów

+0

Podczas gdy to rozwiązało się przy jednej implementacji śrub ... to zmusza mnie do użycia konstruktora z tym samym obiektem "myObj", który ma być implementowany we wszystkich śrubach do tego topologii budynku ... Musimy bezproblemowo przekazać śrubę "myObj" w topologii dla wszystkich śrub ... – user1996684

+2

@ user1996684 Jeśli chcesz dane o Bądź dostępny bez jawnego przekazywania go do konstruktora, możesz zawsze utworzyć klasę statyczną, aby przechowywać te dane i uzyskać do nich dostęp z obiektów śrub. – Munim