Files
Christophe Bliard dcc3428f51 Unsubscribe events when unloading JobStatus class in dev mode
`OpenProject::JobStatus::EventListener.register!` is called in  a
`config.to_prepare` block, meaning it's called after each reload in
development mode and events are subscribed to multiple times.

This is for instance visible in logs with the same job-related message
being logged multiple times:

```
I, [2025-11-21T10:02:13.993101 #51789]  INFO -- : [ActiveJob] Enqueued Journals::CompletedJob (Job ID: 85e5a6cf-e394-4d44-87c7-177aa4535a65) to GoodJob(default) at 2025-11-21 09:07:13 UTC
I, [2025-11-21T10:02:13.993971 #51789]  INFO -- : [ActiveJob] ↳ app/workers/journals/completed_job.rb:39:in 'Journals::CompletedJob.schedule'
D, [2025-11-21T10:02:13.994114 #51789] DEBUG -- : [ActiveJob] Enqueuing background job #<Journals::CompletedJob:0x00000003d59def80 @arguments=[81, 2025-11-21 09:00:52.603688000 UTC +00:00, true], @job_id="85e5a6cf-e394-4d44-87c7-177aa4535a65", @queue_name="default", @scheduled_at=2025-11-21 09:07:13.984857000 UTC +00:00, @priority=5, @executions=0, @exception_executions={}, @timezone="Etc/UTC", @successfully_enqueued=true, @provider_job_id="85e5a6cf-e394-4d44-87c7-177aa4535a65", @_halted_callback_hook_called=nil>
D, [2025-11-21T10:02:13.994153 #51789] DEBUG -- : [ActiveJob] Enqueuing background job #<Journals::CompletedJob:0x00000003d59def80 @arguments=[81, 2025-11-21 09:00:52.603688000 UTC +00:00, true], @job_id="85e5a6cf-e394-4d44-87c7-177aa4535a65", @queue_name="default", @scheduled_at=2025-11-21 09:07:13.984857000 UTC +00:00, @priority=5, @executions=0, @exception_executions={}, @timezone="Etc/UTC", @successfully_enqueued=true, @provider_job_id="85e5a6cf-e394-4d44-87c7-177aa4535a65", @_halted_callback_hook_called=nil>
D, [2025-11-21T10:02:13.994178 #51789] DEBUG -- : [ActiveJob] Enqueuing background job #<Journals::CompletedJob:0x00000003d59def80 @arguments=[81, 2025-11-21 09:00:52.603688000 UTC +00:00, true], @job_id="85e5a6cf-e394-4d44-87c7-177aa4535a65", @queue_name="default", @scheduled_at=2025-11-21 09:07:13.984857000 UTC +00:00, @priority=5, @executions=0, @exception_executions={}, @timezone="Etc/UTC", @successfully_enqueued=true, @provider_job_id="85e5a6cf-e394-4d44-87c7-177aa4535a65", @_halted_callback_hook_called=nil>
D, [2025-11-21T10:02:13.994203 #51789] DEBUG -- : [ActiveJob] Enqueuing background job #<Journals::CompletedJob:0x00000003d59def80 @arguments=[81, 2025-11-21 09:00:52.603688000 UTC +00:00, true], @job_id="85e5a6cf-e394-4d44-87c7-177aa4535a65", @queue_name="default", @scheduled_at=2025-11-21 09:07:13.984857000 UTC +00:00, @priority=5, @executions=0, @exception_executions={}, @timezone="Etc/UTC", @successfully_enqueued=true, @provider_job_id="85e5a6cf-e394-4d44-87c7-177aa4535a65", @_halted_callback_hook_called=nil>
D, [2025-11-21T10:02:13.994229 #51789] DEBUG -- : [ActiveJob] Enqueuing background job #<Journals::CompletedJob:0x00000003d59def80 @arguments=[81, 2025-11-21 09:00:52.603688000 UTC +00:00, true], @job_id="85e5a6cf-e394-4d44-87c7-177aa4535a65", @queue_name="default", @scheduled_at=2025-11-21 09:07:13.984857000 UTC +00:00, @priority=5, @executions=0, @exception_executions={}, @timezone="Etc/UTC", @successfully_enqueued=true, @provider_job_id="85e5a6cf-e394-4d44-87c7-177aa4535a65", @_halted_callback_hook_called=nil>
D, [2025-11-21T10:02:13.994254 #51789] DEBUG -- : [ActiveJob] Enqueuing background job #<Journals::CompletedJob:0x00000003d59def80 @arguments=[81, 2025-11-21 09:00:52.603688000 UTC +00:00, true], @job_id="85e5a6cf-e394-4d44-87c7-177aa4535a65", @queue_name="default", @scheduled_at=2025-11-21 09:07:13.984857000 UTC +00:00, @priority=5, @executions=0, @exception_executions={}, @timezone="Etc/UTC", @successfully_enqueued=true, @provider_job_id="85e5a6cf-e394-4d44-87c7-177aa4535a65", @_halted_callback_hook_called=nil>
D, [2025-11-21T10:02:13.994278 #51789] DEBUG -- : [ActiveJob] Enqueuing background job #<Journals::CompletedJob:0x00000003d59def80 @arguments=[81, 2025-11-21 09:00:52.603688000 UTC +00:00, true], @job_id="85e5a6cf-e394-4d44-87c7-177aa4535a65", @queue_name="default", @scheduled_at=2025-11-21 09:07:13.984857000 UTC +00:00, @priority=5, @executions=0, @exception_executions={}, @timezone="Etc/UTC", @successfully_enqueued=true, @provider_job_id="85e5a6cf-e394-4d44-87c7-177aa4535a65", @_halted_callback_hook_called=nil>
...
```

Fix it by unsubscribing them all when the class is unloaded.
2025-11-24 09:27:45 +01:00
..