[
https://issues.apache.org/jira/browse/CAMEL-25142?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18120707#comment-18120707
]
Claus Ibsen commented on CAMEL-25142:
-------------------------------------
Design document (proposed): https://github.com/apache/camel/pull/27083
(design/cross-cutting-binding.adoc).
_Claude Code on behalf of davsclaus_
> camel-core - Late binding of onException, interceptors, onCompletion and
> route configurations, so they keep working when routes and configurations
> change at runtime
> --------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
> Key: CAMEL-25142
> URL: https://issues.apache.org/jira/browse/CAMEL-25142
> Project: Camel
> Issue Type: Improvement
> Components: camel-core
> Reporter: Claus Ibsen
> Assignee: Claus Ibsen
> Priority: Major
> Fix For: 4.24.0
>
>
> The cross-cutting features (onException, error handler, intercept,
> interceptFrom, interceptSendToEndpoint, onCompletion) and the route
> configurations that hold them are bound to the routes when the routes are
> created. This performs well, but it does not keep working when the routes or
> the configurations change while Camel runs, which the more dynamic and
> low-code use of Camel (dev reload, adding/removing routes, restarting the
> CamelContext, route configurations managed by tooling) needs.
> h3. How it works today
> * *Model time:* when a route is prepared, the builder-level definitions and
> the matching route configurations are merged into the route's outputs
> (RoutesDefinition.prepareRoute, RouteDefinitionHelper.prepareRoute). The
> definition objects are shared by all the routes, and a route is prepared only
> once (isPrepared).
> * *Reify time:* each route builds its own processors from them. onException
> becomes exception policies in an error handler, and the error handler is
> created per Channel (per EIP node), each with its own policy map. intercept
> becomes an InterceptStrategy that wraps each Channel when the Channel is
> built. onCompletion becomes route processors. interceptSendToEndpoint wrapped
> endpoints (see CAMEL-25140).
> * *After that the binding is fixed:*
> ** adding/removing a route configuration at runtime (ModelCamelContext) only
> changes the list; the routes that use it are not updated.
> ** dev reload works because it removes all the routes and loads all the files
> again (removeAllRoutes=true). With removeAllRoutes=false, routes in other
> files keep the old configuration. Route configurations removed from a file
> are never removed.
> ** a CamelContext restart creates the routes again from the prepared
> definitions, but intercept and interceptSendToEndpoint removed their
> definitions from the route outputs, so they are lost (interceptSendToEndpoint
> is fixed in CAMEL-25140).
> ** intercept only wraps the Channels built after it is reified, so the steps
> of an interceptFrom may not be intercepted (from reading the code, not
> verified).
> Related older tickets: CAMEL-18923 (updating a route configuration is not
> supported, as it is global and affects running routes), CAMEL-5629 (adding an
> intercept at runtime), CAMEL-3870 (reusable onExceptions, which led to route
> configurations), CAMEL-13912 (create error handlers when reifying rather than
> at runtime, for performance), CAMEL-25140, CAMEL-25141.
> h3. Goal
> Bind the cross-cutting features late: keep them in a registry of the
> CamelContext (by route configuration / RouteBuilder), and let the routes
> resolve what applies to them, with a cheap check on the hot path (such as a
> generation counter that is bumped when a configuration changes, and routes
> resolve again lazily). The per-message decision (which exception, onWhen,
> pattern) stays as today; only the wiring becomes dynamic. The order of
> precedence (route, then RouteBuilder, then route configuration) must stay
> exactly as today.
> h3. Plan
> A design document in design/ (cross-cutting-binding.adoc) with the current
> state per feature and the proposed model. Then, in steps:
> # route configurations (the unit for low-code): updating/removing one updates
> the routes that use it
> # onException / error handler (policies resolved from the registry instead of
> copied per Channel; ties in with CAMEL-24980)
> # intercept / interceptFrom
> # onCompletion
> If this can be done without invasive changes, it is a goal for Camel 4.24. If
> it turns out to need API or behaviour changes, it becomes a goal for Camel
> 5.0.
> _Claude Code on behalf of davsclaus_
--
This message was sent by Atlassian Jira
(v8.20.10#820010)