2013-08-02 5 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"); 

И ваш конструктор болтов мог принять этот объект в качестве аргумента.

Edit: Если вы хотите, чтобы данные были доступны без передачи его в явном виде в конструктор, вы можете снова всегда сделать статический класс для хранения этих данных и доступа к нему с болта объектами

+0

Хотя это и решило для одной реализации болта ... это заставляет меня использовать конструктор с тем же самым объектом «myObj», который будет реализован во всех болтах для этого здания топологии ... Нам нужно беспрепятственно пройти болт «myObj» в топологии для всех болтов ... – user1996684

+2

@ user1996684 Если вы хотите, чтобы данные t o быть доступным, не передавая его явно конструктору, вы всегда можете сделать статический класс для хранения этих данных и доступа к нему из объектов болтов. – Munim