diff --git a/src/main.rs b/src/main.rs index 6a3a3a6..712fc40 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,7 +10,7 @@ use std::time; use chrono::prelude::*; use database::init_database_pool; use model::{Job, JobAction}; -use worker::{Manager, WorkerStatus}; +use worker::{DeployHandler, Manager, WorkerStatus}; fn main() { let now: DateTime = Utc::now(); @@ -18,7 +18,9 @@ fn main() { init_database_pool(); let mut deployer: Manager = Manager::new("deploy"); - deployer.launch_workers(10); + + let handler = DeployHandler::new(); + deployer.launch_workers(4, handler); for i in 0..5000 { let job = Job::new(i, JobAction::MegaportDeploy); diff --git a/src/worker/handler.rs b/src/worker/handler.rs new file mode 100644 index 0000000..92d6d02 --- /dev/null +++ b/src/worker/handler.rs @@ -0,0 +1,31 @@ +use crate::message::Message; + +pub trait Handler { + fn handle(&self, res: Result); +} + +#[derive(Clone, Copy)] +pub struct DeployHandler {} + +impl DeployHandler { + pub fn new() -> Self { + Self {} + } + + fn manage_message(&self, message: Message) { + match message { + Message::CheckDeploy(body) => { + println!("{:?}", body) + } + } + } +} + +impl Handler for DeployHandler { + fn handle(&self, res: Result) { + match res { + Ok(m) => self.manage_message(m), + Err(_e) => todo!(), + } + } +} diff --git a/src/worker/mod.rs b/src/worker/mod.rs index 1657494..0235f12 100644 --- a/src/worker/mod.rs +++ b/src/worker/mod.rs @@ -1,3 +1,5 @@ +mod handler; mod worker; +pub use handler::DeployHandler; pub use worker::{Manager, Queue, WorkerStatus}; diff --git a/src/worker/worker.rs b/src/worker/worker.rs index 423fad2..04ffdd8 100644 --- a/src/worker/worker.rs +++ b/src/worker/worker.rs @@ -1,8 +1,9 @@ use std::collections::VecDeque; +use std::marker::Send; use std::sync::{Arc, Condvar, Mutex}; use std::thread; -use crate::message::Message; +use super::handler::Handler; use crate::model::*; pub struct Queue { @@ -58,7 +59,7 @@ pub struct Manager { queue: Arc>, } -impl Manager { +impl Manager { pub fn new(name: &str) -> Self { Self { name: name.to_string(), @@ -67,7 +68,11 @@ impl Manager { } } - pub fn launch_workers(&mut self, nb_workers: u32) { + pub fn launch_workers( + &mut self, + nb_workers: u32, + handler: U, + ) { for i in 0..nb_workers { let shared_worker = Arc::new(Mutex::new(Worker::new(i, self.name.clone()))); self.workers.push(shared_worker.clone()); @@ -89,10 +94,7 @@ impl Manager { drop(guard); Manager::::set_worker_status(&worker, WorkerStatus::Running); - match runner.run() { - Ok(m) => Manager::::manage_message(m), - Err(_e) => todo!(), - } + handler.handle(runner.run()); Manager::::set_worker_status(&worker, WorkerStatus::Pending); }); } @@ -114,14 +116,6 @@ impl Manager { true } - fn manage_message(message: Message) { - match message { - Message::CheckDeploy(body) => { - println!("{:?}", body) - } - } - } - fn set_worker_status(worker: &Arc>, status: WorkerStatus) { let mut guard = worker.lock().unwrap(); guard.set_status(status);