shashank created CAMEL-26688:
--------------------------------

             Summary: camel-core - step listener SPI for the exchange sanitizer
                 Key: CAMEL-26688
                 URL: https://issues.apache.org/jira/browse/CAMEL-26688
             Project: Camel
          Issue Type: Improvement
          Components: camel-core
            Reporter: shashank
            Assignee: shashank


Step 1 of the order of work of the exchange sanitizer design (CAMEL-26630, 
design document in apache/camel#29296).

*What it adds*
* {{org.apache.camel.spi.StepListener}} in camel-api: a listener that observes 
each call of the processor of a step of a route: {{onStepCall}} (the call 
starts; returns a state for the call), {{onStepReturn}}, {{onStepThrow}} and 
{{onStepCallback}} (each time the callback of the call is called, before it 
continues the exchange). All methods have an empty default. A listener only 
observes; many can be installed, separate from the one {{StepHook}}.
* {{ExtendedCamelContext.addStepListener}}, {{removeStepListener}} and 
{{getStepListeners}}, as default methods (the pattern of {{setStepHook}}).
* The Javadoc of the contracts the routing engine relies on, which is not 
written down today: the callback of {{AsyncProcessor.process(exchange, 
callback)}} is called exactly once, {{process}} does not throw (it sets the 
exception and calls the callback), and the {{doneSync}} of the callback is the 
value {{process}} returns (except for a processor that hands its callback to 
the reactive executor, as the channel of each step does); and for 
{{Synchronization}}, that the commit of a consumer runs {{onComplete}} or 
{{onFailure}} once, where it is held at the end, and moves only by a handover.
* When at least one step listener is installed when a route is created, 
{{DefaultChannel}} adds one small wrapper after the {{InterceptStrategy}} loop, 
around what the loop returns. The error handler of the step calls it for each 
attempt (also each redelivery), and the channel calls it for a step without 
such an error handler. The strategies still get the processor of the step as 
their target, and the {{StepHook}} is asked before the wrapper, so a step the 
hook fails is not a call the listeners see.

With no listener installed the routes are built exactly as today: no wrapper, 
no check per step.

A listener that throws cannot change the routing: each call of a listener is 
caught and logged at WARN once per listener, the processor is called whatever 
{{onStepCall}} did, the real callback is called in a {{finally}}, and what the 
processor throws is thrown on unchanged.

Not in this issue: the on completion listener, the {{camel-sanitizer}} module 
and its rules, the JUnit extension and the dev console (later steps of 
CAMEL-26630). A JMH benchmark in camel-performance-tests will check, before the 
change is merged, that a step without a listener costs the same as before.

_Filed with Claude Code on behalf of allthingssecurity._



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to