[
https://issues.apache.org/jira/browse/CAMEL-26596?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Claus Ibsen updated CAMEL-26596:
--------------------------------
Priority: Minor (was: Major)
> FileConsumer calls super.doStart() twice causing duplicate scheduling
> ---------------------------------------------------------------------
>
> Key: CAMEL-26596
> URL: https://issues.apache.org/jira/browse/CAMEL-26596
> Project: Camel
> Issue Type: Bug
> Components: camel-file, camel-scheduler
> Affects Versions: 4.18.5, 4.22.2, 4.23.0
> Reporter: Daniel Schmid
> Priority: Minor
> Labels: easyfix
>
> h2. The bug
> The FileConsumer#doStart method calls {{super.doStart()}} twice, once in and
> once outside of the {{{}try{}}}-block:
> [https://github.com/apache/camel/blob/da3c53374e32e0f82ec5b862e5bc9b471ae511c2/components/camel-file/src/main/java/org/apache/camel/component/file/FileConsumer.java#L472-L500]
> h2. The effect
> This will cause some parts of the startup logic unnecessarily being executed
> twice. One instance of this happening is {{ScheduledPollConsumer#doStart}}
> calling {{scheduler.scheduleTask(this);}} twice:
> [https://github.com/apache/camel/blob/da3c53374e32e0f82ec5b862e5bc9b471ae511c2/core/camel-support/src/main/java/org/apache/camel/support/ScheduledPollConsumer.java#L703]
>
> Because the {{DefaultScheduledPollConsumerScheduler#scheduleTask}} replaces
> the old task with the new one, this means that this bug (seemingly) has no
> affect with the default scheduler. However, custom schedulers may want to
> support being used across multiple routes:
>
> {code:java}
> // example code for a scheduler where the same scheduler object/bean may be
> used in multiple routes
> public class MultiScheduler extends DefaultScheduledPollConsumerScheduler {
> private List<Runnable> taskList;
> @Override
> public synchronized void scheduleTask(Runnable task) {
> if (taskList == null) {
> taskList = new ArrayList<>();
> super.scheduleTask(this::runAll);
> }
> taskList.add(task);
> }
> private void runAll() {
> taskList.forEach(Runnable::run);
> }
> }{code}
> If a {{FileConsumer}} is used with a scheduler like this, each schedule will
> run it twice (so the polling happens twice).
>
> h2. Suggested fix
> {{AbstractSftpConsumer}} [implements the same pattern
> correctly|https://github.com/apache/camel/blob/da3c53374e32e0f82ec5b862e5bc9b471ae511c2/components/camel-ftp-common/src/main/java/org/apache/camel/component/file/remote/AbstractSftpConsumer.java#L67-L93]
> without the duplicate {{super.doStart()}} call. {{FileConsumer}} should work
> similar to that and the second {{super.doStart();}} should be removed.
>
>
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)