Repository navigation
Closed
Description
Hi,
First of all thank you for this nice work!
I was trying to run two workers at the same time, but can't make the example work the way it's show on the readme.
What I have:
#[tokio::main]
async fn main() {
let pool = get_pg_pool().await;
let mut email_backend = PostgresStorage::new(&pool);
let mut reminder_backend = PostgresStorage::new(&pool);
let monitor = Monitor::new()
.on_event(|ctx, event| println!("{}: {:?}", ctx.name(), event))
.register(move |_| {
let a = WorkerBuilder::new("email-worker")
.backend(email_backend)
.build(send_email_job);
a
})
.register(move |_| {
let b = WorkerBuilder::new("reminder-worker")
.backend(reminder_backend)
.build(send_reminder);
b
});
monitor.run().await.unwrap();
}But it says:
error[E0507]: cannot move out of `reminder_backend`, a captured variable in an `Fn` closure
--> src/bin/worker.rs:22:26
|
10 | let mut reminder_backend = PostgresStorage::new(&pool);
| -------------------- --------------------------- move occurs because `reminder_backend` has type `apalis_postgres::PostgresStorage<Remind>`, which does not implement the `Copy` trait
| |
| captured outer variable
...
20 | .register(move |_| {
| -------- captured by this `Fn` closure
21 | let b = WorkerBuilder::new("reminder-worker")
22 | .backend(reminder_backend)
| ^^^^^^^^^^^^^^^^ `reminder_backend` is moved here
What works:
async fn main() {
let pool = get_pg_pool().await;
let pool_b = get_pg_pool().await;
let monitor = Monitor::new()
.on_event(|ctx, event| println!("{}: {:?}", ctx.name(), event))
.register(move |_| {
let mut email_backend = PostgresStorage::new(&pool);
let a = WorkerBuilder::new("email-worker")
.backend(email_backend)
.build(send_email_job);
a
})
.register(move |_| {
let mut reminder_backend = PostgresStorage::new(&pool_b);
let b = WorkerBuilder::new("reminder-worker")
.backend(reminder_backend)
.build(send_reminder);
b
});
monitor.run().await.unwrap();
}But it's rather ugly to duplicate the pool for each backend?
I'm sure I'm doing something wrong, but I don't see it right now
Thanks and cheers!
Frank
Metadata
Metadata
Assignees
Labels
No labels
Activity
geofmureithi commentedon Feb 19, 2026
Have you looked at this example?
You have a
moveproblem where the register callback needsClonesince Monitor may need to restart a Worker.Frankkkkk commentedon Feb 19, 2026
It looks like the PostgresStorage doesn't implement clone:
geofmureithi commentedon Feb 19, 2026
That is a bug, It should be a straight forward fix. Will do a fix ASAP
geofmureithi commentedon Feb 19, 2026
https://docs.rs/apalis-postgres/latest/apalis_postgres/struct.PgFetcher.html#impl-Clone-for-PgFetcher%3CArgs,+Compact,+Decode%3E
The problem is that it expects
Argsto be clone and I guessSendEmailis not.Making your
SendEmailclone might fix this for nowFrankkkkk commentedon Feb 19, 2026
Hey, you're right, that fixes it. Sorry for the hassle, and thanks!
geofmureithi commentedon Feb 19, 2026
Reopening this to allow Clone without Args being Clone
geofmureithi commentedon Feb 21, 2026
Fixed in latest release