/** * */ package org.jentrata.spa.jms.module; import java.util.Properties; import hk.hku.cecid.piazza.commons.Sys; import hk.hku.cecid.piazza.commons.message.MessageHandler; import hk.hku.cecid.piazza.commons.module.Component; import javax.jms.ConnectionFactory; import org.apache.activemq.ActiveMQConnectionFactory; import org.apache.camel.CamelContext; import org.apache.camel.ConsumerTemplate; import org.apache.camel.Exchange; import org.apache.camel.Processor; import org.apache.camel.ProducerTemplate; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.jms.JmsComponent; import org.apache.camel.impl.DefaultCamelContext; import org.jentrata.spa.jms.message.CamelMessage; /** * @author aaronwalker * */ public class JMSComponent extends Component { private ConnectionFactory connectionFactory; private CamelContext camel; @Override protected void init() throws Exception { super.init(); connectionFactory = buildConnectionFactory(); camel = new DefaultCamelContext(); camel.addComponent(getId(), JmsComponent.jmsComponentAutoAcknowledge(connectionFactory)); camel.start(); } public void registerHandler(final String queue, MessageHandler handler, Properties config) throws Exception { String errorUri = config.getProperty("errorUri"); if(errorUri == null) { errorUri = getErrorUri(); } RouteBuilder builder = new MessageHandlerRouteBuilder(queue,errorUri,handler,config); camel.addRoutes(builder); } public ProducerTemplate getProducer() { return camel.createProducerTemplate(); } public ConsumerTemplate getConsumer() { return camel.createConsumerTemplate(); } protected ConnectionFactory buildConnectionFactory() { String connectionFactoryUrl = getConnectionFactoryUrl(); ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory(connectionFactoryUrl); cf.setUserName(getUsername()); cf.setPassword(getPassword()); return cf; } protected String getConnectionFactoryUrl() { return getParameters().getProperty("connectionFactoryUrl"); } protected String getErrorUri() { return getParameters().getProperty("errorUri",getId() + ":queue:DLQ"); } protected String getUsername() { return getParameters().getProperty("username"); } protected String getPassword() { return getParameters().getProperty("password"); } public void shutdown() { try { if(camel != null) { camel.stop(); } } catch (Exception e) { Sys.main.log.warn("unable to shutdown jms component:" + e); Sys.main.log.debug("",e); } } private static class MessageHandlerRouteBuilder extends RouteBuilder { private String queueUri; private String errorUri; private MessageHandler handler; private Properties config; public MessageHandlerRouteBuilder(String queueUri, String errorUri, MessageHandler handler, Properties config) { this.queueUri = queueUri; this.handler = handler; this.config = config; this.errorUri = errorUri; } public void configure() { from(queueUri) .doTry() .process(new Processor() { public void process(Exchange exchange) throws Exception { try { handler.onMessage(new CamelMessage(exchange.getIn(),config)); } catch(Exception ex) { exchange.getIn().setHeader("dlqReason", ex.getMessage()); throw ex; } } }) .doCatch(RuntimeException.class) .to(errorUri) .end(); } } }