We are already running Dockerised Apache Camel/Spring Boot containers and have 
been looking at  deploying them inside Kubernetes, and using the Kubernetes 
Cron Job to create a Jobs on a time-based schedule.

Since the scheduling will happen "outside" Camel for our (ETL) Camel route I 
have replaced the scheduled interval with a timer that fires just once:


    from("timer://foo?repeatCount=1")
              .routePolicy(myPolicy)
              .routeId("timer in action")
              .to("mock:foo");


Because the Kubernetes Job needs to complete, we need not just stop the route, 
but the SpringBoot application context. For that purpose we define a Policy - 
mostly noop - except for the OnExchangeComplete method, which closes the 
autowired appContext:


    public void onExchangeDone(Route route, Exchange exchange) {
        appContext.close();
    }


That works, but I still get a warning before the Spring Container shuts down:


    o.a.c.i.DefaultInflightRepository | Shutting down while there are still 1 
inflight exchanges.
    Spring Container is destroyed!


If I put the extra logging below in, it confirms there is 1 Exchange for the 
"timer in action" route


    
camelContext.getInflightRepository().browse().iterator().next().getFromRouteId());
    camelContext.getInflightRepository().browse().size());


My question is: given this is fire-once timer route, and the Exchange is done 
being routed, why would there still be 1 inflight exchange? And if above is not 
correct approach, what would be a correct way/time to close the spring context?


This e-mail may contain information which is confidential, subject to legal 
privilege and /or protected by copyright.  If you are not the intended 
recipient (or have received this e-mail in error) please notify the sender 
immediately and destroy all copies of this email.

Reply via email to