Pular para conteúdo

Enfileirando

Opções de enfileiramento

As opções vêm depois dos args, e um tipo de args pode fornecer seus próprios padrões com um método InsertOptions() []kiln.InsertOption, então quem chama não precisa repeti-las:

client.Enqueue(ctx, SendEmail{To: to},
    kiln.Queue("emails"),
    kiln.Delay(10*time.Minute),
    kiln.MaxAttempts(5),
    kiln.Tags{"welcome"},
    kiln.Title("Welcome email for "+to),
)

Title nomeia o job no dashboard, que caso contrário mostra o seu tipo; um tipo de args também pode ter um método Title() string. É possível filtrar por tags nas listas de jobs do dashboard.

Enfileiramento transacional

EnqueueTx e EnqueueManyTx recebem um driver.Writer vinculado à sua própria transação, então o job é inserido atomicamente junto com os dados de negócio que o geraram:

w := store.Tx(tx)
client.EnqueueTx(ctx, w, SendReceipt{OrderID: id})
tx.Commit(ctx)
w.Notify(ctx)

Chame Notify depois do commit, nunca antes. Nesse ponto o job já está commitado, então um erro de Notify não muda nada sobre ele: registre o erro e siga em frente, não transforme isso em uma requisição com falha, ou um cliente que tenta de novo vai criar o pedido duas vezes. Sem Notify o job roda do mesmo jeito, no próximo poll.

O writer transacional de cada store é um driver.TxWriter (incluindo Notify, um no-op no memstore.Tx), então código que roda em mais de um store pode guardar um desses em vez de verificar o tipo. No PostgreSQL através de database/sql (sqlx, bun, GORM com o driver stdlib do pgx), store.SQLTx(tx) recebe um *sql.Tx.