/* * 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.*; import org.apache.camel.impl.DefaultExchange; import org.apache.camel.impl.DefaultMessage; import org.apache.camel.impl.ServiceSupport; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.terracotta.message.pipe.Pipe; import java.util.concurrent.ExecutorService; import org.apache.camel.util.concurrent.ExecutorServiceHelper; /** * * A {@link org.apache.camel.Consumer} which uses a Terracotta {@link Pipe} to pass the {@link org.apache.camel.Exchange}. */ public class TerracottaConsumer extends ServiceSupport implements Consumer, Runnable { final private static Logger logger = LoggerFactory.getLogger(TerracottaConsumer.class); private TerracottaEndpoint endpoint; private Processor processor; private ExecutorService executor; public TerracottaConsumer(TerracottaEndpoint endpoint, Processor processor) { this.endpoint = endpoint; this.processor = processor; } @Override public String toString() { return "TerracottaConsumer: " + endpoint.getEndpointUri(); } public void run() { Pipe<Object> queue = endpoint.getPipe(); while (queue != null && isRunAllowed()) { final Exchange exchange = new DefaultExchange(endpoint.getCamelContext()); try { final Object pipeMessage = queue.take(); DefaultMessage message = new DefaultMessage(); message.setBody(pipeMessage); exchange.setIn(message); } catch (InterruptedException e) { logger.debug("Wait interrupted, are we stopping? " + (isStopping() || isStopped())); continue; } if (exchange != null) { if (isRunAllowed()) { try { processor.process(exchange); } catch (Exception e) { logger.error("TerracottaConsumer pipe caught: " + e, e); } } else { logger.warn("This consumer is stopped during polling an exchange, so putting it back on the TerracottaConsumer pipe: " + exchange); try { queue.put(exchange); } catch (InterruptedException e) { logger.debug("Sleep interrupted, are we stopping? " + (isStopping() || isStopped())); } } } } } protected void doStart() throws Exception { int poolSize = endpoint.getConcurrentConsumers(); executor = ExecutorServiceHelper.newFixedThreadPool(poolSize, endpoint.getEndpointUri(), true); for (int i = 0; i < poolSize; i++) { executor.execute(this); } endpoint.onStarted(this); } protected void doStop() throws Exception { endpoint.onStopped(this); executor.shutdownNow(); executor = null; } }