David Borsos created CAMEL-15682:
------------------------------------

             Summary: Aggregate route recovery fails to start up
                 Key: CAMEL-15682
                 URL: https://issues.apache.org/jira/browse/CAMEL-15682
             Project: Camel
          Issue Type: Bug
          Components: camel-core
    Affects Versions: 3.5.0, 3.4.2
         Environment: * Apache Camel 3.4.2
 * Spring Boot 2.3.4.RELEASE
 * Postgres database as an aggregate repository
            Reporter: David Borsos


Hello,

We've recently had an outage in one of our applications built using Apache 
Camel and specifically using a JDBC-based aggregation on one route.

After an unclean exit, the application continued to fail to start up.

The only way for us to recover from this situation was to erase the contents of 
the aggregate repository and recover the lost data manually. Until we executed 
that, the application was completely offline (this error resulted in a failure 
that exited the whole JVM)

The error we observed during startup:

{code}
org.apache.camel.FailedToStartRouteException: Failed to start route 
event.aggregator because of null
        at 
org.apache.camel.impl.engine.RouteService.warmUp(RouteService.java:125)
        at 
org.apache.camel.impl.engine.InternalRouteStartupManager.doWarmUpRoutes(InternalRouteStartupManager.java:263)
        at 
org.apache.camel.impl.engine.InternalRouteStartupManager.safelyStartRouteServices(InternalRouteStartupManager.java:156)
        at 
org.apache.camel.impl.engine.InternalRouteStartupManager.doStartOrResumeRoutes(InternalRouteStartupManager.java:114)
        at 
org.apache.camel.impl.engine.AbstractCamelContext.doStartCamel(AbstractCamelContext.java:2809)
        at 
org.apache.camel.impl.engine.AbstractCamelContext.doStartContext(AbstractCamelContext.java:2657)
        at 
org.apache.camel.impl.engine.AbstractCamelContext.doStart(AbstractCamelContext.java:2620)
        at 
org.apache.camel.spring.boot.SpringBootCamelContext.doStart(SpringBootCamelContext.java:43)
        at 
org.apache.camel.support.service.BaseService.start(BaseService.java:115)
        at 
org.apache.camel.impl.engine.AbstractCamelContext.start(AbstractCamelContext.java:2452)
        at 
org.apache.camel.spring.SpringCamelContext.start(SpringCamelContext.java:121)
        at 
org.apache.camel.spring.SpringCamelContext.onApplicationEvent(SpringCamelContext.java:157)
        at 
org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
        at 
org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
        at 
org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
        at 
org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:404)
        at 
org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:361)
        at 
org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:898)
        at 
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:554)
        at 
org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143)
        at 
org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758)
        at 
org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750)
        at 
org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
        at 
org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
        at 
org.springframework.boot.SpringApplication.run(SpringApplication.java:1237)
        at 
org.springframework.boot.SpringApplication.run(SpringApplication.java:1226)
        at 
com.winnowsolutions.vision.annotation.app.MainApplication.main(MainApplication.java:25)
        at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at 
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at 
org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:109)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88)
Caused by: org.apache.camel.RuntimeCamelException: 
java.lang.ClassCastException: class java.lang.Integer cannot be cast to class 
java.lang.Long (java.lang.Integer and java.lang.Long are in module java.base of 
loader 'bootstrap')
        at 
org.apache.camel.RuntimeCamelException.wrapRuntimeCamelException(RuntimeCamelException.java:52)
        at 
org.apache.camel.support.ChildServiceSupport.start(ChildServiceSupport.java:67)
        at 
org.apache.camel.support.service.ServiceHelper.startService(ServiceHelper.java:84)
        at 
org.apache.camel.support.service.ServiceHelper.startService(ServiceHelper.java:101)
        at 
org.apache.camel.processor.channel.DefaultChannel.doStart(DefaultChannel.java:143)
        at 
org.apache.camel.support.service.BaseService.start(BaseService.java:115)
        at 
org.apache.camel.support.service.ServiceHelper.startService(ServiceHelper.java:84)
        at 
org.apache.camel.support.service.ServiceHelper.startService(ServiceHelper.java:87)
        at org.apache.camel.processor.Pipeline.doStart(Pipeline.java:154)
        at 
org.apache.camel.support.service.BaseService.start(BaseService.java:115)
        at 
org.apache.camel.support.service.ServiceHelper.startService(ServiceHelper.java:84)
        at 
org.apache.camel.support.processor.DelegateAsyncProcessor.doStart(DelegateAsyncProcessor.java:78)
        at 
org.apache.camel.support.service.BaseService.start(BaseService.java:115)
        at 
org.apache.camel.support.service.ServiceHelper.startService(ServiceHelper.java:84)
        at 
org.apache.camel.impl.engine.RouteService.startChildService(RouteService.java:334)
        at 
org.apache.camel.impl.engine.RouteService.doWarmUp(RouteService.java:184)
        at 
org.apache.camel.impl.engine.RouteService.warmUp(RouteService.java:123)
        ... 34 common frames omitted
Caused by: java.lang.ClassCastException: class java.lang.Integer cannot be cast 
to class java.lang.Long (java.lang.Integer and java.lang.Long are in module 
java.base of loader 'bootstrap')
        at 
org.apache.camel.processor.aggregate.AggregateProcessor.restoreTimeoutMapFromAggregationRepository(AggregateProcessor.java:894)
        at 
org.apache.camel.processor.aggregate.AggregateProcessor.doStart(AggregateProcessor.java:1532)
        at 
org.apache.camel.support.service.BaseService.start(BaseService.java:115)
        at 
org.apache.camel.support.service.ServiceHelper.startService(ServiceHelper.java:84)
        at 
org.apache.camel.support.service.ServiceHelper.startService(ServiceHelper.java:101)
        at 
org.apache.camel.processor.errorhandler.RedeliveryErrorHandler.doStart(RedeliveryErrorHandler.java:1459)
        at 
org.apache.camel.support.ChildServiceSupport.start(ChildServiceSupport.java:60)
        ... 49 common frames omitted
{code}

After some investigation we have identified that the error is sourced from the 
way Camel is defaulting certain values when recovering the aggregate contents 
from the repository; specifically:

https://github.com/apache/camel/blob/camel-3.4.2/core/camel-base/src/main/java/org/apache/camel/processor/aggregate/AggregateProcessor.java#L894

{code:java}
long timeout = exchange.hasProperties() ? 
exchange.getProperty(Exchange.AGGREGATED_TIMEOUT, 0, long.class) : 0;
{code}

This code is problematic if the branch that gets executed is the one where the 
default {{0}} (Integer) value is attempted to be cast to the target {{long}} 
variable.

Please correct the defaulting outlined in the code above so that it defaults 
with the correct (Long) type. 



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

Reply via email to