- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个带有 ParentOrderActor
的 Akka 系统,它接收 Create
和 Read
消息以创建和读取子级 OrderActor
分别。
如果我在 main "/user/..."
路径中创建所有 Actor,一切顺利:
// Inside the ParentOrderActor ("/user/orders")
// Create in "/user"
getContext().system().actorOf(new Props(OrderActor.class), "ABC");
// Read via an ActorSelection
ActorSelection actorSelection = getContext().system().actorSelection("/user/ABC");
当一切顺利时,日志会显示:
ParentOrderActor -> created: Actor[akka://system/user/ABC#1132819541]
ParentOrderActor -> received: Message[name=Read, id=ABC]
ParentOrderActor -> actorSelection: ActorSelection[Actor[akka://system/]/user/ABC]
ParentOrderActor -> for id=Message[name=Read, id=ABC], we retrieved ActorRef: Actor[akka://system/user/ABC#1132819541]
但是当尝试在 ParentOrderActor 中创建和读取子 actor 时:
// Inside the ParentOrderActor ("/user/orders")
// Create in "/user/orders"
getContext().actorOf(new Props(OrderActor.class), "ABC");
// Read via an ActorSelection
ActorSelection actorSelection = getContext().actorSelection("ABC");
正在打印:
ParentOrderActor -> created: Actor[akka://system/user/orders/$a/ABC#-436492577]
ParentOrderActor -> received: Message[name=Read, id=ABC]
ParentOrderActor -> actorSelection: ActorSelection[Actor[akka://system/user/orders/$a#478613574]/ABC]
Oops: java.util.concurrent.TimeoutException: Futures timed out after [2 seconds]
ParentOrderActor -> for id=Message[name=Read, id=ABC], we retrieved ActorRef: null
我已经在 actorSelection(...)
中尝试了所有类型的路径,但 ActorRef
始终为 null
。
为了完整起见,这里有一个简短的 SSCCE 来演示上述内容:
public class Main {
private static boolean createChildrenInUser = false;
private static LoggingAdapter log;
static abstract class Message {
final String id;
Message(String id) {
this.id = id;
}
@Override
public String toString() {
return "Message[name=" + getClass().getSimpleName() + ", id=" + id + "]";
}
}
static class Create extends Message {
Create(String id) {
super(id);
}
}
static class Read extends Message {
Read(String id) {
super(id);
}
}
static class ParentOrderActor extends UntypedActor {
@Override
public void preStart() {
log.debug("ParentOrderActor -> starting...");
}
@Override
public void onReceive(Object message) throws Exception {
log.debug("ParentOrderActor -> received: {}", message);
if(message instanceof Create) {
if(createChildrenInUser) {
// Create an Actor in the root context ("/user/id").
ActorRef created = getContext().system().actorOf(new Props(OrderActor.class), ((Create)message).id);
log.debug("ParentOrderActor -> created: {}", created);
}
else {
// Create an Actor in this ParentOrderActor's context ("/user/orders/id")
ActorRef created = getContext().actorOf(new Props(OrderActor.class), ((Create)message).id);
log.debug("ParentOrderActor -> created: {}", created);
}
}
else if(message instanceof Read) {
ActorRef ref = select((Message)message);
log.debug("ParentOrderActor -> for id={}, we retrieved ActorRef: {}", message, ref);
getContext().system().shutdown();
}
else {
unhandled(message);
}
}
private ActorRef select(Message message) {
try {
ActorSelection actorSelection;
if(createChildrenInUser) {
// Select the Actor with a certain id in the root context ("/user/id").
actorSelection = getContext().system().actorSelection("/user/" + message.id);
}
else {
// Create an Actor in this ParentOrderActor's context ("/user/orders/id")
actorSelection = getContext().actorSelection(message.id);
}
log.debug("ParentOrderActor -> actorSelection: {}", actorSelection);
Timeout timeout = new Timeout(2, TimeUnit.SECONDS);
AskableActorSelection askableActorSelection = new AskableActorSelection(actorSelection);
Future<Object> future = askableActorSelection.ask(new Identify(1), timeout);
ActorIdentity actorIdentity = (ActorIdentity) Await.result(future, timeout.duration());
return actorIdentity.getRef();
}
catch(Exception e) {
log.debug("Oops: {}", e);
return null;
}
}
}
static class OrderActor extends UntypedActor {
@Override
public void preStart() {
log.debug("OrderActor -> starting...");
}
@Override
public void onReceive(Object message) throws Exception {
log.debug("OrderActor -> received: {}", message);
unhandled(message);
}
}
public static void main(String[] args) {
ActorSystem system = ActorSystem.create("system");
log = Logging.getLogger(system, Main.class);
ActorRef orders = system.actorOf(new Props(ParentOrderActor.class).withRouter(new RoundRobinRouter(1)), "orders");
orders.tell(new Create("ABC"), orders);
orders.tell(new Read("ABC"), orders);
}
}
运行上面的代码将导致 Read
返回一个 ActorRef
,它是 null
。将 boolean 标志 createChildrenInUser
更改为 true
将在 "/user"
中创建子 actor,一切顺利。
问题:如何创建 ActorSelection
并获取在 /user/orders
中创建的 actor 的 ActorRef
(ParentOrderActor
)?
最佳答案
如果我正确理解你的问题并且你想要从父 actor 中加载子 actor 的最佳方式,那么你可以使用:
getContext().child("ABC")
这将返回一个 scala.Option<ActorRef>
虽然不是 ActorSelection
, 所以如果你想用通配符查找多个 child 并向他们发送一条消息,这种方法将不起作用。
关于java - 创建一个 ActorSelection 以获取在父 actor 中创建的 ActorRef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21313519/
我正在尝试使用 Source.actorRef创建 akka.stream.scaladsl.Source 的方法目的。某种形式 import akka.stream.OverflowStrategy
我需要将 ActorRef 保留一段确定的时间。与此同时,我一直在“观察”这个 ActorRef。 由于某种原因,我的 ActorRef 是否可能变得无效,而我却没有收到“死信”? 抱歉,如果这个问题
我开始学习Akka并从official guid下载了示例: 我不明白tell方法第二个参数的用法: 在main方法中写入: howdyGreeter.tell(new WhoToGreet("Akk
我正在学习 Akka,并试图弄清楚如何让 Actor 互相交谈(我们称他们为 A 和 B)。这不是请求/响应场景,A和 B随时互相发送消息。 目前我有两个兄弟 Actor ,他们在两个方向上互相传递消
我们通过扩展 EventSourcedBehavior 将事件源与 Akka Persistence 结合使用。当我们创建持久性 Actor 时,我们通过使用 uuid 给它一个唯一的名称(与我们在
我有以下内容: val future = myActor ?消息 在我的 Actor 中,我收到的消息是这样的: 发件人!响应 如果我做了以下并忽略了响应,是否有任何负面影响? 我的 Actor !消
我尝试从 ActorSelection 获取多个 ActorRef。有人知道是否可能吗? 我的代码 ActorRef actorRef = Await.result(getContext().acto
我不明白关于在回调中关闭 actor ref 的声明。目前我正在使用 public void onReceive(Object message) throws Exception {
根据此链接的程序: Java Akka's ActorRef async issues 是否有任何 Akka native 函数可以用作 actor.tell 的调度函数?我想安排每个时间间隔来自动“
我已经开始使用 Akka 与并发程序进行异步: import akka.actor.ActorRef; import akka.actor.ActorSystem; import akka.actor
我开始使用 Spark Streaming 来处理我收到的实时数据馈送。我的场景是我有一个使用“with ActorHelper”的 Akka Actor 接收器,然后我让我的 Spark 工作做一些
我有两个 Actor 。每个 Actor 都位于不同的 ActorSystem 中。首先缓存第二个ActorRef。第一个 Actor 这样做: actorRef.tell(msg, self())
我想弄清楚我是否使用了传递 Akka ActorRef周围的其他 Actor 不是一种反模式。 我的系统中有几个 Actor 。有些人很长寿( restClientRouter , publisher
我尝试为一个类进行 Spock 测试,我需要检查它是否向 actor 发送消息(例如 statActor)。我知道 Akka 有专门的集成测试库,但对于非常简单的测试来说似乎太多了。所以,我尝试过:
我正在尝试使用 Source.actorRef 向 actor binset 发送消息,但这部分代码: println(s"Before mapping $src") src.mapMateriali
我有一个场景,当 Actor 收到特定消息时,它必须将该消息转发给当时存在的所有子级。 我想我有两个选择来解决这个问题。 getContext().actorSelection("*").forwar
好的,所以我正在使用 SJSON 为 scala 中的案例类编写隐式转换,以使用 akka 框架向远程参与者发送消息。其中一个案例类如下所示 case class Example(id: String
我想用预定义的消息数来完成一个流: Source.actorRef(Integer.MAX_VALUE, OverflowStrategy.fail()) .limit(1) .to(
根据Play documentation on WebSockets建立 WebSocket 的标准方法是使用 ActorFlow.actorRef,它采用返回我的 Actor 的 Props 的函数
我正在学习 Akka,在探索 API 时,我遇到了一些奇怪的东西(至少对我来说)。 tell函数直接在 ActorRef 类上定义。但是,ask函数在 AskSupport 特征中声明。我想不出他们为
我是一名优秀的程序员,十分优秀!