【问题标题】:Storm Spout and Bolts not autowiring Dependencies using SpringStorm Spout 和 Bolts 不使用 Spring 自动装配依赖项
【发布时间】:2015-09-29 13:49:35
【问题描述】:

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

不幸的是,即使我已将所有 spout 和 Bolts 声明为 @Components,我的字段都没有自动连接。

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

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

请提出建议。

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

【问题讨论】:

    标签: spring spring-boot apache-storm


    【解决方案1】:

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

    Spout 和 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。

    【讨论】:

      猜你喜欢
      • 2013-05-09
      • 2015-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-24
      • 2021-10-19
      • 1970-01-01
      相关资源
      最近更新 更多