159

作为一名经验丰富的 Spring 用户,我假设 Spring Integration 在最近需要一些 (JMS) 消息传递功能的项目中最有意义(更多详细信息)。在使用 Spring Integration 工作了几天之后,考虑到您必须配置的通道数量来实现一些请求-响应(侦听不同的 JMS 队列)通信,它仍然感觉有很多配置开销。

因此,我一直在寻找一些背景信息 Camel 与 Spring Integration 的不同之处,但似乎那里的信息非常空闲,我发现:

问题是:你在使用一个堆栈而不是另一个堆栈方面有什么经验?在 Spring Integration 缺乏支持的情况下,您会在哪些情况下推荐 Camel?您在哪里看到每种方法的优缺点?来自实际项目的任何建议都将受到高度赞赏。

4

11 回答 11

84

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

我们进行了一次小规模的枪战,基本上当时我们的要求是骆驼赢了。我们主要使用它来向/从外部方传输内部数据文件,这通常需要格式转换,使用 ftp/sftp/... 发送或将其附加到电子邮件并发送出去。

我们发现编辑-编译-调试周期减少了。使用 groovy 来试验设置路线是额外的好处。

Spring-Integration 也是一个很棒的产品,我很确定它也会满足我们的需求。

于 2010-06-13T22:29:04.067 回答
76

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

Apache Camel 有两个主要优点:

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

因为 Apache Camel 与 Spring 的集成非常好,所以我什至会在大多数 Spring 项目中使用它来代替 Spring Integration。

如果您需要更多详细信息,可以在我的博客文章中阅读我的经验:Spoiled for Choice: which Integration Framework to use – Spring Integration、Mule ESB 或 Apache Camel?

于 2012-01-11T09:00:57.840 回答
38

我最近进行了 Camel 与 Spring 集成的枪战,目的是集成Apache Kafka。尽管是一名狂热的 Spring 开发人员,但我很遗憾地发现我对 Spring 不断增长的项目堆栈的怀疑得到了证实:Spring 作为 IOC-Container 可以作为其他框架的粘合剂,但它无法为这些框架提供可行的替代方案。可能有例外,即与 MVC 相关的所有事情,Spring 来自哪里,它做得很好,但是其他在容器特性之上提供新功能的尝试由于三个原因而失败,SI Kafka 用例证实了这一点他们都是:

  • 介绍用于 XML 配置的冗长难以使用的 DSL。
  • 用于连接所有框架组件的 xml 配置代码页面。
  • 缺少提供与专用框架同等功能的资源。

现在,回到我的点球大战的结果:最重要的是,我对 Camels端点之间路线的整体概念印象深刻。Kafka 与此概念无缝集成,三行配置足以让一切正常运行。项目团队提供的大量文档以及 Stackoverflow 上的大量问题巧妙地解决了此过程中遇到的问题。最后但并非最不重要的一点是,它全面集成到 Spring中,没有任何愿望未实现。

与 SI 相反,Kafka 集成的文档非常密集,仍然无法清楚地解释如何集成 Kafka。Kafka 的集成被入 SI 做事方式,这增加了额外的复杂性。其他文档,例如 Stackoverflow 上的文档也没有 Camel 丰富,也没有那么有用。

我的结论:cobbler 坚持你的行业——使用 Spring 作为容器,使用 Camel 作为系统集成框架。

于 2015-07-21T10:49:57.870 回答
21

这真的取决于你想做什么。如果您需要扩展某些东西来构建自己的消息传递解决方案,Spring Integration 具有更好的编程模型。如果您需要无需自定义代码即可支持多种协议的东西,Camel 领先于 Spring Integration。

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

--disclaimer: 我是 Spring Integration 提交者

于 2010-06-18T06:05:18.263 回答
9

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

1.) Spring Boot 对 Spring Integration 开发人员生产力的影响

2.) Spring XD 的作用是使 Spring Integration 应用程序无需代码编译即可使用 - 当您希望扩展 Spring XD 时,Spring XD 源和接收器也只是 Spring Integration 通道适配器。

3.) Spring XD 的作用是将 Spring Integration、Spring Batch、Spring Data (+Hadoop!) 统一在一个堆栈中,有效地将批处理和流处理、HDFS/Apache Hadoop 支持等引入 Spring Integration。

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

供您考虑,

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

于 2014-10-20T21:30:43.737 回答
8

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

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

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

I am right now working on issues with handling the exceptions and transactions with Apache Camel which Spring seemed to handle better with AOP.

于 2017-06-29T18:58:10.623 回答
5

Apache Camel 是一个非常好的框架,也非常完整。但是如果你的应用程序使用 Spring,我个人的建议是使用 Spring Integration。

Spring Integration 是 Spring-Source 生态系统的集成 EIP 投诉框架。与生态系统完美融合:Spring boot、Batch、XD;从 Spring Framework 4 开始,甚至核心使用相同的抽象。一些消息传递抽象被移到框架中,证明 Spring Integration 的基本消息传递抽象非常强大。现在 Spring 框架例如使用 Spring Web 的消息传递抽象,Web 套接字支持。

在使用 Apache Camel 的带有 Spring 集成的 Spring 应用程序中的另一件好事是,通过 Spring 集成,您只能使用一个 Application Context。请记住,Camel 上下文是 Spring 上下文。如果你有机会使用新的 Spring 版本,我建议使用 Spring Integration Java DSL 进行配置。我在我的新项目中使用它,感觉更加可读和清晰。我希望这个反思可以帮助你的评价。

于 2016-03-11T22:48:56.470 回答
4

实际上,我会说 FTP 已经结束了它的潜伏期。您可以在 SI 论坛/JIRA 上进行简单搜索,以查看实现了哪些新功能以及修复了哪些错误。从各种喋喋不休看来,它似乎已经有一些生产用途,所以我建议再看一下,当然也可以通过以下方式向我们传达您的担忧

http://forum.springsource.org/forumdisplay.php?42-Integration
https://jira.springsource.org/browse/INT

干杯奥列格

免责声明:我是 Spring Integration 提交者

于 2011-05-25T01:11:54.523 回答
2

使用 Camel over Spring Integration 的一个原因是当您需要功能更强大的 EIP 集时。Spring Integration 不提供对诸如 ThreadPool 之类的东西的抽象。

Camel 确实为此提供了额外的构造,从而简化了使用并发代码的某些方面:

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

如果您不需要这种东西,而只想连接文件、JMS、FTP 端点等......那么只需使用 Spring Integration。

于 2012-02-15T20:28:21.713 回答
-1

Camel act as middleware for application where one can perform data modeling, transformation of message values and choreography of messages.

于 2019-07-23T16:01:13.163 回答
-3

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

于 2013-11-21T05:19:57.267 回答