Skip to content

How to use Monitor & Backend? #58

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