Intro
Mule does not provide a default way of embedding itself in an existing spring app.
Bootstrapping a Mule context
Instead I wrote a bean that bootstraps the mule context and connects it to the parent application context.
import org.mule.api.MuleContext; import org.mule.api.MuleException; import org.mule.api.config.ConfigurationException; import org.mule.api.lifecycle.InitialisationException; import org.mule.config.spring.SpringXmlConfigurationBuilder; import org.mule.context.DefaultMuleContextFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; /** * Mule 2 does not support being embedded into an existing Spring application. * This bean performs the startup for us. * * @see http://www.mulesoft.org/jira/browse/MULE-2809 */ public class MuleStarter implements InitializingBean, DisposableBean, ApplicationContextAware { private Logger logger = LoggerFactory.getLogger(getClass()); private String contextPathName; private int startDelay = 0; private MuleContext muleContext; private ApplicationContext applicationContext; public MuleStarter(String contextPathName) { this.contextPathName = contextPathName; } public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } public void afterPropertiesSet() throws Exception { if (startDelay > 0) { Thread.currentThread(); Thread.sleep(startDelay); } DefaultMuleContextFactory contextFactory = new DefaultMuleContextFactory(); try { SpringXmlConfigurationBuilder configurationBuilder = new SpringXmlConfigurationBuilder(contextPathName); configurationBuilder.setParentContext(applicationContext); muleContext = contextFactory.createMuleContext(configurationBuilder); muleContext.start(); logger.info("Started Mule Context " + contextPathName); } catch (ConfigurationException e) { logger.error(e.toString()); } catch (InitialisationException e) { logger.error(e.toString()); } catch (MuleException e) { logger.error(e.toString()); } } public void destroy() throws Exception { if (muleContext.isStarted()) { muleContext.stop(); logger.info("Stopped Mule Context " + contextPathName); } } public void setContextPathName(String contextPathName) { this.contextPathName = contextPathName; } public void setStartDelay(int startDelay) { this.startDelay = startDelay; } }