我正在使用一组Spouts和Bolts构建一个Storm拓扑,并使用Spring进行依赖注入。
不幸的是,即使我已经将所有的喷口和螺栓都声明为@Components,我的所有字段都没有自动装配。
然而,在我声明我的拓扑结构的地方,Spring工作正常,所有依赖项都被正确注入。
是因为cluster.submitTopology(" test",conf,builder.createTopology())将拓扑提交到集群(本地它为Spouts和Bolts生成不同的线程),Autowiring无法正常工作?
请建议。
PS - >我使用基于注释的配置而不是xml。
答案 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的方法。