// check for clash by startupOrder id
DefaultRouteStartupOrder other = inputs.get(startupOrder);
if (other != null) {
String otherId = other.getRoute().getId();
throw new FailedToStartRouteException(holder.getRoute().getId(), "startupOrder clash. Route " + otherId + " already has startupOrder "
+ startupOrder + " configured which this route have as well. Please correct startupOrder to be unique among all your routes.");
} else {
// no clash then add the holder to the existing inputs of routes to be started
inputs.put(startupOrder, holder);
}
} catch (FailedToStartRouteException e) {
throw e;
} catch (Exception e) {
throw new FailedToStartRouteException(e);
}
} else {
// should not start on startup
LOG.info("Cannot start route " + routeService.getId() + " as it is configured with auto startup disabled.");
}
}
// now prepare the routes by starting its services before we start the input
for (Map.Entry<Integer, DefaultRouteStartupOrder> entry : inputs.entrySet()) {
// defer starting inputs till later as we want to prepare the routes by starting
// all their processors and child services etc.
// then later we open the floods to Camel by starting the inputs
// what this does is to ensure Camel is more robust on starting routes as all routes
// will then be prepared in time before we start inputs which will consume messages to be routed
RouteService routeService = entry.getValue().getRouteService();
routeService.startInputs(false);
try {
routeService.start();
} finally {
routeService.startInputs(true);
}
}
// check for clash with multiple consumers of the same endpoints which is not allowed
List<Endpoint> routeInputs = new ArrayList<Endpoint>();
for (Map.Entry<Integer, DefaultRouteStartupOrder> entry : inputs.entrySet()) {
Integer order = entry.getKey();
Route route = entry.getValue().getRoute();
RouteService routeService = entry.getValue().getRouteService();
for (Consumer consumer : routeService.getInputs().values()) {
Endpoint endpoint = consumer.getEndpoint();
// is multiple consumers supported
boolean multipleConsumersSupported = false;
if (endpoint instanceof MultipleConsumersSupport) {
multipleConsumersSupported = ((MultipleConsumersSupport) endpoint).isMultipleConsumersSupported();
}
if (!multipleConsumersSupported && routeInputs.contains(endpoint)) {
throw new FailedToStartRouteException(routeService.getId(),
"Multiple consumers for the same endpoint is not allowed: " + endpoint);
} else {
// start the consumer on the route
if (LOG.isDebugEnabled()) {
LOG.debug("Starting consumer (order: " + order + ") on route: " + route.getId());