Java : Embedding Mule 2 into an existing Spring application
This page last changed on Jun 29, 2010 by Kees de Kooter
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;
}
}