Claus Ibsen created CAMEL-23544:
-----------------------------------
Summary: Fix null fromRouteId and endpoint tracking for delegating
consumers (e.g. platform-http)
Key: CAMEL-23544
URL: https://issues.apache.org/jira/browse/CAMEL-23544
Project: Camel
Issue Type: Bug
Components: camel-core-api, camel-platform-http, camel-rest-openapi
Reporter: Claus Ibsen
h2. Problem
Three related issues affect components that delegate to a nested consumer (e.g.
rest-openapi delegating to platform-http, which delegates to
VertxPlatformHttpConsumer):
h3. 1. Null fromRouteId in platform-http exchanges
{{DefaultPlatformHttpConsumer.doInit()}} creates the nested
{{VertxPlatformHttpConsumer}} before {{RouteService.doSetup()}} calls
{{setRouteId()}} on the outer consumer. The nested consumer never receives the
route ID, so exchanges created by {{VertxPlatformHttpConsumer}} carry a null
{{fromRouteId}}.
*Fix:* Override {{setRouteId()}} in {{DefaultPlatformHttpConsumer}} to
propagate the route ID to the nested consumer whenever it is set:
{code:java}
@Override
public void setRouteId(String routeId) {
super.setRouteId(routeId);
if (platformHttpConsumer instanceof RouteIdAware ria) {
ria.setRouteId(routeId);
}
}
{code}
h3. 2. DefaultRuntimeEndpointRegistry misses consumer endpoint URIs for
delegating routes
When a route uses a logical endpoint URI (e.g. {{rest-openapi://...}}) but the
actual consumer uses a different URI (e.g. {{platform-http:///path}}), the
{{RouteAddedEvent}} handler only registered the logical URI in the inputs map.
ExchangeCreatedEvent hits recorded under the consumer URI were never matched,
causing TOTAL counts to show 0 in management tooling.
*Fix:* In the {{RouteAddedEvent}} handler, also add the consumer's endpoint URI
to the route's input set when it differs from the route endpoint URI. In the
{{RouteRemovedEvent}} handler, also remove it from {{inputUtilization}}.
h3. 3. New SyntheticBacklogTracer SPI
Components that process exchanges inline and bypass the normal route pipeline
(e.g. mock mode in rest-openapi consumer) cannot rely on
{{CamelInternalProcessor}} to emit trace events automatically. There was no
clean API for them to participate in message-history capture.
*Fix:* Introduce {{org.apache.camel.spi.SyntheticBacklogTracer}} (extends
{{BacklogTracer}}) with two methods:
- {{traceFirstNode(NamedNode, Exchange)}} - emits a first=true trace event
before inline processing
- {{traceLastNode(NamedNode, Exchange)}} - emits a last=true trace event after,
triggering message-history completion
{{BacklogTracer}} impl now implements {{SyntheticBacklogTracer}}. Callers look
it up via
{{camelContext.getCamelContextExtension().getContextPlugin(SyntheticBacklogTracer.class)}}.
h2. Affected files
-
{{components/camel-platform-http/src/main/java/org/apache/camel/component/platform/http/DefaultPlatformHttpConsumer.java}}
-
{{core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRuntimeEndpointRegistry.java}}
-
{{core/camel-api/src/main/java/org/apache/camel/spi/SyntheticBacklogTracer.java}}
(new)
-
{{core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/BacklogTracer.java}}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)