Struct Supervisor

Source
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

Source

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§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.