pub struct Supervisor { /* private fields */ }Expand description
Manages a set of tasks, ensuring they remain operational through restarts.
The Supervisor spawns each task with a heartbeat mechanism to monitor liveness.
If a task stops sending heartbeats or fails, it is restarted with an exponential backoff.
User commands such as adding, restarting, or killing tasks are supported via the SupervisorHandle.
Implementations§
Source§impl Supervisor
impl Supervisor
Sourcepub fn run(self) -> SupervisorHandle
pub fn run(self) -> SupervisorHandle
Runs the supervisor, consuming it and returning a handle for external control.
This method initiates all tasks and starts the supervision loop.
Examples found in repository?
examples/simple.rs (line 30)
25async fn main() -> Result<(), Box<dyn Error>> {
26 // Build the supervisor with no initial tasks
27 let supervisor = SupervisorBuilder::default().build();
28
29 // Run the supervisor and get the handle
30 let handle = supervisor.run();
31
32 // Clone the handle for use in a separate task
33 let h = handle.clone();
34
35 // Spawn a task to manage and monitor the supervisor
36 tokio::spawn(async move {
37 // Add a new task after 5 seconds
38 tokio::time::sleep(Duration::from_secs(5)).await;
39 println!("Adding a task after 5 seconds...");
40 h.add_task("task1", MyTask { emoji: '🆕' })
41 .expect("Failed to add task");
42
43 // Check the status of the task after 2 seconds
44 tokio::time::sleep(Duration::from_secs(2)).await;
45 match h.get_task_status("task1").await {
46 Ok(Some(status)) => println!("Task 'task1' status: {status:?}"),
47 Ok(None) => println!("Task 'task1' not found"),
48 Err(e) => println!("Error getting task status: {e}"),
49 }
50
51 // Restart the task after 5 seconds
52 tokio::time::sleep(Duration::from_secs(5)).await;
53 println!("Restarting task after 5 seconds...");
54 h.restart("task1").expect("Failed to restart task");
55
56 // Check all task statuses after 2 seconds
57 tokio::time::sleep(Duration::from_secs(2)).await;
58 match h.get_all_task_statuses().await {
59 Ok(statuses) => {
60 println!("All task statuses:");
61 for (name, status) in statuses {
62 println!(" {name}: {status:?}");
63 }
64 }
65 Err(e) => println!("Error getting all task statuses: {}", e),
66 }
67
68 // Kill the task after 5 seconds
69 tokio::time::sleep(Duration::from_secs(5)).await;
70 println!("Killing task after 5 seconds...");
71 h.kill_task("task1").expect("Failed to kill task");
72
73 // Check the status again after killing
74 tokio::time::sleep(Duration::from_secs(2)).await;
75 match h.get_task_status("task1").await {
76 Ok(Some(status)) => println!("Task 'task1' status after kill: {:?}", status),
77 Ok(None) => println!("Task 'task1' not found after kill"),
78 Err(e) => println!("Error getting task status after kill: {}", e),
79 }
80
81 // Shutdown the supervisor after 5 seconds
82 tokio::time::sleep(Duration::from_secs(5)).await;
83 println!("Shutting down supervisor...");
84 h.shutdown().expect("Failed to shutdown supervisor");
85 });
86
87 // Wait for the supervisor to complete
88 handle.wait().await?;
89 println!("All tasks died and supervisor shut down! 🫡");
90
91 Ok(())
92}Auto Trait Implementations§
impl Freeze for Supervisor
impl !RefUnwindSafe for Supervisor
impl Send for Supervisor
impl !Sync for Supervisor
impl Unpin for Supervisor
impl !UnwindSafe for Supervisor
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more