【发布时间】:2017-04-06 21:23:41
【问题描述】:
我有一个父演员是:
public sealed class PersistenceSupervisor : ReceiveActor
{
protected override void PreStart()
{
base.PreStart();
Become(Active);
}
protected override SupervisorStrategy SupervisorStrategy()
{
return new OneForOneStrategy(
10,
TimeSpan.FromSeconds(0),
x =>
{
return Directive.Restart;
});
}
private void Active(object message)
{
IInventorPersister inventorPersistor = new InventorPersister();
IActorRef persister = Context.ActorOf(Props.Create<Persister>(inventorPersistor), "persisterActor");
var task = persister.Ask(message);
task.Wait();
Sender.Tell(task.Result);
}
}
还有用于测试目的的具有随机失败功能的子actor:
public sealed class Persister : ReceiveActor
{
private readonly IInventorPersister inventorPersister;
protected override void PreStart()
{
base.PreStart();
Become(ActiveAsync);
}
private async void ActiveAsync(object message)
{
try
{
var savedSender = Context.Sender;
Task persisting = Persist(message as CreatePublication);
await persisting;
savedSender.Tell("Success");
}
catch (Exception e)
{
throw new Exception(e.ToString());
}
}
public Persister(IInventorPersister inventorPersister)
{
this.inventorPersister = inventorPersister;
}
private async Task Persist(CreatePublication message)
{
RandomFailure.Fail();
// This function is to make an UPDATE query to db
await inventorPersister.Persist(message.PublicationNumber, message.Inventors);
}
// Random failure for testing purpose
private static class RandomFailure
{
private static readonly Random R = new Random();
public static void Fail()
{
if (R.Next(0, 2) == 0)
{
throw new InvalidOperationException("Random failure");
}
}
}
}
这个想法是重新启动子actor直到它成功。但是,当失败发生时,应用程序会立即停止并崩溃。我很感激任何帮助。非常感谢。
【问题讨论】:
标签: c# .net akka console-application akka.net