public void commit() {
    // now lets turn all of the event driven consumer processors into a single route
    if (!eventDrivenProcessors.isEmpty()) {
      Processor target = Pipeline.newInstance(getCamelContext(), eventDrivenProcessors);

      String routeId = route.idOrCreate(getCamelContext().getNodeIdFactory());

      // and wrap it in a unit of work so the UoW is on the top, so the entire route will be in the
      // same UoW
      CamelInternalProcessor internal = new CamelInternalProcessor(target);
      internal.addAdvice(new CamelInternalProcessor.UnitOfWorkProcessorAdvice(routeId));

      // and then in route context so we can keep track which route this is at runtime
      internal.addAdvice(new CamelInternalProcessor.RouteContextAdvice(this));

      // and then optionally add route policy processor if a custom policy is set
      List<RoutePolicy> routePolicyList = getRoutePolicyList();
      if (routePolicyList != null && !routePolicyList.isEmpty()) {
        for (RoutePolicy policy : routePolicyList) {
          // add policy as service if we have not already done that (eg possible if two routes have
          // the same service)
          // this ensures Camel can control the lifecycle of the policy
          if (!camelContext.hasService(policy)) {
            try {
              camelContext.addService(policy);
            } catch (Exception e) {
              throw ObjectHelper.wrapRuntimeCamelException(e);
            }
          }
        }

        internal.addAdvice(new CamelInternalProcessor.RoutePolicyAdvice(routePolicyList));
      }

      // wrap in route inflight processor to track number of inflight exchanges for the route
      internal.addAdvice(
          new CamelInternalProcessor.RouteInflightRepositoryAdvice(
              camelContext.getInflightRepository(), routeId));

      // wrap in JMX instrumentation processor that is used for performance stats
      internal.addAdvice(new CamelInternalProcessor.InstrumentationAdvice("route"));

      // wrap in route lifecycle
      internal.addAdvice(new CamelInternalProcessor.RouteLifecycleAdvice());

      // and create the route that wraps the UoW
      Route edcr = new EventDrivenConsumerRoute(this, getEndpoint(), internal);
      edcr.getProperties().put(Route.ID_PROPERTY, routeId);
      edcr.getProperties().put(Route.PARENT_PROPERTY, Integer.toHexString(route.hashCode()));
      edcr.getProperties().put(Route.DESCRIPTION_PROPERTY, route.getDescriptionText());
      if (route.getGroup() != null) {
        edcr.getProperties().put(Route.GROUP_PROPERTY, route.getGroup());
      }
      String rest = "false";
      if (route.isRest() != null && route.isRest()) {
        rest = "true";
      }
      edcr.getProperties().put(Route.REST_PROPERTY, rest);

      // after the route is created then set the route on the policy processor so we get hold of it
      CamelInternalProcessor.RoutePolicyAdvice task =
          internal.getAdvice(CamelInternalProcessor.RoutePolicyAdvice.class);
      if (task != null) {
        task.setRoute(edcr);
      }
      CamelInternalProcessor.RouteLifecycleAdvice task2 =
          internal.getAdvice(CamelInternalProcessor.RouteLifecycleAdvice.class);
      if (task2 != null) {
        task2.setRoute(edcr);
      }

      // invoke init on route policy
      if (routePolicyList != null && !routePolicyList.isEmpty()) {
        for (RoutePolicy policy : routePolicyList) {
          policy.onInit(edcr);
        }
      }

      routes.add(edcr);
    }
  }