Storm Spout 和 Bolts 不使用 Spring 自动装配依赖项

Storm Spout and Bolts not autowiring Dependencies using Spring

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

不幸的是,即使我已将所有 spout 和 Bolt 声明为 @Components,我的 none 个字段正在自动装配。

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

是否因为 cluster.submitTopology("test", conf, builder.createTopology()) 将拓扑提交到集群(本地它为 Spouts 和 Bolts 生成不同的线程)自动装配是不工作?

请推荐。

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

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

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");

这样它就可以用于 spouts 和 bolts 。所以当你启动你的集群时,它们仍然可用。

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

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