shashank created CAMEL-26289:
--------------------------------

             Summary: camel-quartz - with deleteJob=false (also with 
pauseJob=true) a trigger paused by a stopped endpoint is never resumed after a 
restart with a persistent job store, or when the route is added again
                 Key: CAMEL-26289
                 URL: https://issues.apache.org/jira/browse/CAMEL-26289
             Project: Camel
          Issue Type: Bug
          Components: camel-quartz
            Reporter: shashank
            Assignee: shashank


The quartz consumer pauses its trigger when it stops 
({{QuartzEndpoint.onConsumerStop}} -> {{pauseTrigger}}, whatever {{pauseJob}} 
is; not with a clustered job store), and the endpoint resumes it when the 
consumer starts again. Whether to resume is decided by the endpoint's own 
{{jobPaused}} flag (main dc990927b60e, {{QuartzEndpoint.resumeTrigger}} lines 
639-649), and {{addJobInScheduler}} keeps a trigger that already exists in the 
scheduler as it is when its settings did not change (lines 397-401). With the 
default {{deleteJob=true}} the endpoint deletes the trigger when it stops, so 
nothing stays paused. With {{deleteJob=false}} (which {{pauseJob=true}} 
requires) the trigger stays in the scheduler, paused, and a trigger paused by 
an earlier endpoint stays paused:
* with a persistent (JDBC) job store that is not clustered, the routes stop 
before the scheduler when the application stops, so the trigger is stored 
paused; after the restart the new endpoint finds it, does not know it is 
paused, and the route never fires again, without any message;
* in one JVM, a route that is removed and added again (a reload, a route 
template removed and added) has a new endpoint and never fires again.
Stopping and starting the same route works, because the same endpoint resumes 
the trigger it paused. The module has no test for {{deleteJob=false}} or 
{{pauseJob}} across a restart or a route added again.

*Fix*: when {{addJobInScheduler}} finds an existing trigger in state 
{{PAUSED}}, the endpoint uses {{deleteJob=false}} and the job store is not 
clustered, the endpoint marks the trigger as paused by itself, so its consumer 
resumes it when it starts (the endpoint start adds the job before the consumer 
starts). The check runs after a possible {{rescheduleJob}}. Endpoints with 
{{deleteJob=true}} and clustered job stores are not changed (Camel does not 
pause triggers in a clustered store). A trigger that was paused outside Camel 
(Quartz API) while the route was not running is now resumed when the route 
starts, as it already was when the same route was stopped and started; upgrade 
guide entry.

*Tests*: new {{QuartzPauseJobRouteAddedAgainTest}}: 
{{pauseJobTriggerFiresAgainWhenTheRouteIsAddedAgain}} and 
{{keptTriggerFiresAgainWhenTheRouteIsAddedAgain}} ({{deleteJob=false}} without 
{{pauseJob}}) fail on main ({{mock://paused Received message count 0, expected 
at least 1}}), {{triggerFiresAgainWhenTheRouteIsStartedAgain}} passes on main 
(control). New {{SpringQuartzPersistentStorePauseJobRestartAppTest}} (H2 job 
store, as {{SpringQuartzPersistentStoreRestartAppTest}}, one route with 
{{pauseJob=true&deleteJob=false}} and one with {{deleteJob=false}}): fails on 
main, after the restart {{mock://result Received message count 0, expected at 
least 1}}. With the fix camel-quartz has 118 tests, 0 failures.

*How it was found*: a random lifecycle-sequence harness (stop, start, suspend, 
resume, remove and add of several quartz routes on one scheduler, checking 
after each step that started routes fire and stopped ones do not) shrank a 
failure to {{[REMOVE(r), ADD(r)]}} for the route with {{pauseJob=true}}; a 
review then found that {{deleteJob=false}} alone fails the same way, and the 
persistent-store case follows from the same code.

*Affected*: main, camel-4.22.x, camel-4.18.x and camel-4.14.x (same 
{{onConsumerStop}}, {{resumeTrigger}} and {{addJobInScheduler}}; read, not run).

_Filed with Claude Code on behalf of allthingssecurity._



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to