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.component.direct; 018 019import java.util.HashMap; 020import java.util.Map; 021 022import org.apache.camel.Endpoint; 023import org.apache.camel.impl.UriEndpointComponent; 024import org.apache.camel.spi.Metadata; 025import org.apache.camel.util.ServiceHelper; 026 027/** 028 * The <a href="http://camel.apache.org/direct.html">Direct Component</a> manages {@link DirectEndpoint} and holds the list of named direct endpoints. 029 * 030 * @version 031 */ 032public class DirectComponent extends UriEndpointComponent { 033 034 // must keep a map of consumers on the component to ensure endpoints can lookup old consumers 035 // later in case the DirectEndpoint was re-created due the old was evicted from the endpoints LRUCache 036 // on DefaultCamelContext 037 private final Map<String, DirectConsumer> consumers = new HashMap<String, DirectConsumer>(); 038 @Metadata(label = "producer") 039 private boolean block; 040 @Metadata(label = "producer", defaultValue = "30000") 041 private long timeout = 30000L; 042 043 public DirectComponent() { 044 super(DirectEndpoint.class); 045 } 046 047 protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception { 048 DirectEndpoint endpoint = new DirectEndpoint(uri, this, consumers); 049 endpoint.setBlock(block); 050 endpoint.setTimeout(timeout); 051 setProperties(endpoint, parameters); 052 return endpoint; 053 } 054 055 @Override 056 protected void doStop() throws Exception { 057 ServiceHelper.stopServices(consumers); 058 consumers.clear(); 059 super.doStop(); 060 } 061 062 public boolean isBlock() { 063 return block; 064 } 065 066 /** 067 * If sending a message to a direct endpoint which has no active consumer, 068 * then we can tell the producer to block and wait for the consumer to become active. 069 */ 070 public void setBlock(boolean block) { 071 this.block = block; 072 } 073 074 public long getTimeout() { 075 return timeout; 076 } 077 078 /** 079 * The timeout value to use if block is enabled. 080 */ 081 public void setTimeout(long timeout) { 082 this.timeout = timeout; 083 } 084}