14

我的理解是,它提供了一个模型,多个独立的线程可以通过这种模型以高度并发的方式相互通信。它使用“演员模型”,其中每个线程都是有特定工作要做的“演员”。您可以协调在什么条件下将哪些消息传递给哪些参与者。

我以前使用过 Camel,对我来说,现在 Akka 如此成熟且有据可查,我觉得它有点失去了它的光彩/实用性。据我了解,骆驼是关于企业集成,即将多个不同的系统集成在一起,通常以某种服务总线方式。

但是想一想:如果我目前使用 Camel 来:

  • 轮询 FTP 服务器以获取文件,一旦找到...
  • 将该文件的内容转换为 POJO,然后...
  • 如果 POJO 具有某种状态,则发送电子邮件,或者
  • 在所有其他情况下将 POJO 持久化到数据库

我可以用 Akka 做同样的事情;我可以为每个步骤(轮询 FTP、转换文件 -> POJO、电子邮件或持久化)设置 1 个 Actor,将它们连接在一起,让 Akka 处理所有异步/并发。

所以即使 Akka 是一个并发框架(使用 Actor),即使 Camel 是关于集成的,我还是要问:Akka 不能解决 Camel 所做的所有事情吗?换句话说:仍然存在哪些用例来使用 Camel 而不是 Akka?

4

1 回答 1

26

阿卡和骆驼是两种不同的野兽(除了一种是山,一种是动物)。

您自己提到:Akka 是一种实现反应器模式的工具,即用于潜在分布式系统的基于消息的并发引擎。

Camel 是实现企业集成模式的 DSL/框架。

虽然在 Akka 中有很多东西会很漂亮,但在 Camel 中很容易。交易肯定。然后是各种传输逻辑和选项的所有逻辑,因为 Akka 没有集成消息的抽象。然后是在 Camel 中非常出色的开发良好的 EIP,多播、拆分、聚合、XML/JSON 处理、文本文件解析、HL7 等等。当然,你可以在纯 java/scala 中完成这一切,但这不是重点。重点是能够使用 DSL 来描述集成,而不是再次实现底层逻辑。

尽管如此,Akka TOGETHER with Camel还是很有趣的。特别是使用 Scala。然后,您在 actor 语义之上拥有 EIP,这在正确的领域非常强大。

来自 akka.io 的示例

import akka.actor.Actor
import akka.camel.{ Producer, Oneway }
import akka.actor.{ ActorSystem, Props }

class Orders extends Actor with Producer with Oneway {
  def endpointUri = "jms:queue:Orders"
}

val sys = ActorSystem("some-system")
val orders = sys.actorOf(Props[Orders])

orders ! <order amount="100" currency="PLN" itemId="12345"/>

可以在 typesafe 找到完整的示例/教程。

于 2015-01-21T20:07:38.370 回答