private void ensureElectionIsCreated(Route route) { if (election == null) { electionLock.lock(); try { if (election == null) { // re-test election = new ZooKeeperElection(route.getRouteContext().getCamelContext(), uri, enabledCount); election.addElectionWatcher(this); } } finally { electionLock.unlock(); } } }
private void ensureElectionIsCreated(Route route) { if (election == null) { electionLock.lock(); try { if (election == null) { // re-test election = new CuratorLeaderElection(route.getRouteContext().getCamelContext(), uri); election.addElectionWatcher(this); } } finally { electionLock.unlock(); } } }
private String createName(String type) { CamelContext context = route.getRouteContext().getCamelContext(); String name = context.getManagementName() != null ? context.getManagementName() : context.getName(); String answer = namePattern; answer = answer.replaceFirst("##name##", name); answer = answer.replaceFirst("##routeId##", Matcher.quoteReplacement(route.getId())); answer = answer.replaceFirst("##type##", type); return answer; }
default Tags getTags(Route route, Exchange exchange) { return Tags.of( CAMEL_CONTEXT_TAG, route.getRouteContext().getCamelContext().getName(), SERVICE_NAME, MicrometerRoutePolicyService.class.getSimpleName(), ROUTE_ID_TAG, route.getId(), FAILED_TAG, Boolean.toString(exchange.isFailed()) ); }
private void startAllStoppedRoutes() { try { lock.lock(); if (!suspendedRoutes.isEmpty()) { if (log.isDebugEnabled()) { log.info("{} route(s) have been stopped previously by policy, restarting.", suspendedRoutes.size()); } for (Route suspended : suspendedRoutes) { DefaultCamelContext ctx = (DefaultCamelContext)suspended.getRouteContext().getCamelContext(); while (!ctx.isStarted()) { log.info("Context {} is not started yet. Sleeping for a bit.", ctx.getName()); Thread.sleep(5000); } log.info("Starting route [{}] defined in context [{}].", suspended.getId(), ctx.getName()); startRoute(suspended); } suspendedRoutes.clear(); } } catch (Exception e) { handleException(e); } finally { lock.unlock(); } }
@Override public synchronized void onInit(Route route) { super.onInit(route); LOGGER.info("Route managed by {}. Setting route {} AutoStartup flag to false.", getClass(), route.getId()); route.getRouteContext().getRoute().setAutoStartup("false"); stoppeddRoutes.add(route); this.refCount.retain(); startManagedRoutes(); }
/** * Allows to stop a route asynchronously using a separate background thread which can allow any current in-flight exchange * to complete while the route is being shutdown. * You may attempt to stop a route from processing an exchange which would be in-flight and therefore attempting to stop * the route will defer due there is an inflight exchange in-progress. By stopping the route independently using a separate * thread ensures the exchange can continue process and complete and the route can be stopped. */ // TODO: in Camel 2.19 there is a stopRouteAsync method we can use private void stopCurrentRouteAsync(final Route route) { String threadId = route.getRouteContext().getCamelContext().getExecutorServiceManager().resolveThreadName("StopRouteAsync"); Runnable task = () -> { try { route.getRouteContext().getCamelContext().stopRoute(route.getId()); } catch (Exception e) { handleException(e); } }; new Thread(task, threadId).start(); }
default Tags getTags(Route route, NamedNode node) { return Tags.of( CAMEL_CONTEXT_TAG, route.getRouteContext().getCamelContext().getName(), SERVICE_NAME, MicrometerMessageHistoryService.class.getSimpleName(), ROUTE_ID_TAG, route.getId(), NODE_ID_TAG, node.getId() ); }
@Override public void onInit(Route route) { ensureElectionIsCreated(); LOG.info("Route managed by {}. Setting route [{}] AutoStartup flag to false.", this.getClass(), route.getId()); route.getRouteContext().getRoute().setAutoStartup("false"); if (election.isMaster()) { if (shouldStopRoute) { startManagedRoute(route); } } else { if (shouldStopRoute) { stopManagedRoute(route); } } }
@Override public void onInit(Route route) { ensureElectionIsCreated(route); LOG.info("Route managed by {}. Setting route {} AutoStartup flag to false.", this.getClass(), route.getId()); route.getRouteContext().getRoute().setAutoStartup("false"); ensureElectionIsCreated(route); if (election.isMaster()) { if (shouldStopRoute) { startManagedRoute(route); } } else { if (shouldStopRoute) { stopManagedRoute(route); } } }
private void reportNonCustomRouteIDs(Route route) { CamelContext camelContext = route.getRouteContext().getCamelContext(); RouteDefinition routeDefinition = camelContext.getRouteDefinition(route.getId()); if (routeDefinition.getCustomId() == null || !routeDefinition.getCustomId()) { LOG.warn("Problem detected: Route " + StringUtils.quote(route.getId()) + " has no custom ID set! Endpoint URI is " + route.getEndpoint().getEndpointUri()); } }
public void scheduleRoute(Action action, Route route) throws Exception { JobDetail jobDetail = createJobDetail(action, route); Trigger trigger = createTrigger(action, route); updateScheduledRouteDetails(action, jobDetail, trigger, route); loadCallbackDataIntoSchedulerContext(jobDetail, action, route); boolean isClustered = route.getRouteContext().getCamelContext().getComponent("quartz2", QuartzComponent.class).isClustered(); if (isClustered) { // check to see if the same job has already been setup through another node of the cluster JobDetail existingJobDetail = getScheduler().getJobDetail(jobDetail.getKey()); if (jobDetail.equals(existingJobDetail)) { if (LOG.isInfoEnabled()) { LOG.info("Skipping to schedule the job: {} for action: {} on route {} as the job: {} already existing inside the cluster", new Object[] {jobDetail.getKey(), action, route.getId(), existingJobDetail.getKey()}); } // skip scheduling the same job again as one is already existing for the same routeId and action return; } } getScheduler().scheduleJob(jobDetail, trigger); if (LOG.isInfoEnabled()) { LOG.info("Scheduled trigger: {} for action: {} on route {}", trigger.getKey(), action, route.getId()); } }
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { LOG.debug("Running ScheduledJob: jobExecutionContext={}", jobExecutionContext); SchedulerContext schedulerContext = getSchedulerContext(jobExecutionContext); ScheduledJobState state = (ScheduledJobState) schedulerContext.get(jobExecutionContext.getJobDetail().getKey().toString()); Action storedAction = state.getAction(); Route storedRoute = state.getRoute(); List<RoutePolicy> policyList = storedRoute.getRouteContext().getRoutePolicyList(); for (RoutePolicy policy : policyList) { try { if (policy instanceof ScheduledRoutePolicy) { ((ScheduledRoutePolicy)policy).onJobExecute(storedAction, storedRoute); } } catch (Exception e) { throw new JobExecutionException("Failed to execute Scheduled Job for route " + storedRoute.getId() + " with trigger name: " + jobExecutionContext.getTrigger().getKey(), e); } } }
public void scheduleRoute(Action action, Route route) throws Exception { JobDetail jobDetail = createJobDetail(action, route); Trigger trigger = createTrigger(action, route); updateScheduledRouteDetails(action, jobDetail, trigger, route); loadCallbackDataIntoSchedulerContext(jobDetail, action, route); boolean isClustered = route.getRouteContext().getCamelContext().getComponent("quartz", QuartzComponent.class).isClustered(); if (isClustered) { // check to see if the same job has already been setup through another node of the cluster JobDetail existingJobDetail = getScheduler().getJobDetail(jobDetail.getName(), jobDetail.getGroup()); if (jobDetail.equals(existingJobDetail)) { if (LOG.isInfoEnabled()) { LOG.info("Skipping to schedule the job: {} for action: {} on route {} as the job: {} already existing inside the cluster", new Object[] {jobDetail.getFullName(), action, route.getId(), existingJobDetail.getFullName()}); } // skip scheduling the same job again as one is already existing for the same routeId and action return; } } getScheduler().scheduleJob(jobDetail, trigger); if (LOG.isInfoEnabled()) { LOG.info("Scheduled trigger: {} for action: {} on route {}", trigger.getFullName(), action, route.getId()); } }
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { SchedulerContext schedulerContext; try { schedulerContext = jobExecutionContext.getScheduler().getContext(); } catch (SchedulerException e) { throw new JobExecutionException("Failed to obtain scheduler context for job " + jobExecutionContext.getJobDetail().getName()); } ScheduledJobState state = (ScheduledJobState) schedulerContext.get(jobExecutionContext.getJobDetail().getName()); Action storedAction = state.getAction(); Route storedRoute = state.getRoute(); List<RoutePolicy> policyList = storedRoute.getRouteContext().getRoutePolicyList(); for (RoutePolicy policy : policyList) { try { if (policy instanceof ScheduledRoutePolicy) { ((ScheduledRoutePolicy)policy).onJobExecute(storedAction, storedRoute); } } catch (Exception e) { throw new JobExecutionException("Failed to execute Scheduled Job for route " + storedRoute.getId() + " with trigger name: " + jobExecutionContext.getTrigger().getFullName(), e); } } }
@Override public void onInit(Route route) { super.onInit(route); if (getMeterRegistry() == null) { setMeterRegistry(MicrometerUtils.getOrCreateMeterRegistry( route.getRouteContext().getCamelContext().getRegistry(), METRICS_REGISTRY_NAME)); } try { MicrometerRoutePolicyService registryService = route.getRouteContext().getCamelContext().hasService(MicrometerRoutePolicyService.class); if (registryService == null) { registryService = new MicrometerRoutePolicyService(); registryService.setMeterRegistry(getMeterRegistry()); registryService.setPrettyPrint(isPrettyPrint()); registryService.setDurationUnit(getDurationUnit()); registryService.setMatchingTags(Tags.of(SERVICE_NAME, MicrometerRoutePolicyService.class.getSimpleName())); route.getRouteContext().getCamelContext().addService(registryService); ServiceHelper.startService(registryService); } } catch (Exception e) { throw ObjectHelper.wrapRuntimeCamelException(e); } // create statistics holder // for now we record only all the timings of a complete exchange (responses) // we have in-flight / total statistics already from camel-core statistics = new MetricsStatistics(getMeterRegistry(), route, getNamingStrategy()); }
public JAXBContext getJaxbContext() { if ( this.jaxbContext == null ) { JaxbDataFormat def = new JaxbDataFormat(); def.setPrettyPrint( true ); def.setContextPath( "org.drools.model:org.drools.pipeline.camel" ); // create a jaxbContext for the test to use outside of Camel. StatefulKnowledgeSession ksession1 = (StatefulKnowledgeSession) node.get( "ksession1", CommandExecutor.class ); KnowledgeBase kbase = ksession1.getKieBase(); ClassLoader originalCl = Thread.currentThread().getContextClassLoader(); try { Thread.currentThread().setContextClassLoader( ((ReteooRuleBase) ((KnowledgeBaseImpl) kbase).getRuleBase()).getRootClassLoader() ); def = DroolsPolicy.augmentJaxbDataFormatDefinition( def ); org.apache.camel.converter.jaxb.JaxbDataFormat jaxbDataformat = (org.apache.camel.converter.jaxb.JaxbDataFormat) def.getDataFormat( this.context.getRoutes().get( 0 ).getRouteContext() ); jaxbDataformat.setCamelContext(routeBuilder.getContext()); try { jaxbDataformat.start(); } catch (Exception e) { throw new IllegalStateException(e); } jaxbContext = jaxbDataformat.getContext(); } finally { Thread.currentThread().setContextClassLoader( originalCl ); } } return jaxbContext; }
public JAXBContext getJaxbContext() { if ( this.jaxbContext == null ) { JaxbDataFormat def = new JaxbDataFormat(); def.setPrettyPrint( true ); // TODO does not work: def.setContextPath( "org.drools.camel.testdomain:org.drools.pipeline.camel" ); def.setContextPath( "org.drools.pipeline.camel" ); // create a jaxbContext for the test to use outside of Camel. StatefulKnowledgeSession ksession1 = (StatefulKnowledgeSession) node.get( "ksession1", CommandExecutor.class ); KnowledgeBase kbase = ksession1.getKieBase(); ClassLoader originalCl = Thread.currentThread().getContextClassLoader(); try { Thread.currentThread().setContextClassLoader( ((ReteooRuleBase) ((KnowledgeBaseImpl) kbase).getRuleBase()).getRootClassLoader() ); def = DroolsPolicy.augmentJaxbDataFormatDefinition( def ); org.apache.camel.converter.jaxb.JaxbDataFormat jaxbDataformat = (org.apache.camel.converter.jaxb.JaxbDataFormat) def.getDataFormat( this.context.getRoutes().get( 0 ).getRouteContext() ); jaxbDataformat.setCamelContext(routeBuilder.getContext()); try { jaxbDataformat.start(); } catch (Exception e) { throw new IllegalStateException(e); } jaxbContext = jaxbDataformat.getContext(); } finally { Thread.currentThread().setContextClassLoader( originalCl ); } } return jaxbContext; }
protected void doOnInit(Route route) throws Exception { QuartzComponent quartz = route.getRouteContext().getCamelContext().getComponent("quartz", QuartzComponent.class); setScheduler(quartz.getScheduler()); // Important: do not start scheduler as QuartzComponent does that automatic // when CamelContext has been fully initialized and started if (getRouteStopGracePeriod() == 0) { setRouteStopGracePeriod(10000); } if (getTimeUnit() == null) { setTimeUnit(TimeUnit.MILLISECONDS); } // validate time options has been configured if ((getRouteStartTime() == null) && (getRouteStopTime() == null) && (getRouteSuspendTime() == null) && (getRouteResumeTime() == null)) { throw new IllegalArgumentException("Scheduled Route Policy for route " + route.getId() + " has no start/stop/suspend/resume times specified"); } registerRouteToScheduledRouteDetails(route); if (getRouteStartTime() != null) { scheduleRoute(Action.START, route); } if (getRouteStopTime() != null) { scheduleRoute(Action.STOP, route); } if (getRouteSuspendTime() != null) { scheduleRoute(Action.SUSPEND, route); } if (getRouteResumeTime() != null) { scheduleRoute(Action.RESUME, route); } }
protected void doOnInit(Route route) throws Exception { QuartzComponent quartz = route.getRouteContext().getCamelContext().getComponent("quartz", QuartzComponent.class); setScheduler(quartz.getScheduler()); // Important: do not start scheduler as QuartzComponent does that automatic // when CamelContext has been fully initialized and started if (getRouteStopGracePeriod() == 0) { setRouteStopGracePeriod(10000); } if (getTimeUnit() == null) { setTimeUnit(TimeUnit.MILLISECONDS); } // validate time options has been configured if ((getRouteStartDate() == null) && (getRouteStopDate() == null) && (getRouteSuspendDate() == null) && (getRouteResumeDate() == null)) { throw new IllegalArgumentException("Scheduled Route Policy for route " + route.getId() + " has no start/stop/suspend/resume times specified"); } registerRouteToScheduledRouteDetails(route); if (getRouteStartDate() != null) { scheduleRoute(Action.START, route); } if (getRouteStopDate() != null) { scheduleRoute(Action.STOP, route); } if (getRouteSuspendDate() != null) { scheduleRoute(Action.SUSPEND, route); } if (getRouteResumeDate() != null) { scheduleRoute(Action.RESUME, route); } }