Hi Yeah this is currently not supported, you are welcome to log a JIRA ticket
On Tue, Feb 12, 2019 at 10:58 PM Garner, Kevin <[email protected]> wrote: > > We're using EventNotifier and ExchangeSentEvent to log timing of certain > direct:// routes and we've run into a problem when using @Produce instead of > ProducerTemplate. > > When sending exchange to producer template, ExchangeSentEvent is fired after > exchange is sent. Same when it's part of a larger route. Not so much with > @Produce. > > Any guidance on how to use @Produce but still trigger the events? > > I've got a unit test below - notifyProxy fails, but the other cases pass. > Camel 2.23.0 > > Thanks, > Kevin > > > > > > > > import static org.hamcrest.CoreMatchers.equalTo; > import static org.hamcrest.CoreMatchers.notNullValue; > import static org.junit.Assert.assertThat; > import static org.junit.Assert.assertTrue; > > import java.util.EventObject; > > import org.apache.camel.Body; > import org.apache.camel.CamelContext; > import org.apache.camel.Exchange; > import org.apache.camel.Produce; > import org.apache.camel.ProducerTemplate; > import org.apache.camel.builder.RouteBuilder; > import org.apache.camel.impl.DefaultExchange; > import org.apache.camel.management.event.ExchangeSentEvent; > import org.apache.camel.spring.javaconfig.CamelConfiguration; > import org.apache.camel.support.EventNotifierSupport; > import org.apache.camel.test.spring.CamelSpringRunner; > import org.apache.camel.util.EndpointHelper; > import org.apache.camel.util.ServiceHelper; > import org.junit.Before; > import org.junit.Test; > import org.junit.runner.RunWith; > import org.springframework.beans.factory.annotation.Autowired; > import org.springframework.context.annotation.Bean; > import org.springframework.context.annotation.Configuration; > import org.springframework.test.context.ContextConfiguration; > > @RunWith(CamelSpringRunner.class) > @ContextConfiguration(classes = { CamelConfiguration.class, > DirectTest.TestConfig.class }) > public class DirectTest { > private static final String NAME = "Doug"; > private static final String EXPECTED = "Hello, 'Doug'"; > > @Produce(uri = HelloApi.ROUTE) > private HelloApi helloApi; > > @Produce(uri = HelloApi.ROUTE) > private ProducerTemplate helloApiTemplate; > > @Produce(uri = HelloApi.WRAPPED_ROUTE) > private HelloApi helloApiWrapped; > > @Autowired > private CamelContext camelContext; > private HelloSentEventNotifier eventNotifier; > > @Before > public void setup() throws Exception { > assertThat(helloApi, notNullValue()); > assertThat(helloApiTemplate, notNullValue()); > > eventNotifier = new HelloSentEventNotifier(camelContext); > } > > @Test > public void notifyTemplate() { > eventNotifier.reset(); > Exchange e = new DefaultExchange(camelContext); > e.getIn().setBody(NAME); > e = helloApiTemplate.send(e); > String output = e.getOut().getBody(String.class); > assertThat(output, equalTo(EXPECTED)); > assertTrue("ExchangeSentEvent not received", > eventNotifier.notified()); > } > > @Test > public void notifyProxy() { > eventNotifier.reset(); > String output = helloApi.sayHello(NAME); > assertThat(output, equalTo(EXPECTED)); > assertTrue("ExchangeSentEvent not received", > eventNotifier.notified()); > } > > @Test > public void notifyWrappedProxy() { > eventNotifier.reset(); > String output = helloApiWrapped.sayHello(NAME); > assertThat(output, equalTo(EXPECTED)); > assertTrue("ExchangeSentEvent not received", > eventNotifier.notified()); > } > > @Configuration > public static class TestConfig { > @Bean > public RouteBuilder builder() { > return new RouteBuilder() { > @Override > public void configure() throws Exception { > from(HelloApi.ROUTE).process(e -> { > String name = > e.getIn().getBody(String.class); > String output = > String.format("Hello, '%s'", name); > e.getOut().setBody(output); > }); > > > from(HelloApi.WRAPPED_ROUTE).to(HelloApi.ROUTE); > } > }; > } > } > > public static interface HelloApi { > public static final String ROUTE = "direct://hello"; > public static final String WRAPPED_ROUTE = ROUTE + "/wrapper"; > > public String sayHello(@Body String name); > } > > public static class HelloSentEventNotifier extends > EventNotifierSupport { > private boolean notified = false; > private CamelContext camelContext; > > public HelloSentEventNotifier(CamelContext camelContext) { > this.camelContext = camelContext; > try { > ServiceHelper.startService(this); > > camelContext.getManagementStrategy().addEventNotifier(this); > } catch (Exception e) { > throw new RuntimeException(e); > } > } > > @Override > public void notify(EventObject event) throws Exception { > if (event instanceof ExchangeSentEvent) { > ExchangeSentEvent sentEvent = > (ExchangeSentEvent)event; > if (EndpointHelper.matchEndpoint(camelContext, > sentEvent.getEndpoint().getEndpointUri(), HelloApi.ROUTE)) { > notified = true; > } > } > } > > @Override > public boolean isEnabled(EventObject event) { > return true; > } > > public void reset() { > notified = false; > } > > public boolean notified() { > return notified; > } > } > } -- Claus Ibsen ----------------- http://davsclaus.com @davsclaus Camel in Action 2: https://www.manning.com/ibsen2
