In my job, I have 2 nodes running that uses Oban but should have different configs for them (queues, cron, etc).
For each node, I have a different DynamicCron
config:
Node 1:
Application.get_env(:core, Oban)
[
name: :pacman_oban,
...
plugins: [
...
{Oban.Pro.Plugins.DynamicCron,
[
name: :pacman_oban,
sync_mode: :automatic,
crontab: [
{"@daily", Core.Workers.RemoveOldTriedSkipTraces, [name: "remove-old-tried-skip-traces"]},
{"@daily", Core.Workers.ProcessData, [name: "process-data"]}
]
]}
]
}
Node 2:
Application.get_env(:core, Oban)
[
name: :marketplace_oban,
...
plugins: [
...
{Oban.Pro.Plugins.DynamicCron,
[
name: :marketplace_oban,
sync_mode: :automatic,
crontab: [
{"@hourly", Core.Workers.ProcessPropertyViewCountWorker, [name: "process-property-view-count", args: %{interval: "1h"}]},
{"@daily", Core.Workers.ExpireShortUrl, [name: "expire-short-url"]},
{"@hourly", Core.Workers.StartFetchEmails, [name: "start-fetch-emails"]},
{"@hourly", Core.Workers.StartDealEmails, [name: "start-deal-emails"]},
{"0 23 * * *", Core.Workers.SendPushNotification, [name: "upcoming-appointment-notification", args: %{type: "upcoming_appointment"}]},
{"0 */2 * * *", Core.Workers.SendPushNotification, [name: "pending-appointment-notification", args: %{type: "pending_appointment"}]},
{"*/10 * * * *", Core.Workers.SendPushNotification, [name: "start-appointment-reminder-notification", args: %{type: "start_appointment_reminder"}]}
]
]}
]
}
As you can see, each node has a specific oban name (:pacman_oban
and :marketplace_oban
) and a specific DynamicCron
config as-well.
The issue I’m seeing, is that, when I run these nodes and then run Oban.Pro.Plugins.DynamicCron.all(:pacman_oban)
for Node 1 and Oban.Pro.Plugins.DynamicCron.all(:marketplace_oban)
for Node 2, both shows the config of one of them two nodes randomly (sometimes it shows the node 1 cron jobs, sometimes the node 2 cron jobs, I think it depends on which node starts first).
For example, right now, the node loaded Node 1 config on both nodes:
Node 1:
Oban.Pro.Plugins.DynamicCron.all(:pacman_oban)
[
%Oban.Pro.Cron{
__meta__: #Ecto.Schema.Metadata<:loaded, "public", "oban_crons">,
name: "remove-old-tried-skip-traces",
expression: "@daily",
worker: "Core.Workers.RemoveOldTriedSkipTraces",
opts: %{},
paused: false,
insertions: [],
lock_version: 2,
parsed: nil,
inserted_at: ~U[2025-06-17 13:19:00.699969Z],
updated_at: ~U[2025-06-17 13:19:00.699969Z]
},
%Oban.Pro.Cron{
__meta__: #Ecto.Schema.Metadata<:loaded, "public", "oban_crons">,
name: "process-data",
expression: "@daily",
worker: "Core.Workers.ProcessData",
opts: %{},
paused: false,
insertions: [],
lock_version: 2,
parsed: nil,
inserted_at: ~U[2025-06-17 13:19:00.703162Z],
updated_at: ~U[2025-06-17 13:19:00.703162Z]
}
]
Node 2:
Oban.Pro.Plugins.DynamicCron.all(:marketplace_oban)
[
%Oban.Pro.Cron{
__meta__: #Ecto.Schema.Metadata<:loaded, "public", "oban_crons">,
name: "remove-old-tried-skip-traces",
expression: "@daily",
worker: "Core.Workers.RemoveOldTriedSkipTraces",
opts: %{},
paused: false,
insertions: [],
lock_version: 2,
parsed: nil,
inserted_at: ~U[2025-06-17 13:19:00.699969Z],
updated_at: ~U[2025-06-17 13:19:00.699969Z]
},
%Oban.Pro.Cron{
__meta__: #Ecto.Schema.Metadata<:loaded, "public", "oban_crons">,
name: "process-data",
expression: "@daily",
worker: "Core.Workers.ProcessData",
opts: %{},
paused: false,
insertions: [],
lock_version: 2,
parsed: nil,
inserted_at: ~U[2025-06-17 13:19:00.703162Z],
updated_at: ~U[2025-06-17 13:19:00.703162Z]
}
]
Initially, I thought the issue was that I was not setting the oban name field in the DynamicCron
config, but, as you can see above, I now have they set correctly and it still loads the cron jobs incorrectly.
Am I doing something wrong here or is this a bug?