什么时候使用 Spring 集成和 Camel?

作为一个经验丰富的 Spring 用户,我认为 Spring 集成在最近一个需要一些(JMS)消息传递功能(更多细节)的项目中最有意义。在使用 Spring Integration 几天之后,考虑到您必须配置大量的通道来实现一些请求-响应(监听不同的 JMS 队列)通信,这仍然感觉像是大量的配置开销。

因此,我一直在寻找一些背景信息,看看 Camel 和 Spring Integration 有什么不同,但是这些信息似乎都很简单,我发现:

问题是: 在使用一个堆栈而不是另一个堆栈时,你有什么经验?如果 Spring 集成缺乏支持,您建议在哪些场景中使用 Camel?你怎么看待两者的利弊?任何来自现实世界项目的建议都受到高度赞赏。

96287 次浏览

我们选择骆驼而不是 Spring-Integration,因为流畅的 API 非常不错。我们实际上在 Spring 项目中使用它,并使用 Spring 配置其中的一部分。编程 API 是清晰的,并且有大量合理的组件。

我们做了一个小规模的枪战,基本上在我们的要求,当时骆驼赢了。我们主要使用它来传输内部数据文件到/来自外部各方,通常需要格式转换发送它使用 ftp/sftp/... 或附加到电子邮件和发送它。

我们发现编辑-编译-调试周期减少了。使用 Groovy 来尝试设置路由会增加额外的好处。

Spring-Integration 也是一个很棒的产品,我相信它也能满足我们的需求。

这真的取决于你想做什么。如果您需要扩展一些内容来构建自己的消息传递解决方案,SpringIntegration 具有更好的编程模型。如果您需要一些不需要自定义代码就能支持许多协议的东西,Camel 将领先于 Spring 集成。

有一个小规模的枪战是一个非常好的主意,只是确保你正在尝试做的事情,你通常会在项目中做的类型。

——免责声明: 我是 Spring 集成提交者

事实上我觉得 FTP 已经不再是疾病潜伏期了。你可以在 SI 论坛/JIRA 上做一个简单的搜索,看看哪些新特性被实现了,哪些 bug 被修复了。从各种闲聊似乎已经有一些生产使用它,所以我建议给它第二次看看,当然通过我们传达您的关注

Http://forum.springsource.org/forumdisplay.php?42-integration
Https://jira.springsource.org/browse/int

干杯 奥列格

免责声明: 我是 Spring 集成提交者

如果您已经有一个 Spring 项目,并且只需要使用 File、 FTP、 JMS、 JDBC 等添加一些“基本”集成,那么我只推荐 Spring 集成。

阿帕奇骆驼有两大优势:

  1. 支持更多更多的技术。
  2. 此外,作为一个(好的) XML DSL,Java、 Groovy 和 Scala 都有流畅的 API。

因为 ApacheCamel 与 Spring 的集成非常好,我甚至会在大多数 Spring 项目中使用它来代替 Spring 集成。

如果你需要更多的细节,你可以阅读我的经验在我的博客文章: 选择太多: 使用哪个集成框架-Spring 集成,Mule ESB 还是 Apache Camel?

使用 Camel 优于 Spring 集成的一个原因是,当您需要一个更具特色的 EIP 集时。SpringIntegration 不提供对 ThreadPool 之类事物的抽象。

Camel 确实为简化并发代码的某些方面提供了额外的构造:

Http://camel.apache.org/camel-23-threadpool-configuration.html

如果您不需要这类东西,只是想连接文件、 JMS、 FTP 端点等..。.那就用 Spring 集成。

如果您当前的应用程序在 Spring 中,并且需要 Spring Integration of EIP 支持的特性,那么 Spring Integration 是最好的选择,否则需要更多的第三方支持/协议/文件格式等

我所看到的大多数骆驼和 SI 的比较都没有考虑到以下几点:

Spring Boot 对 Spring 集成开发人员生产力的影响

2)Spring XD 的作用是让 Spring 集成应用程序不需要编译代码就可以使用——当您寻找扩展 Spring XD 时,Spring XD 源和接收器只是 Spring 集成通道适配器。

3)Spring XD 对于统一 Spring 集成、 Spring 批处理、 Spring 数据(+ Hadoop!)的影响在一个堆栈中,有效地为 Spring 集成带来了批处理和流处理、 HDFS/Apache Hadoop 支持等等。

4)即将发布的 Spring Integration 4.0 Java DSL https://github.com/spring-projects/spring-integration-extensions/wiki/Spring-Integration-Java-DSL-Reference的影响

为了您的考虑,

/Pieter (免责声明,我在 Pivotal 工作)

我最近进行了一个骆驼与春天的集成枪战,目的是集成 阿帕奇 · 卡夫卡。尽管我是一个热心的 Spring 开发人员,但我遗憾地发现我对 Spring 不断增长的项目堆栈的怀疑得到了证实: Spring 和 IOC-Container 一样,可以作为其他框架的粘合剂,但是它不能为这些框架提供可行的替代方案。这可能有例外,即所有与 MVC 相关的东西,Spring 来自哪里,它在哪里做得很好,但是其他试图在容器特性之上提供新功能的尝试都不能满足 三个原因,而且 卡夫卡用例证实了所有这些:

  • 介绍了一种冗长的难以使用 DSL 进行 XML 配置的方法。
  • 将所有框架组件连接起来的 xml 配置代码页。
  • 缺少提供与专用框架同等功能的资源。

现在,回到我的枪战结果: 最重要的是我印象深刻的骆驼的整体概念 端点之间的路由。卡夫卡与这个概念无缝集成,三行配置就足以让一切运行起来。在这个过程中遇到的问题都被 来自项目团队的大量文档巧妙地解决了,还有很多关于堆栈溢出的问题。最后但并非最不重要的,有一个 与 Spring 的全面集成,没有留下未实现的愿望。

与 SI 相反,卡夫卡集成的文档是 非常紧张,仍然没有解释清楚如何集成卡夫卡。卡夫卡的集成是 按下的 SI 做事方式,这增加了额外的复杂性。其他的文档,例如关于 Stackoverflow 的文档也不像 Camel 那样丰富和有用。

我的结论是: 补鞋匠坚持您的行业-使用 Spring 作为容器,使用 Camel 作为系统集成框架。

ApacheCamel 是一个非常好的框架,也非常完整。但是如果您的应用程序使用 Spring,我个人的建议是使用 Spring 集成。

Spring Integration 是 Spring-Source 生态系统的整合 EIP 投诉框架。它与生态系统有很好的集成: Spring 启动、批处理、 XD; 甚至核心也从 Spring Framework 4开始使用相同的抽象。在框架中移动了一些消息抽象,以证明 Spring 集成的基本消息抽象非常强大。例如,现在 Spring 框架使用了 SpringWeb 的消息抽象,即 Web 套接字支持。

在 Spring 集成的 Spring 应用程序中使用 Apache Camel 的另一个好处是,在 Spring 集成中,您只能使用一个 Application Context。请记住,Camel Context 是 Spring 上下文。如果您有机会使用新的 Spring 版本,我建议使用 SpringIntegrationJavaDSL 进行配置。我在我的新项目中使用它,它感觉更易读和清晰。我希望这个反思能对你的评估有所帮助。

我们的应用程序使用 Spring 集成,现在考虑迁移到 Apache Camel,因为我们在 Spring 集成框架中遇到了很多问题。这里有几个问题。

  1. Spring 提供的 CachingConnectionFactory 在 IBM MQ 中打开1000个空闲连接,并且不能保证这些连接被重用。然而,这些连接将永远保持开放,从而在 MQ 方面制造麻烦。为了刷新连接,必须每周在较低的环境中重新启动应用程序。Apache Camel 还提供了缓存,连接似乎会根据负载而上下调整。

  2. Spring 不提供 QoS 参数的映射器。即使您启用了 QoS,交付模式和到期/timetolive 属性也会丢失(我将为此提出一个 JIRA 问题)。ApacheCamel 处理这个问题,QoS 参数被发送到上游应用程序,而不会丢弃它。

我现在正在研究用 Apache Camel 处理异常和事务的问题,Spring 似乎在 AOP 中处理得更好。

Camel 作为应用程序的中间件,可以在其中执行数据建模、消息值转换和消息编排。