Akka中Typed Actor和UnTyped Actor有什么区别?该如何选择使用哪种?

26

我曾试图阅读Akka文档,以找出Typed和Untyped演员之间的确切区别。 何时使用哪个? 我不确定我错过了什么。 有人能指向相关内容或在此处提供答案吗?

我曾试图阅读Akka文档,以找出Typed和Untyped演员之间的确切区别。何时使用哪个?我不确定我错过了什么。有人能指向相关内容或在此处提供答案吗?

4个回答

17

为什么人们通常更喜欢使用未经类型化的演员而不是经过类型化的演员?尽管经过类型化的演员似乎使代码更易读,减少了“instanceof”/“case”的参与,更符合面向对象的编程风格,更像Java和Scala等语言。 - ses
我的观点是:使用未经类型化的Actor,您必须按Actor过滤消息。使用经过类型化的Actor,您只需绑定到确切的消息即可。 - alerya
1
类型化的actor会导致高耦合,并且不允许使用become/unbecome(这是在actors内部处理状态的原始和纯函数式方式),更多信息请参见http://letitcrash.com/post/19074284309/when-to-use-typedactors。 - dk14

4
Actors (Untyped)

对于接收消息的演员(Scala),他们必须混合使用Consumer trait。例如,以下演员类(Consumer1)实现了在Consumer trait中声明的endpointUri方法,以便从file:data / input / actor Camel端点接收消息。未经类型化的演员(Java)需要扩展抽象的UntypedConsumerActor类并实现getEndpointUri()和onReceive(Object)方法。

Actors (Typed)

Typed actors也可以从Camel端点接收消息。与(非类型化)actors不同,它们仅实现一个receive或onReceive方法,类型化actor可以定义多个(消息处理)方法,每个方法都可以从不同的Camel端点接收消息。要将类型化actor方法公开为Camel端点,必须使用@consume注释进行注释。例如,以下类型化消费actor定义了两个方法foo和bar。
参考链接:Reference

Mithun,演员需要混入Consumer trait才能接收消息的部分是关于Camel消息的,对吗?当然,任何Akka Actor都可以接收普通的Akka消息,无论是否使用Consumer。 - AmigoNico

2
未经类型化的演员响应发送的消息,而经过类型化的演员则响应方法调用(参数值是消息)。
类型化演员模型被用来为只能响应预定义消息集合的演员定义严格的契约。在这种情况下,不必将每个消息封装为一个对象;类型化演员允许我们定义接受多个输入的单独方法,如契约所定义。在Java术语中,类型化演员提供了面向对象世界中的Java接口。[1]
[1] Akka Essentials

1

Akka的无类型actors "无法组合"和"没有实用的类型"。

这违背了我们使用Scala的原因:它的函数式编程能力。 请参见http://noelwelsh.com/programming/2013/03/04/why-i-dont-like-akka-actors/深入了解此思维方式。

另外,查看试图改进此功能以匹配Haskell方式的Scala。

http://letitcrash.com/post/40198993865/makkros-first-step-towards-typed-channels http://letitcrash.com/post/45188487245/the-second-step-akka-typed-channels

似乎在Akka中仍处于实验阶段或甚至已经被放弃-不清楚。
类型化通道的想法非常合理,因为当人们尝试构建类型检查数据(分析)管道时会出现类似的问题。
Akka Typed似乎是更安全的编程模型的巨大进步:https://opencredo.com/akka-typed/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接