/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.camel.component.routebox; import java.net.URI; import java.util.HashMap; import java.util.Map; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import org.apache.camel.CamelContext; import org.apache.camel.Endpoint; import org.apache.camel.Exchange; import org.apache.camel.component.routebox.direct.RouteboxDirectEndpoint; import org.apache.camel.component.routebox.seda.RouteboxSedaEndpoint; import org.apache.camel.impl.UriEndpointComponent; public class RouteboxComponent extends UriEndpointComponent { final RouteboxConfiguration config; private final Map<String, BlockingQueue<Exchange>> queues = new HashMap<String, BlockingQueue<Exchange>>(); public RouteboxComponent() { super(RouteboxEndpoint.class); config = new RouteboxConfiguration(); } public RouteboxComponent(CamelContext context) { super(context, RouteboxEndpoint.class); config = new RouteboxConfiguration(); } @Override protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception { RouteboxEndpoint blackboxRouteEndpoint = null; config.parseURI(new URI(uri), parameters, this); if (config.getInnerProtocol().equalsIgnoreCase("direct")) { blackboxRouteEndpoint = new RouteboxDirectEndpoint(uri, this, config); setProperties(blackboxRouteEndpoint.getConfig(), parameters); } else { String baseUri = getQueueKey(uri); blackboxRouteEndpoint = new RouteboxSedaEndpoint(uri, this, config, createQueue(baseUri, parameters)); setProperties(blackboxRouteEndpoint.getConfig(), parameters); } return blackboxRouteEndpoint; } public synchronized BlockingQueue<Exchange> createQueue(String uri, Map<String, Object> parameters) { if (queues.containsKey(uri)) { return queues.get(uri); } // create queue BlockingQueue<Exchange> queue; Integer size = config.getQueueSize(); if (size != null && size > 0) { queue = new LinkedBlockingQueue<Exchange>(size); } else { queue = new LinkedBlockingQueue<Exchange>(); } queues.put(uri, queue); return queue; } protected String getQueueKey(String uri) { if (uri.contains("?")) { // strip parameters uri = uri.substring(0, uri.indexOf('?')); } return uri; } @Override protected void doStop() throws Exception { queues.clear(); super.doStop(); } }