我是Akka的新手,我正在试图弄清楚它是否内置了对Enterprise Integration Patterns (EIP)的支持,或者我是否需要将这种类型的路由/集成委托给像Camel这样的框架。
在我的用例中,我有一个从源(文件)读取二进制样本的actor;这个演员被称为Sampler
。 Sampler
将Sample
实例(消息)传递给名为SampleProcessors
的actor字段。每个样本处理器都会执行与给定Sample
不同的操作。根据处理Sample
的处理器的结果,可能需要将其路由到1+其他SampleProcessor
,或者可能所有处理都已完成。根据确切的SampleProcessor
以及给定Sample
的确切性质,Sample
可能需要多次投放到其他收件人SampleProcessors
的列表中。
这对我来说就像骆驼一样。
所以我问:
答案 0 :(得分:4)
Akka本身不支持EIP,但有几种方法可以实现它。
无论如何,如果你想要一些方便的DSL,有一个比EIP更好的想法 - 就像用GoF-patterns完成的那样,你可以用功能组合+ Functors替换(实现)大多数EIP模式({{1 }和Monads(map
)。换句话说,您可以将输入流视为无限集合。所以,
flatMap
路由器和过滤器变为...... monad(val output1 = input.map(processor1).map(processor2)
基于filter
):
flatMap
val fork1 = output1.filter(routingCondition1).map(...)
拆分为val fork2 = output1.filter(routingCondition2).map(...)
:flatMap
input.flatMap(x => Stream(x.submsg1, x.submsg2))
(累加器通常应由某些存储支持)这样的基于流的工作流已经为Akka实现,它被称为Akka Streams,它是Reactive Streams的实现,另请参阅this 和that条。
另一种选择是按原样使用Akka,actor保证顺序处理,因此您可以通过创建actor链来实现管道:
fold
如果你需要路由 - 它只是两个“下一个”的
class Processor1(next: ActorRef) extends Actor {
def receive = {
case x if filterCondition =>
case x => next ! process(x)
}
}
val processor2 = system.actorOf(Props[Processor2])
val processor1 = system.actorOf(Props[Processor1], processor2)
如果您需要保证路线之间没有比赛 - 请参阅this answer。对于cource,你可以直接使用actor来放弃整个DSL的想法。
P.S。是的,你仍然可以使用Camel作为端点--Akka有一些support。你可以使用Akka作为服务激活者。