我正在努力应对演员系统和非演员代码的交互。 Akka Java documentation的第3.2.1节描述了使用TypedActors在Actor系统和外部非actor之间进行桥接。
类型化演员很适合在演员系统(“内部”)和非演员代码(“外部”)之间进行桥接,因为它们允许您在外部编写正常的面向OO的代码。
然后继续描述三种不同的场景:
但所有这些场景都是从非演员世界发起的。 actor系统调用非actor行为代码的正确方法是什么?
我要做的是将actor消息的不可变有效负载直接暴露给非actor社区。例如,actor A保留从actor B接收的消息的不可变有效负载(比如地图)作为易失性实例变量,然后出于性能原因将该变量暴露给非actor世界(通过普通的getter或者正面)。该映射是不可变的,因此它本身就是线程安全的,因此不需要路由消息的开销等.AJA由很多非actor线程访问,并且每隔一段时间,它就会从Actor B接收更新的映射。
public class ActorAFacade extends UntypedActor implements Map<String, String> {
private volatile Map<String, String> immutableMap = Collections.emptyMap();
@Override
public String get(Object key) {
return immutableMap.get(key);
}
@Override
public String put(String key, String value) {
throw new UnsupportedOperationException("Read Only!");
}
...
@Override
public void onReceive(Object message) throws Exception {
if (message instanceof Map) {
immutableMap = (Map<String, String>) message;
} else {
unhandled(message);
}
}
}
我想避免为每个map方法创建和路由消息的开销(无论是由无类型的actor手动完成还是由类型化的actor自动完成)。
这种混合方法是否可行(它是否违反了演员系统的精神)?是否有更好的方法,Akka提供(即事件总线,回电等)?
答案 0 :(得分:0)
您可能希望查看Agents或Futures and Agents一般的内容。
答案 1 :(得分:0)
我不确定你对非演员世界的要求究竟是什么,你的意思是问?
ActorSystem system = ActorSystem.create("system");
ActorRef actor = system.actorOf(Props.create(SomeActor.class), "someActor");
Timeout t = new Timeout(5, TimeUnit.SECONDS);
Future<Object> future = Patterns.ask(actor, "some message", 1000);
try {String response = (String) Await.result(future, t.duration());} catch(Exception e){}
所以基本上你发送消息是&#34;某些消息&#34;对于SomeActor演员,然后在它的onReceive方法中你需要
public void onReceive(Object msg) throws Exception
{
if (msg instancof String)
{
getSender().tell("here is the response");
}
}
所以,如果你做一个System.out.println(响应),它将打印&#34;这里是响应&#34; 但是,是的可以使用代理以及评论中显示的但是他们吓坏了我(;