You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Claus Ibsen (Jira)" <ji...@apache.org> on 2021/09/01 05:21:00 UTC

[jira] [Updated] (CAMEL-16903) JdbcAggregationRepository not storing properties interfers with AggregateProcessor to restore completiontimeouts

     [ https://issues.apache.org/jira/browse/CAMEL-16903?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Claus Ibsen updated CAMEL-16903:
--------------------------------
    Fix Version/s: 3.12.0

> JdbcAggregationRepository not storing properties interfers with AggregateProcessor to restore completiontimeouts
> ----------------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-16903
>                 URL: https://issues.apache.org/jira/browse/CAMEL-16903
>             Project: Camel
>          Issue Type: Bug
>          Components: came-core, camel-sql
>    Affects Versions: 2.16.3
>            Reporter: Jonathan Schoreels
>            Priority: Minor
>             Fix For: 3.12.0
>
>
> Hello,
> I noticed during some testing with our production app that when a camel context is restarted, the completation timeouts of the aggregation were lost. I had the message :
> "Restored 0 CompletionTimeout conditions in the AggregationTimeoutChecker in 1 minute"
>  
> After some investigation, it looks the timeouts are restored from the properties of the exchange, snippet from AggregateProcessor in branch master :
>  
> {code:java}
> protected void restoreTimeoutMapFromAggregationRepository() throws Exception {
>     // grab the timeout value for each partly aggregated exchange
>     Set<String> keys = aggregationRepository.getKeys();
>     if (keys == null || keys.isEmpty()) {
>         return;
>     }
>     StopWatch watch = new StopWatch();
>     LOG.trace("Starting restoring CompletionTimeout for {} existing exchanges from the aggregation repository...",
>             keys.size());
>     for (String key : keys) {
>         Exchange exchange = aggregationRepository.get(camelContext, key);
>         // grab the timeout value
>         long timeout = exchange.hasProperties() ? exchange.getProperty(Exchange.AGGREGATED_TIMEOUT, 0, long.class) : 0;
>         if (timeout > 0) {
>             if (LOG.isTraceEnabled()) {
>                 LOG.trace("Restoring CompletionTimeout for exchangeId: {} with timeout: {} millis.",
>                         exchange.getExchangeId(), timeout);
>             }
>             addExchangeToTimeoutMap(key, exchange, timeout);
>         }
>     }
>     // log duration of this task so end user can see how long it takes to pre-check this upon starting
>     LOG.info("Restored {} CompletionTimeout conditions in the AggregationTimeoutChecker in {}",
>             timeoutMap.size(), TimeUtils.printDuration(watch.taken()));
> }
> {code}
> But, as the JdbcAggregationRepository doesn't store properties (by design I think), the timeout is lost and the aggregations are restored without ones.
>  
> This can be problematic because it causes a leakage of of element that will never be completed if the aggregation should have finished by a timeout.
>  
> As I see it, there is two possibilities :
>  * Modifying the current implementation of AggregateProcessor to load those from Headers : Quite impactful for something that only few aggregation repository will need
>  * Modifying JdbcAggregationRepository to store the exchange properties : may leak some internal / extra information in the database.
> What's your thoughts ?



--
This message was sent by Atlassian Jira
(v8.3.4#803005)