| Crates.io | fx-mq-jobs |
| lib.rs | fx-mq-jobs |
| version | 0.1.8 |
| created_at | 2025-10-06 19:52:53.842718+00 |
| updated_at | 2025-10-26 15:38:40.467562+00 |
| description | High-level job queue implementation using fx-mq-building-blocks |
| homepage | |
| repository | https://github.com/jakob-lilliemarck/fx-mq-jobs |
| max_upload_size | |
| id | 1870757 |
| size | 144,725 |
A type-safe job queue for monolithic Rust applications. Treats jobs as commands that run in the background with retries and crash recovery using a lease-based model.
Built for deployments where every host can handle all job types - no separate queues or specialized workers needed.
IMPORTANT - Running blocking code within job handlers may starve the listener. If you need to run blocking jobs in your handler, ensure the listener runs in a separate thread. Blocking the listener will cause long running transactions, and will trigger sqlx slow query warnings in the logs.
use fx_jobs::{Handler, RegistryBuilder, Listener, LeaseRenewer};
// 1. Define a job message
#[derive(Serialize, Deserialize, Clone)]
struct SendEmailJob {
to: String,
subject: String,
body: String,
}
impl Message for SendEmailJob {
const NAME: &'static str = "send_email";
}
// 2. Implement handler (one handler per job type)
struct EmailHandler;
impl Handler for EmailHandler {
type Message = SendEmailJob;
type Error = EmailError;
fn handle<'a>(&'a self, job: Self::Message, lease_renewer: LeaseRenewer) -> BoxFuture<'a, Result<(), Self::Error>> {
Box::pin(async move {
// For long-running jobs, extend the lease
// lease_renewer.renew_lease(Utc::now(), &pool).await?;
send_email(&job.to, &job.subject, &job.body).await?;
Ok(())
})
}
fn try_at(&self, attempted: i32, attempted_at: DateTime<Utc>) -> DateTime<Utc> {
attempted_at + Duration::from_secs(60 * attempted as u64) // Linear backoff
}
fn max_attempts(&self) -> i32 { 3 }
}
// 3. Set up processing
let registry = RegistryBuilder::new()
.with_handler(EmailHandler);
let mut listener = Listener::new(
pool,
registry,
4, // worker count
host_id, // uuid of this host
Duration::from_mins(5) // job lease duration
).await?;
// 4. Start processing
listener.listen().await?;
let publisher = Publisher::new(&pool, &queries);
let job = SendEmailJob { /* ... */ };
publisher.publish(&job).await?;