我是Akka的新手(我正在使用Java lib v2.3.9),并且想知道两个竞争的actor实现策略之间的权衡是什么。一方面,我可以用标准方式实现我的演员:
// Groovy pseudo-code
class StormTrooper extends UntypedActor {
@Override
void onReceive(Object message) {
if(message instanceof ExecuteOrder66) {
// Betray all Jedi, serve the Emperor!
}
}
}
class DarthVader extends UntypedActor {
@Override
void onReceive(Object message) {
if(message instanceof Feels) {
// Betray the Emperor, save your son!
}
}
}
class Emperor extends UntypedActor {
@Override
void onReceive(Object message) {
if(message instanceof Mace) {
// Transform into your true self!
}
}
}
...而不是那样做,我可以通过注入添加一层抽象:
class StarWarsCharacter extends UntypedActor {
@Inject // Injected behavior; implementation doesn't matter
BehaviorHandler behaviorHadler
@Override
void onReceive(Object message) {
behaviorHandler.handle(message)
}
}
interface BehaviorHandler {
void handle(Object message)
}
class StormTrooperBehaviorHandler implements BehaviorHandler {
@Override
void handle(Object message) {
// Betray all Jedi, serve the Emperor!
}
}
class DarthVaderBehaviorHandler implements BehaviorHandler {
@Override
void handle(Object message) {
// Betray the Emperor, save your son!
}
}
class EmperorBehaviorHandler implements BehaviorHandler {
@Override
void handle(Object message) {
// Transform into your true self!!
}
}
是否只有一种类型的actor并使用不同的BehavioHandler
实现注入性能/类加载的好处?我有没有理由不想要这样做并使用“标准”演员实现?
答案 0 :(得分:1)
如果你只想使用你的Actor作为向处理程序发送消息的方式,那么第二种(非标准)方式就可以了,并且可以在代码结构方面给你带来一些好处 - 例如BehaviorHandler
是单个方法接口的事实将允许您使用lambda实现它。
然而,演员不只是方法调度员。随着系统复杂性的增加,它们提供了各种方法。
请参阅http://doc.akka.io/docs/akka/2.0/java/untyped-actors.html#untypedactor-api
典型的中等规模的Akka系统需要引用self
上定义的sender
,context
和UntypedActor
。
简而言之:如果你不使用继承,那么你放弃了比你意识到的更多。