Loading...
Loading...
Compare original and translation side by side
JOB ARGS ARE JSON. ATOMS BECOME STRINGS.undefinedJOB ARGS ARE JSON. ATOMS BECOME STRINGS.undefinedundefinedundefinedundefinedundefinedundefinedundefinedundefinedundefinedundefinedundefineddef perform(%Oban.Job{} = job) do
case external_api_call(job.args) do
{:ok, result} -> {:ok, result}
{:error, :not_found} -> {:cancel, :resource_not_found} # Don't retry
{:error, :rate_limited} -> {:snooze, 60} # Retry in 60 seconds
{:error, _} -> {:error, :will_retry} # Normal retry
end
enddef perform(%Oban.Job{} = job) do
case external_api_call(job.args) do
{:ok, result} -> {:ok, result}
{:error, :not_found} -> {:cancel, :resource_not_found} # 不再重试
{:error, :rate_limited} -> {:snooze, 60} # 60秒后重试
{:error, _} -> {:error, :will_retry} # 正常重试
end
end{:snooze, seconds}def perform(%Oban.Job{} = job) do
if external_thing_finished?(job.args) do
{:ok, :done}
else
{:snooze, 5} # Check again in 5 seconds
end
end{:snooze, seconds}def perform(%Oban.Job{} = job) do
if external_thing_finished?(job.args) do
{:ok, :done}
else
{:snooze, 5} # 5秒后再次检查
end
enddef perform(%Oban.Job{} = job) do
result = do_work(job.args)
# Enqueue next job on success
NextWorker.new(%{data: result}) |> Oban.insert()
{:ok, result}
enddef perform(%Oban.Job{} = job) do
result = do_work(job.args)
# 成功时入队下一个任务
NextWorker.new(%{data: result}) |> Oban.insert()
{:ok, result}
enduniqueuse Oban.Worker,
queue: :default,
unique: [period: 60] # Only one job with same args per 60 secondsuniqueuse Oban.Worker,
queue: :default,
unique: [period: 60] # 每60秒内,相同参数的任务仅允许一个
**Gotcha:** Uniqueness is checked on insert, not execution. Two identical jobs inserted 61 seconds apart will both run.
**注意:** 唯一性是在插入时检查,而非执行时。如果两个相同的任务在61秒后插入,它们都会被执行。undefinedundefined
Use bulk inserts without uniqueness constraints for maximum throughput.
---
在没有唯一性约束的情况下使用批量插入以获得最大吞吐量。
---undefinedundefinedundefinedundefined| Creating | Processing | |
|---|---|---|
| Regular jobs | atoms ok | strings only |
| Cascade context | atoms ok | atoms ok |
| 创建时 | 处理时 | |
|---|---|---|
| 常规任务 | 允许使用原子 | 仅允许字符串 |
| 级联上下文 | 允许使用原子 | 允许使用原子 |
add_graftadd_workflowadd_graftadd_workflow| Method | Sub-workflow completes before deps run? | Output accessible? |
|---|---|---|
| No - just inserts jobs | No |
| Yes - waits for all jobs | Yes, via recorded values |
| 方法 | 子工作流完成后才运行依赖任务? | 输出是否可访问? |
|---|---|---|
| 否 - 仅插入任务 | 否 |
| 是 - 等待所有任务完成 | 是,可通过记录值访问 |
undefinedundefinedWorkflow.new()
|> Workflow.put_context(%{notification_opts: notification_opts})
|> Workflow.add_graft(:scoring, &graft_full_run/1)
|> Workflow.add_cascade(:send_notification, &send_notification/1, deps: :scoring)undefinedWorkflow.new()
|> Workflow.put_context(%{notification_opts: notification_opts})
|> Workflow.add_graft(:scoring, &graft_full_run/1)
|> Workflow.add_cascade(:send_notification, &send_notification/1, deps: :scoring)undefinedrecorded: truedefmodule FinalJob do
use Oban.Pro.Worker, queue: :default, recorded: true
def perform(%Oban.Job{} = job) do
# Return value becomes available in context
{:ok, %{score_run_id: score_run_id, composite_score: score}}
end
endrecorded: truedefmodule FinalJob do
use Oban.Pro.Worker, queue: :default, recorded: true
def perform(%Oban.Job{} = job) do
# 返回值会在上下文中可用
{:ok, %{score_run_id: score_run_id, composite_score: score}}
end
endWorkflow.append/2def perform(%Oban.Job{} = job) do
if needs_extra_step?(job.args) do
job
|> Workflow.append()
|> Workflow.add(:extra, ExtraWorker.new(%{}), deps: [:current_step])
|> Oban.insert_all()
end
{:ok, :done}
endWorkflow.append/2def perform(%Oban.Job{} = job) do
if needs_extra_step?(job.args) do
job
|> Workflow.append()
|> Workflow.add(:extra, ExtraWorker.new(%{}), deps: [:current_step])
|> Oban.insert_all()
end
{:ok, :done}
endundefinedundefined
**Tip:** Include pagination workers in the batch to prevent premature completion.
**提示:** 将分页Worker包含在批处理中,以避免提前触发完成回调。undefinedundefined
For testing recorded values between workers, insert predecessor jobs with pre-filled metadata.
---
要测试Worker之间的记录值,可插入带有预填充元数据的前置任务。
---perform/1{:ok, _}add_workflowrecorded: trueperform/1{:ok, _}add_workflowrecorded: true