gpt4 book ai didi

java - 如何向非 Actor 世界公开 Akka Actor 的不可变消息?

转载 作者:行者123 更新时间:2023-12-01 14:14:26 25 4
gpt4 key购买 nike

我正在努力解决参与者系统和非参与者代码的交互。 Akka Java documentation第 3.2.1 节描述了使用 TypedActors 在 Actor 系统和外部非 Actor 世界之间执行桥接。

Typed actors are nice for bridging between actor systems (the “inside”) and non-actor code (the “outside”), because they allow you to write normal OO-looking code on the outside.

然后它继续描述三种不同的场景:

  • 单向消息发送
  • 发送请求-回复消息
  • 发送 future 消息请求回复

但所有这些场景都是从非 Actor 世界发起的。 Actor 系统调用非 Actor 代码的正确方法是什么?

我想做的是将参与者消息的不可变负载直接暴露给非参与者世界。例如,参与者 A 保留从参与者 B 接收的消息的不可变有效负载(例如映射)作为 volatile 实例变量,然后出于性能原因将该变量暴露给非参与者世界(通过普通的 getter 或正面)。该映射是不可变的,因此它本质上是线程安全的,因此不需要路由消息等开销。Actor A 被许多非 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);
}
}
}

我希望避免为每个映射方法创建和路由消息的开销(无论是由非类型化参与者手动完成还是由类型化参与者自动完成)。

这种混合方法是可行的解决方案吗(它是否违反了参与者系统的精神)? Akka 是否提供了更好的方法(即事件总线、回调等)?

最佳答案

您可能想查看AgentsFutures and Agents本章概述了这一点。

关于java - 如何向非 Actor 世界公开 Akka Actor 的不可变消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18245035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com