001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.camel.reifier;
018
019import java.util.concurrent.ScheduledExecutorService;
020
021import org.apache.camel.Expression;
022import org.apache.camel.Processor;
023import org.apache.camel.model.ProcessorDefinition;
024import org.apache.camel.model.ThrottleDefinition;
025import org.apache.camel.processor.Throttler;
026import org.apache.camel.spi.RouteContext;
027
028public class ThrottleReifier extends ExpressionReifier<ThrottleDefinition> {
029
030    public ThrottleReifier(RouteContext routeContext, ProcessorDefinition<?> definition) {
031        super(routeContext, (ThrottleDefinition) definition);
032    }
033
034    @Override
035    public Processor createProcessor() throws Exception {
036        boolean async = parseBoolean(definition.getAsyncDelayed(), false);
037        boolean shutdownThreadPool = willCreateNewThreadPool(definition, true);
038        ScheduledExecutorService threadPool = getConfiguredScheduledExecutorService("Throttle", definition, true);
039
040        // should be default 1000 millis
041        long period = definition.getTimePeriodMillis() != null ? parseLong(definition.getTimePeriodMillis()) : 1000L;
042
043        // max requests per period is mandatory
044        Expression maxRequestsExpression = createMaxRequestsPerPeriodExpression();
045        if (maxRequestsExpression == null) {
046            throw new IllegalArgumentException("MaxRequestsPerPeriod expression must be provided on " + this);
047        }
048
049        Expression correlation = null;
050        if (definition.getCorrelationExpression() != null) {
051            correlation = createExpression(definition.getCorrelationExpression());
052        }
053
054        boolean reject = parseBoolean(definition.getRejectExecution(), false);
055        Throttler answer = new Throttler(camelContext, maxRequestsExpression, period, threadPool, shutdownThreadPool, reject, correlation);
056
057        answer.setAsyncDelayed(async);
058        // should be true by default
059        answer.setCallerRunsWhenRejected(parseBoolean(definition.getCallerRunsWhenRejected(), true));
060
061        return answer;
062    }
063
064    private Expression createMaxRequestsPerPeriodExpression() {
065        return definition.getExpression() != null ? createExpression(definition.getExpression()) : null;
066    }
067
068}