My 理解Akka 的特点是它提供了一个模型,多个独立的线程可以通过该模型以高度并发的方式相互通信。它使用“参与者模型”,其中每个线程都是一个“参与者”,负责执行特定的工作。您可以编排在什么条件下将哪些消息传递给哪些参与者。
我以前使用过 Camel,对我来说,我觉得它有点失去了它的光泽/实用性,因为 Akka 已经如此成熟并且有很好的文档记录。据我了解,Camel是关于企业集成的,即将多个不同的系统集成在一起,usually以某种服务总线的方式。
但想一想:如果我目前使用 Camel 来:
- 轮询 FTP 服务器上的文件,一旦找到...
- 将该文件的内容转换为 POJO,然后...
- 如果 POJO 具有某种状态,则发送电子邮件,或者
- 在所有其他情况下将 POJO 保留到数据库
我可以用 Akka 做同样的事情;我可以为每个步骤(轮询 FTP、转换文件 -> POJO、电子邮件或持久)设置 1 个 Actor,将它们连接在一起,并让 Akka 处理所有异步/并发。
因此,尽管 Akka 是一个并发框架(使用 actor),尽管 Camel 是关于集成的,但我还是要问:Akka 不能解决 Camel 所做的所有事情吗?用他们的话来说:仍然存在哪些用例可以使用 Camel 而不是 Akka?
阿卡和骆驼是两种不同的野兽(另外一种是山,一种是动物)。
你自己也提到过:
Akka 是一个实现反应器模式的工具,即用于潜在分布式系统的基于消息的并发引擎。
Camel 是一个用于实现企业集成模式的 DSL/框架。
虽然 Akka 中有很多东西很漂亮,但在 Camel 中很容易。交易是肯定的。然后是所有逻辑、各种传输逻辑和选项,因为 Akka 没有集成消息的抽象。还有 Camel 中非常完善的 EIP,如多播、拆分、聚合、XML/JSON 处理、文本文件解析、HL7,仅举几例。当然,你可以用纯 java/scala 来完成这一切,但这不是重点。重点是能够使用 DSL 来描述集成,而不是再次实现底层逻辑。
尽管如此,Akka 与 Camel 一起 http://doc.akka.io/docs/akka/snapshot/scala/camel.html很有趣。特别是使用 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"/>
完整的示例/教程可以在类型安全中找到 http://www.typesafe.com/activator/template/akka-sample-camel-scala.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)