Storm Spout和Bolts不使用Spring自动连接依赖关系

时间:2015-09-29 13:49:36

标签: spring spring-boot apache-storm

我正在使用一组Spouts和Bolts构建一个Storm拓扑,并使用Spring进行依赖注入。

不幸的是,即使我已经将所有的喷口和螺栓都声明为@Components,我的所有字段都没有自动装配。

然而,在我声明我的拓扑结构的地方,Spring工作正常,所有依赖项都被正确注入。

是因为cluster.submitTopology(" test",conf,builder.createTopology())将拓扑提交到集群(本地它为Spouts和Bolts生成不同的线程),Autowiring无法正常工作?

请建议。

PS - >我使用基于注释的配置而不是xml。

1 个答案:

答案 0 :(得分:1)

我问了这个,但没有人指示我正确回答。发布它以便对某人有用:

Spouts和Bolts无法解析依赖关系,因为它们是由ToplogyBuilder创建的新对象

例如:

TopologyBuilder builder = new TopologyBuilder();
    builder.setSpout("rabbitMqSpout", new RabbitListnerSpout(), 1);
    builder.setBolt("mapBolt", new GroupingBolt(), 1).shuffleGrouping("rabbitMqSpout");
    builder.setBolt("reduceBolt", new PublishingBolt(), 1).shuffleGrouping("mapBolt");

使用new创建它们的那一刻,它们超出了Spring的Context范围。可以通过发送applicationContext作为构造函数来解决这个问题。

所以你可以把它作为,

TopologyBuilder builder = new TopologyBuilder();
    builder.setSpout("rabbitMqSpout", new RabbitListnerSpout(appContext), 1);
    builder.setBolt("mapBolt", new GroupingBolt(appContext), 1).shuffleGrouping("rabbitMqSpout");
    builder.setBolt("reduceBolt", new PublishingBolt(appContext), 1).shuffleGrouping("mapBolt");

这种方式可用于喷口和螺栓。所以,当你开始你的群集时,它们仍然可用。

P.S->我只在LocalCluster上测试过。

更新,上面的内容不适用于远程群集,因为appContext无法序列化。要使spring工作在远程Cluster上,必须在open中定义和初始化Context并准备Spouts和Bolts的方法。