package camelinaction;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.apache.camel.api.management.mbean.ManagedRouteMBean;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.junit.Test;
public class OldestTest extends CamelTestSupport {
private int size = 20;
private ScheduledExecutorService scheduler;
@Override
protected boolean useJmx() {
return true;
}
@Test
public void testOldestReporter() throws Exception {
getMockEndpoint("mock:done").expectedMessageCount(size);
ManagedRouteMBean route = context.getManagedRoute("myRoute", ManagedRouteMBean.class);
OldestDurationReporter reporter = new OldestDurationReporter(route);
// schedule a background task that logs the current throttle count
scheduler = context.getExecutorServiceManager().newSingleThreadScheduledExecutor(this, "OldestReporter");
scheduler.scheduleAtFixedRate(reporter, 1, 1, TimeUnit.SECONDS);
// send some orders
for (int i = 0; i < size; i++) {
template.sendBody("seda:foo", "Message " + i);
}
assertMockEndpointsSatisfied(1, TimeUnit.MINUTES);
// just a little delay before running
Thread.sleep(5000);
resetMocks();
getMockEndpoint("mock:done").expectedMessageCount(size);
log.info("Running again a 2nd time");
// send some orders
for (int i = 0; i < size; i++) {
template.sendBody("seda:foo", "2nd-Message " + i);
}
assertMockEndpointsSatisfied(1, TimeUnit.MINUTES);
// shutdown thread pool
context.getExecutorServiceManager().shutdown(scheduler);
}
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
from("seda:foo").id("myRoute")
.log("Incoming ${body}")
// do some random delay so the oldest is different value
.delay(simple("${random(0,5000)}")).asyncDelayed()
.log("Done ${body}")
.to("mock:done");
}
};
}
}