Как apache storm создает свои реализации Bolt

После реализации очень простой топологии apache storm в java я столкнулся с NPE, что вызвало некоторую путаницу.

Это в основном мой основной метод:

TologyBuilder builder = new TopologyBuilder();
builder.setSpout("spout", new CustomSpout(true), 4);
final CustomBolt bolt = new CustomBolt();
builder.setBolt("bolt", bolt, 1).shuffleGrouping("spout");

LocalCluster cluster = new LocalCluster();
Map conf = new HashMap();
conf.put(Config.TOPOLOGY_WORKERS, 10);
cluster.submitTopology("test", conf, createTopology());

CustomBolt расширяет класс AbstractBasic и реализует IRichBolt. У них есть эти поля:

abstract class AbstractBasic {
    A a;
    B b;
} 

CustomBolt extends AbstractBasic implements IRichBolt {
    A anotherA;
    C c;
    CustomBolt() {
        this.anotherA = new A(true);
        this.a = new A(false);
        this.b = new B();
        this.c = new C();
    }
}

По методу execute CustomBolt будет несколько вставок во все классы. Однако поля, которые унаследованы от AbstractBasic, не инстанцируются, а другие, те, что живут непосредственно в CustomBolt,...

Кто-нибудь знает, как создается болт и как возможно, что некоторые поля инициализируются, а некоторые нет.


person user3354890    schedule 07.07.2014    source источник


Ответы (2)


Когда болты отправляются в топологию, они сериализуются и отправляются каждому worker, где они десериализуются. Поскольку AbstractBasic не реализует Serializable, его поля не будут сериализованы. при сериализации CustomBolt.

В приведенном вами примере вы сможете решить свою проблему, заявив, что AbstractBasic реализует Serializable:

abstract class AbstractBasic implements Serializable ...
person Carl Veazey    schedule 10.07.2014

Я не уверен, как работает создание экземпляров с Bolts, но я могу найти вескую причину. Насколько я понимаю, мы запускаем топологию в распределенной среде, и чтобы избежать параллельных модификаций общих переменных (т. е. переменных уровня класса, унаследованных от родительских классов), родительские переменные могли быть установлены в значение null в дочерних классах.

person java_enthu    schedule 08.07.2014