Crates.io | processmanager |
lib.rs | processmanager |
version | 0.3.2 |
source | src |
created_at | 2024-03-27 22:19:41.373239 |
updated_at | 2024-11-10 10:33:22.937552 |
description | manage process lifecycles, graceful shutdown and process faults |
homepage | |
repository | https://github.com/mrcrgl/processmanager-rs |
max_upload_size | |
id | 1188481 |
size | 30,502 |
Manage multiple running services. A ProcessManager collects impl of Runnable
and takes over the runtime management like starting, stopping (graceful or in
failure) of services.
If one service fails, the manager initiates a graceful shutdown for all other.
use processmanager::*;
#[tokio::main]
async fn main() {
#[derive(Default)]
struct ExampleController {
runtime_guard: RuntimeGuard,
}
#[async_trait::async_trait]
impl Runnable for ExampleController {
async fn process_start(&self) -> Result<(), RuntimeError> {
// This can be any type of future like an async streams
let mut interval = tokio::time::interval(tokio::time::Duration::from_secs(1));
loop {
match self.runtime_guard.tick(interval.tick()).await {
ProcessOperation::Next(_) => println!("work"),
ProcessOperation::Control(RuntimeControlMessage::Shutdown) => {
println!("shutdown");
break
},
ProcessOperation::Control(RuntimeControlMessage::Reload) => println!("trigger relead"),
}
}
Ok(())
}
fn process_handle(&self) -> Box<dyn ProcessControlHandler> {
Box::new(self.runtime_guard.handle())
}
}
let mut manager = ProcessManager::new();
manager.insert(ExampleController::default());
let handle = manager.process_handle();
// start all processes
let _ = tokio::spawn(async move {
manager.process_start().await.expect("service start failed");
});
// Shutdown waits for all services to shutdown gracefully.
handle.shutdown().await;
}