Claus Ibsen created CAMEL-25237:
-----------------------------------

             Summary: camel-core - Switch EIP should count the messages per case
                 Key: CAMEL-25237
                 URL: https://issues.apache.org/jira/browse/CAMEL-25237
             Project: Camel
          Issue Type: Improvement
          Components: camel-core
            Reporter: Claus Ibsen
             Fix For: 4.23.0


The Switch EIP (CAMEL-24988) is a decision table: a selector, then {{value -> 
uri}} cases and an otherwise. At runtime only the switch itself and its 
otherwise are managed processors with statistics. The cases have none, so there 
is no way to see how many messages each case received.

*Reproduce*

{code:yaml}
- route:
    id: specialist-dispatch
    from:
      uri: direct:dispatch
      steps:
        - switch:
            selector:
              exchangeProperty:
                expression: specialist
            case:
              - value: reservation
                uri: "a2a:{{agents.reservation.url}}"
              - value: weather
                uri: "a2a:{{agents.weather.url}}"
            otherwise:
              uri: direct:unsupported-specialist
{code}

Send some messages, then run {{camel get processor}}: it lists {{switch1}} (109 
messages) and {{switch1-otherwise}} (22), but no {{case1}}, {{case2}}, ... The 
route structure dump ({{camel cmd route-structure --json}}) has statistics for 
{{switch1}} and {{switch1-otherwise}}, and none for the {{case}} nodes. So the 
87 messages that went to the cases cannot be told apart.

*Where*

{{JmxManagementLifecycleStrategy.registerPerformanceCounters}} already prepares 
the case sends ({{SwitchCaseDefinition.prepareToDefinition()}}) and registers 
counters for them, as it does for the otherwise. Yet no managed processor ends 
up registered for a case. A likely cause is the ids:
* The otherwise send takes its id from the switch ({{switch1-otherwise}}), 
which already has one when management runs.
* A case gets its id later, in {{SwitchReifier}} ({{c.idOrCreate(ids)}}), after 
management has prepared its send without one.

This needs to be confirmed.

*Expected*

Each case send is a managed processor with the case's id ({{case1}}, ... or a 
custom id), like the otherwise. Then:
* {{camel get processor}} lists every case;
* the route structure has statistics for each case node;
* the JMX MBeans and the dev consoles count each case;
* the counts of the cases and the otherwise add up to the switch's total.

The route diagram in camel-jbang draws a Switch as a decision table with a 
count per row and shows it as soon as the cases have statistics 
(apache/camel#27228).

_Claude Code on behalf of davsclaus_



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to