extern crate riker; use riker::actors::*; use std::time::Duration; #[derive(Clone, Debug)] pub struct Panic; #[derive(Default)] struct DumbActor; impl Actor for DumbActor { type Msg = (); fn recv(&mut self, _: &Context, _: Self::Msg, _: Sender) {} } #[actor(Panic)] #[derive(Default)] struct PanicActor; impl Actor for PanicActor { type Msg = PanicActorMsg; fn pre_start(&mut self, ctx: &Context) { ctx.actor_of::("child_a").unwrap(); ctx.actor_of::("child_b").unwrap(); ctx.actor_of::("child_c").unwrap(); ctx.actor_of::("child_d").unwrap(); } fn recv(&mut self, ctx: &Context, msg: Self::Msg, sender: Sender) { self.receive(ctx, msg, sender); } } impl Receive for PanicActor { type Msg = PanicActorMsg; fn receive(&mut self, _ctx: &Context, _msg: Panic, _sender: Sender) { panic!("// TEST PANIC // TEST PANIC // TEST PANIC //"); } } // Test Restart Strategy #[actor(Panic)] #[derive(Default)] struct RestartSup { actor_to_fail: Option>, } impl Actor for RestartSup { type Msg = RestartSupMsg; fn pre_start(&mut self, ctx: &Context) { self.actor_to_fail = ctx.actor_of::("actor-to-fail").ok(); } fn supervisor_strategy(&self) -> Strategy { Strategy::Stop } fn recv(&mut self, ctx: &Context, msg: Self::Msg, sender: Sender) { self.receive(ctx, msg, sender) } } impl Receive for RestartSup { type Msg = RestartSupMsg; fn receive(&mut self, _ctx: &Context, _msg: Panic, _sender: Sender) { self.actor_to_fail.as_ref().unwrap().tell(Panic, None); } } fn main() { let sys = ActorSystem::new().unwrap(); let sup = sys.actor_of::("supervisor").unwrap(); // println!("Child not added yet"); // sys.print_tree(); println!("Before panic we see supervisor and actor that will panic!"); std::thread::sleep(Duration::from_millis(500)); sys.print_tree(); sup.tell(Panic, None); std::thread::sleep(Duration::from_millis(500)); println!("We should see panic printed, but we still alive and panic actor gone!"); sys.print_tree(); }