use crate::error::Result;
use async_trait::async_trait;
use std::sync::Arc;
pub type JobId = uuid::Uuid;
#[derive(Clone)]
pub struct JobContext {
pub queue: Arc<dyn crate::queue::Queue>,
pub worker_id: String,
}
impl JobContext {
pub async fn enqueue<J: Job>(&self, job: J, opts: crate::options::JobOptions) -> Result<JobId> {
let payload = serde_json::to_vec(&job)?;
let scheduled_at = opts.scheduled_at();
let req = crate::queue::EnqueueRequest {
job_type: J::NAME.to_string(),
queue: opts.queue,
payload,
max_retries: opts.max_retries,
priority: opts.priority,
scheduled_at,
};
self.queue.push(req).await
}
}
#[async_trait]
pub trait Job: serde::Serialize + serde::de::DeserializeOwned + Send + Sync + 'static {
const NAME: &'static str;
fn options() -> crate::options::JobOptions {
crate::options::JobOptions::default()
}
async fn execute(self, ctx: &JobContext) -> Result<()>;
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct RawJob {
pub id: JobId,
pub job_type: String,
pub queue: String,
pub payload: Vec<u8>,
pub attempts: u32,
pub max_retries: u32,
pub scheduled_at: chrono::DateTime<chrono::Utc>,
pub created_at: chrono::DateTime<chrono::Utc>,
pub error: Option<String>,
}