end to end job management support
This commit is contained in:
@@ -19,6 +19,8 @@ pub enum DispatcherError {
|
||||
ContextIdMissing,
|
||||
/// Invalid input provided
|
||||
InvalidInput(String),
|
||||
/// Job operation error
|
||||
JobError(hero_job::JobError),
|
||||
}
|
||||
|
||||
impl From<redis::RedisError> for DispatcherError {
|
||||
@@ -33,6 +35,12 @@ impl From<serde_json::Error> for DispatcherError {
|
||||
}
|
||||
}
|
||||
|
||||
impl From<hero_job::JobError> for DispatcherError {
|
||||
fn from(err: hero_job::JobError) -> Self {
|
||||
DispatcherError::JobError(err)
|
||||
}
|
||||
}
|
||||
|
||||
impl std::fmt::Display for DispatcherError {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
match self {
|
||||
@@ -50,6 +58,9 @@ impl std::fmt::Display for DispatcherError {
|
||||
DispatcherError::InvalidInput(msg) => {
|
||||
write!(f, "Invalid input: {}", msg)
|
||||
}
|
||||
DispatcherError::JobError(e) => {
|
||||
write!(f, "Job error: {}", e)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -11,6 +11,7 @@ pub use crate::job::JobBuilder;
|
||||
// Re-export types from hero_job for public API
|
||||
pub use hero_job::{Job, JobStatus, ScriptType};
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct Dispatcher {
|
||||
redis_client: redis::Client,
|
||||
caller_id: String,
|
||||
@@ -218,6 +219,23 @@ impl Dispatcher {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
// Method to start a previously created job
|
||||
pub async fn start_job(
|
||||
&self,
|
||||
job_id: &str,
|
||||
) -> Result<(), DispatcherError> {
|
||||
let mut conn = self.redis_client.get_multiplexed_async_connection().await?;
|
||||
|
||||
// Load the job to get its script type
|
||||
let job = Job::load_from_redis(&mut conn, job_id).await?;
|
||||
|
||||
// Select worker based on script type
|
||||
let worker_id = self.select_worker_for_script_type(&job.script_type)?;
|
||||
|
||||
self.start_job_using_connection(&mut conn, job_id.to_string(), worker_id).await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
// New method using dedicated reply queue with automatic worker selection
|
||||
pub async fn run_job_and_await_result(
|
||||
&self,
|
||||
|
Reference in New Issue
Block a user