Skip to content

How to use Monitor & Backend? #58

@Frankkkkk

Description

@Frankkkkk

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
No labels

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions