如何将Akka Actor的不可变消息暴露给非演员世界?

时间:2013-08-15 01:43:08

标签: java akka actor

我正在努力应对演员系统和非演员代码的交互。 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提供(即事件总线,回电等)?

2 个答案:

答案 0 :(得分:0)

您可能希望查看AgentsFutures 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; 但是,是的可以使用代理以及评论中显示的但是他们吓坏了我(;