Pular para conteúdo

Vindo do Hangfire

O Hangfire serializa uma chamada de método; o kiln enfileira um valor tipado e o roteia para um handler registrado para o seu Kind(). A maioria das chamadas tem uma correspondência direta:

Hangfire kiln
BackgroundJob.Enqueue(() => mailer.Send(to)) client.Enqueue(ctx, SendEmail{To: to})
BackgroundJob.Schedule(() => ..., TimeSpan.FromMinutes(30)) client.Enqueue(ctx, args, kiln.Delay(30*time.Minute))
BackgroundJob.Schedule(() => ..., runAt) client.Enqueue(ctx, args, kiln.At(runAt))
BackgroundJob.ContinueJobWith(parentId, () => ...) client.Enqueue(ctx, args, kiln.After{parentID})
ContinueJobWith(..., JobContinuationOptions.OnAnyFinishedState) kiln.AfterFinished{parentID}
BackgroundJob.Delete(id) / BackgroundJob.Requeue(id) client.Delete(ctx, id) / client.Requeue(ctx, id)
RecurringJob.AddOrUpdate("report", () => ..., Cron.Daily()) client.SetRecurring(ctx, "report", "@daily", Report{})
new RecurringJobOptions { TimeZone = tz } kiln.TZ("America/Sao_Paulo")
RecurringJob.TriggerJob("report") / RemoveIfExists("report") client.TriggerRecurring(ctx, "report") / client.RemoveRecurring(ctx, "report")
[Queue("critical")] kiln.Queue("critical"), ou InsertOptions() no tipo dos args
[AutomaticRetry(Attempts = 5)] kiln.MaxAttempts(5)
[AutomaticRetry(DelaysInSeconds = new[] { 60, 300 })] kiln.Handle(mux, h, kiln.Delays(time.Minute, 5*time.Minute))
[DisableConcurrentExecution(60)] kiln.Limit{Key: "reports", Max: 1}
Semáforo do Ace / rate limiter kiln.Limit{Key: k, Max: n} / kiln.Limit{Key: k, Rate: n, Per: time.Second}
Pro BatchJob.StartNew(x => x.Enqueue(...)) b := &kiln.Batch{}; b.Add(args); client.StartBatch(ctx, b)
Lotes aninhados do Pro, x.StartNew(...) dentro de um lote outer.AddBatch(inner), ou client.StartBatch(ctx, &kiln.Batch{Parent: id})
Pro BatchJob.ContinueBatchWith(batchId, ...) b.Then(args), ou client.Enqueue(ctx, args, kiln.AfterBatch(batchID))
parâmetro CancellationToken o ctx do handler, cancelado com a causa kiln.ErrCanceled em Delete
Hangfire.Console context.WriteLine("...") / WriteProgressBar() j.Logf("...") / j.SetProgress(n)
RecurringJob.AddOrUpdate para cada job na inicialização, removendo os antigos manualmente client.SyncRecurring(ctx, group, specs...)
[JobDisplayName("Welcome email for {0}")] kiln.Title("Welcome email for " + to), ou um método Title() nos args
context.SetJobParameter("cursor", c) j.SetParam(ctx, "cursor", c) / j.Param("cursor", &c)
IClientFilter / IServerFilter kiln.NewClient(store, mw...) / mux.Use(mw...)
Enqueue<IMailer>(x => x.Send(...)) resolvido via DI um method value com suas dependências: kiln.Handle(mux, mailer.Send)
AddHangfireServer(o => { o.WorkerCount = 20; o.Queues = ... }) kiln.ServerConfig{Pools: []kiln.Pool{{Queues: []string{"critical", "default"}, Workers: 20}}}
UseSqlServerStorage(conn) mssqlstore.New(ctx, db) no mesmo SQL Server, ou pgstore, mysqlstore, sqlitestore
app.UseHangfireDashboard("/hangfire") http.Handle("/kiln/", dashboard.New(client, dashboard.Options{Prefix: "/kiln", Authorize: auth}))