我有这个工作流程:
父级内部的方法
Receive<UpdatePositionCmd>(cmd =>
{
cmd.Qty = 150;
cmd.Price = 100;
_positionCoordinatorActor.Tell(cmd);
Thread.Sleep(30);
cmd.Qty = 250;
cmd.Price = 200;
_positionCoordinatorActor.Tell(cmd);
Thread.Sleep(30);
cmd.Qty = 133;
cmd.Price = 300;
_positionCoordinatorActor.Tell(cmd);
});
位置协调器内的方法接收来自#1的消息,找到合适的子节点并转发消息:
Command<UpdatePositionCmd>(cmd =>
{
var child = LookupChild(cmd.PositionName);
if (child != ActorRefs.Nobody)
{
child.Tell(cmd);
}
else
{
var @event = new PositionUpdatedEvent(cmd);
Persist(@event, positionUpdatedEvent =>
{
var childActor = Context.ActorOf(Props.Create(() => new PositionActor()), cmd.PositionName);
childActor.Tell(cmd);
});
}
});
获取转发消息的子项内部的方法:
Command<UpdatePositionCmd>(cmd =>
{
Console.Write($"\nCmd Qty: {cmd.Qty}");
Qty += cmd.Qty;
});
所以我的问题是:“告诉”之间的Thread.Sleep(30)
我得到正确的输出:
Cmd数量:150
Cmd数量:250
Cmd数量:133
总数量:533
但是我应该删除还是减少Thread.Sleep(30)
我得到了这个混乱的结果,其中基本上它只读取最后一条消息但是三次:
Cmd数量:133
Cmd数量:133
Cmd数量:133
总数量:399
请帮忙。谢谢!
答案 0 :(得分:1)
A method inside parent
收到一个UpdatePositionCmd
实例,将其传递给协调器,然后更新这个相同的命令。由于在第一次处理完成后第二次发出命令,因此延迟时间不太明显。
您应为每次调用_positionCoordinatorActor.Tell
创建一个新实例,并使UpdatePositionCmd
不可变,这样您就不会无意中更改已经发送过的实例。