This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
commit a983a071f38998d84fb5aee3db320bdffbc62a97 Author: Claus Ibsen <[email protected]> AuthorDate: Wed Jul 16 10:28:06 2025 +0200 CAMEL-22245: camel-core - EventNotifier should allow Ordered --- .../impl/engine/DefaultManagementStrategy.java | 5 + .../management/AddEventNotifierOrderedTest.java | 116 +++++++++++++++++++++ 2 files changed, 121 insertions(+) diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultManagementStrategy.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultManagementStrategy.java index 5f72c434860..43f10d4a617 100644 --- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultManagementStrategy.java +++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultManagementStrategy.java @@ -30,6 +30,7 @@ import org.apache.camel.spi.ManagementAgent; import org.apache.camel.spi.ManagementObjectNameStrategy; import org.apache.camel.spi.ManagementObjectStrategy; import org.apache.camel.spi.ManagementStrategy; +import org.apache.camel.support.OrderedComparator; import org.apache.camel.support.service.ServiceHelper; import org.apache.camel.support.service.ServiceSupport; import org.apache.camel.util.ObjectHelper; @@ -81,9 +82,13 @@ public class DefaultManagementStrategy extends ServiceSupport implements Managem @Override public void addEventNotifier(EventNotifier eventNotifier) { this.eventNotifiers.add(eventNotifier); + // resort after adding + this.eventNotifiers.sort(OrderedComparator.get()); if (isStarted()) { // already started this.startedEventNotifiers.add(eventNotifier); + // resort after adding + this.startedEventNotifiers.sort(OrderedComparator.get()); } if (getCamelContext() != null) { // inject camel context if needed diff --git a/core/camel-management/src/test/java/org/apache/camel/management/AddEventNotifierOrderedTest.java b/core/camel-management/src/test/java/org/apache/camel/management/AddEventNotifierOrderedTest.java new file mode 100644 index 00000000000..89104b1fd90 --- /dev/null +++ b/core/camel-management/src/test/java/org/apache/camel/management/AddEventNotifierOrderedTest.java @@ -0,0 +1,116 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.management; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.camel.CamelContext; +import org.apache.camel.ContextTestSupport; +import org.apache.camel.Ordered; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.impl.DefaultCamelContext; +import org.apache.camel.spi.CamelEvent; +import org.apache.camel.support.EventNotifierSupport; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.DisabledOnOs; +import org.junit.jupiter.api.condition.OS; + +@DisabledOnOs(OS.AIX) +public class AddEventNotifierOrderedTest extends ContextTestSupport { + + private static final List<String> events = new ArrayList<>(); + + @Override + @BeforeEach + public void setUp() throws Exception { + events.clear(); + super.setUp(); + } + + @Override + protected CamelContext createCamelContext() throws Exception { + DefaultCamelContext context = new DefaultCamelContext(createCamelRegistry()); + + context.getManagementStrategy().addEventNotifier(new MyNotifier("notifier1", -100)); + context.getManagementStrategy().addEventNotifier(new MyNotifier("notifier2", -200)); + + return context; + } + + @Test + public void testAdd() throws Exception { + getMockEndpoint("mock:result").expectedMessageCount(1); + template.sendBody("direct:start", "Hello World"); + assertMockEndpointsSatisfied(); + + Assertions.assertEquals(2, events.size()); + Assertions.assertEquals("notifier2", events.get(0)); + Assertions.assertEquals("notifier1", events.get(1)); + + // add new notifier after started + resetMocks(); + events.clear(); + + context.getManagementStrategy().addEventNotifier(new MyNotifier("notifier3", -300)); + + getMockEndpoint("mock:result").expectedMessageCount(1); + template.sendBody("direct:start", "Hello World"); + assertMockEndpointsSatisfied(); + + Assertions.assertEquals(3, events.size()); + Assertions.assertEquals("notifier3", events.get(0)); + Assertions.assertEquals("notifier2", events.get(1)); + Assertions.assertEquals("notifier1", events.get(2)); + } + + @Override + protected RouteBuilder createRouteBuilder() { + return new RouteBuilder() { + @Override + public void configure() { + from("direct:start").to("mock:result"); + } + }; + } + + private static class MyNotifier extends EventNotifierSupport implements Ordered { + + private final String name; + private final int order; + + private MyNotifier(String name, int order) { + this.name = name; + this.order = order; + } + + @Override + public int getOrder() { + return order; + } + + @Override + public void notify(CamelEvent event) throws Exception { + if (event instanceof CamelEvent.ExchangeCompletedEvent) { + events.add(name); + } + } + } + +}
