/* * Copyright LGPL3 * YES Technology Association * http://yestech.org * * http://www.opensource.org/licenses/lgpl-3.0.html */ package org.yestech.lib.camel; import org.apache.camel.Endpoint; import org.apache.camel.impl.DefaultComponent; import org.apache.commons.lang.StringUtils; import org.terracotta.message.pipe.BlockingQueueBasedPipe; import org.terracotta.message.pipe.Pipe; import org.terracotta.message.topology.DefaultTopology; import org.terracotta.message.topology.Topology; import org.terracotta.message.topology.TopologyManager; import java.util.Map; /** * An implementation of a camel component for asynchronous PIPE exchanges on a * {@link org.terracotta.message.pipe.Pipe} within a CamelContext * <br/> * Options: * <ul> * <li>size - size of the pipe to create if it doesnt exist (Optional)</li> * <li>topologyName - name of the Pipe topology (Required) must match producer</li> * <li>pipeName - name of the Pipe to create or use (Optional) must match producer if supplied, if not supplied topologyName is used</li> * <li>concurrentConsumers - number of concurrentConsumers to listen to pipe (Optional) default = 1</li> * </ul> * * A component based on camel SEDA component. */ @SuppressWarnings("unchecked") public class TerracottaComponent extends DefaultComponent { public Pipe<Object> createPipe(String uri, Map parameters) { int pipeSize = (Integer)getAndRemoveParameter(parameters, "size", Integer.class, 1000); String topologyName = (String)getAndRemoveParameter(parameters, "topologyName", String.class); String pipeName = (String)getAndRemoveParameter(parameters, "pipeName", String.class); Pipe<Object> pipe; Pipe.Factory pipeFactory = new BlockingQueueBasedPipe.Factory(pipeSize); Topology.Factory topologyFactory = new DefaultTopology.Factory(pipeFactory); Topology topology = TopologyManager.getInstance().<String, String>getOrCreateTopology(topologyName, topologyFactory); // if (router == null) { // router = new LoadBalancingRouter(); // } if (StringUtils.isNotBlank(pipeName)) { pipe = topology.getOrCreatePipeFor(pipeName); } else { pipe = topology.getOrCreatePipeFor(topologyName); } return pipe; } @Override protected Endpoint createEndpoint(String uri, String remaining, Map parameters) throws Exception { int consumers = (Integer)getAndRemoveParameter(parameters, "concurrentConsumers", Integer.class, 1); return new TerracottaEndpoint(uri, this, createPipe(uri, parameters), consumers); } }