从形势来看,如果应用不使用
Spring
就感觉有点落伍——说法有点别扭:好像有点过。诚然,
Spring
给我们带来了太多的好处,以至于几乎大部分的产品都以声称能够整合
Spring
为荣,
Mule
也不能免俗:)
从官方来看,
mule
与
spring
的结合有三种做法:
1
、
Using Spring as a Component Factory
How to configure the Spring Container with Mule so that Managed components and other Mule objects can be loaded from Spring.
2
、
Configuring the Mule Server From a Spring Context
A Mule server is just a bunch of beans! How to load a Mule instance from the Spring Container.
3
、
Configuring a Spring context using Mule Xml
There are lots of reasons why you might want to use Mule and Spring together, but configuring Mule in Spring bean Xml can be a verbose process. Now you can configure it using Mule Xml and mix Spring beans in the configuration.
1.1.1.
Using Spring as a Component Factory
我下面首先尝试的是第一种。
1.1.1.1.
web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext-mule.xml
</param-value>
</context-param>
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
1.1.1.2.
配置文件(举例)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="muleManager" class="org.mule.extras.spring.config.AutowireUMOManagerFactoryBean" destroy-method="dispose" singleton="true"/>
<bean id="muleNameProcessor" class="org.mule.extras.spring.config.MuleObjectNameProcessor"/>
<bean id="muleClient" class="org.mule.extras.client.MuleClient" depends-on="muleManager"/>
<bean id="applicationEventMulticaster" class="org.mule.extras.spring.events.MuleEventMulticaster">
<property name="asynchronous">
<value>false</value>
</property>
</bean>
<bean name="JmxAgent" class="org.mule.management.agents.JmxAgent"/>
<bean name="JdmkAgent" class="org.mule.management.agents.JdmkAgent">
<property name="jmxAdaptorUrl" value="http://localhost:9999"/>
</bean>
<bean id="echoDescriptor" class="org.mule.impl.MuleDescriptor">
<property name="inboundEndpoint">
<ref local="echoInboundEndpoint"/>
</property>
<property name="implementation">
<value>echoComponent</value>
</property>
</bean>
<bean id="echoInboundEndpoint" singleton="false" class="org.mule.impl.endpoint.MuleEndpoint">
<property name="endpointURI">
<bean class="org.mule.impl.endpoint.MuleEndpointURI">
<constructor-arg index="0">
<value>vm://echo</value>
</constructor-arg>
</bean>
</property>
</bean>
<bean id="echoComponent" class="org.mule.components.simple.EchoComponent" singleton='false'/>
</beans>
|
1.1.1.3.
评价
这种方法是比较纯的
spring
配置手段
(
注意在此使用的
DTD
为
spring-beans.dtd)
,不利于把握
mule
的配置感觉。不推荐使用。
1.1.2.
Configuring a Spring context using Mule Xml
1.1.2.1.
Web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext-mule.xml,
/WEB-INF/ede-config.xml
</param-value>
</context-param>
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
1.1.2.2.
配置文件(举例,
applicationContext-ede-core.xml
)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mule-configuration PUBLIC "-//SymphonySoft //DTD mule-configuration XML V1.0//EN" "http://www.symphonysoft.com/dtds/mule/mule-spring-configuration.dtd">
<mule-configuration id="EdeCore" version="2.0">
<!--
描述
-->
<description>Enterprice DataExpress</description>
<mule-environment-properties synchronous="true" serverUrl="tcp://localhost:9999">
<queue-profile maxOutstandingMessages="1000" persistent="true"/>
</mule-environment-properties>
<agents>
<agent name="JmxAgent" className="org.mule.management.agents.JmxAgent"/>
<agent name="JdmkAgent" className="org.mule.management.agents.JdmkAgent"/>
<properties>
<property name="jmxAdaptorUrl" value="http://localhost:9999"/>
</properties>
</agents>
<model name="Nothing"></model>
</mule-configuration>
1.1.2.3.
配置文件(举例,
applicationContext-ede-extend.xml
)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mule-configuration PUBLIC "-//SymphonySoft //DTD mule-configuration XML V1.0//EN" "http://www.symphonysoft.com/dtds/mule/mule-spring-configuration.dtd">
<mule-configuration id="EDE" version="1.0">
<!--
<description>Enterprice DataExpress</description>
<mule-environment-properties synchronous="true" serverUrl="tcp://localhost:9999">
<queue-profile maxOutstandingMessages="1000" persistent="true"/>
</mule-environment-properties>-->
<mule-descriptor name="echoUMO" implementation="echoComponent">
<inbound-router>
<endpoint address="vm://echo"/>
</inbound-router>
</mule-descriptor>
<bean id="echoComponent" class="org.mule.components.simple.EchoComponent" singleton="false"/>
</mule-configuration>
1.1.2.4.
评价
这种方法是比较
Mule-friendly
的配置手段
(
注意在此使用的
DTD
为
mule-spring-configuration.dtd)
,从整体感觉来看,与一般的纯
Mule
配置感觉类似。
推荐使用。
1.1.3.
自定义方式
从产品研发来看,自定义模型配置加载方式有着诸多的好处,这里不讲。
我们的自定义模型配置加载方式的目标是:
1、
可以兼容标准的基于
mule
配置文件配置的模型,同时也要兼容根据其他定义方式(如基于数据库)的可编程式模型加载;
2、
可以更多的干预系统默认的加载方式。
1.1.3.1.
Web.xml
<context-param>
<param-name>com.nci.ede.config</param-name>
<param-value>applicationContext-ede-core.xml,
applicationContext-ede-extend.xml,
applicationContext-sample-echo2.xml
</param-value>
</context-param>
<listener>
<listener-class>com.nci.ede.system.config.EdeBuilderContextListener</listener-class>
</listener>
|
这里有一个重要的
Listener
,用来在系统启动的时候自动加载配置信息,其核心代码如下:
public void contextInitialized(ServletContextEvent event)
{
String config = event.getServletContext().getInitParameter(CONFIG_INIT_PARAMETER);
if (config == null) {
config = getDefaultConfigResource();
}
try {
createManager(config, event.getServletContext());
} catch (ConfigurationException e) {
event.getServletContext().log(e.getMessage(), e);
}
}
protected UMOManager createManager(String configResource, ServletContext context) throws ConfigurationException{
//WebappMuleXmlConfigurationBuilder builder = new WebappMuleXmlConfigurationBuilder(context);
SpringConfigurationBuilder builder = new SpringConfigurationBuilder();
UMOManager manager = builder.configure(configResource);
try {
//
通过
spring
的
bean factory
获取
EdeConfigurationLoader loader = (EdeConfigurationLoader)SpringHelper.getBean(manager,"edeConfigurationLoader");
loader.loadConfig();
} catch (ObjectNotFoundException e1) {
e1.printStackTrace();
} catch (EdeException e) {
e.printStackTrace();
}
return manager;
}
|
其中所调用的自定义加载器
edeConfigurationLoader
可以在
spring
中注入。