【问题标题】:Apache Storm integration with Spring frameworkApache Storm 与 Spring 框架的集成
【发布时间】:2018-10-13 23:14:48
【问题描述】:

我是 Apache Storm 的新手。目前我正在处理涉及使用 Apache Storm 进行一些流处理的遗留项目。我想将当前项目与 Spring 集成。我发现几个 cmets (Storm and Spring 4 integration, http://mail-archives.apache.org/mod_mbox/storm-user/201605.mbox/%3CCAMwbCdz7myeBs+Z2mZDxWgqBPfjcq-tynOz_+pmPrmY6umfUxA@mail.gmail.com%3E) 说这样做有顾虑。有人可以解释一下如何进行这样的集成或为什么不可能吗?

【问题讨论】:

标签: java spring dependency-injection apache-storm


【解决方案1】:

公平的警告,我没有在 Storm 中使用过 Spring,所以这仅基于我对 Storm 的了解,并且在非 Storm 项目中使用过 Spring,也就是说,这实际上只是猜测。

我认为您可以将 Spring 与 Storm 一起使用,但您应该注意一些注意事项。鉴于这些注意事项,Spring 是否仍然值得使用取决于您。

不像例如一个 Spring MVC 应用程序,Spring 将不负责对象实例化或应用程序流。 Storm 不了解 Spring,当您运行拓扑时,Storm 会调用您的 bolt/spout 方法。这意味着您必须注意应用程序的某些部分将在 Spring 上下文之外调用。

这是我对在拓扑部署的不同阶段可以使用 Spring 的地方的猜测。

  • 当您设置拓扑并提交它(所有代码到 StormSubmitter.submitTopology 并包括在内)时,您很可能可以像在任何独立的 Java 应用程序中一样使用 Spring。例如你可以像this example一样开始你的应用程序,然后把你所有的提交和接线代码放在Main.start。所有 bolt/spout 构造函数都将在此阶段运行,因此如果您愿意,可以在此处使用自动装配。不过,您必须确保您的 spouts 和 bolts 是可序列化的。

  • 拓扑提交后,Storm 将序列化您的 spout 和 bolt(以及这些对象中的任何非瞬态字段),并将它们发送到主管机器,在那里它们将被反序列化。此时如果需要worker中可用的上下文,可以在worker hook中创建一个(通过TopologyBuilder.addWorkerHook添加到拓扑中),并通过钩子上的静态方法公开它(有点难看,但我看不到任何其他方法可以使其可用于代码的其他部分)。

重申一下,如果您决定在您的工作人员中运行 Spring 上下文,您必须注意 Spout/bolt 方法将由 Spring 上下文之外的 Storm 调用。

【讨论】:

  • 非常感谢!看起来一切正常。我创建了 spring boot 项目,在创建和提交拓扑的地方实现了 CommandLineRunner#run,这里还注入了所有的 spout 和 boults。据我了解,Storm 用完了 spring 上下文,只有涉及到拓扑(spout/bolt)的部分才能在 spring 上下文中注册并在拓扑创建中注入。还是不明白worker hook怎么用,以后再深入研究一下。
猜你喜欢
  • 2013-04-08
  • 1970-01-01
  • 2016-10-26
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多