package com.bky.datasource; import java.util.List; import org.simpleframework.xml.Attribute; import org.simpleframework.xml.ElementList; import org.simpleframework.xml.Root; @Root(name="beans") public class MutilDataSourceXmlConfig { @Attribute(name="xmlns") private String xmlns = "http://www.springframework.org/schema/beans"; @Attribute(name="xmlns:xsi") private String xmlnsxsi = "http://www.w3.org/2001/XMLSchema-instance"; @Attribute(name="xsi:schemaLocation") private String xsischemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"; @ElementList(entry = "bean", inline = true,required = true) private List<MutilDataSourceXmlConfigBean> beans ; public String getXmlns() { return xmlns; } public void setXmlns(String xmlns) { this.xmlns = xmlns; } public String getXmlnsxsi() { return xmlnsxsi; } public void setXmlnsxsi(String xmlnsxsi) { this.xmlnsxsi = xmlnsxsi; } public String getXsischemaLocation() { return xsischemaLocation; } public void setXsischemaLocation(String xsischemaLocation) { this.xsischemaLocation = xsischemaLocation; } public List<MutilDataSourceXmlConfigBean> getBeans() { return beans; } public void setBeans(List<MutilDataSourceXmlConfigBean> beans) { this.beans = beans; } }
package com.bky.datasource; import java.util.List; import org.simpleframework.xml.Attribute; import org.simpleframework.xml.ElementArray; import org.simpleframework.xml.ElementList; import org.simpleframework.xml.Root; @Root public class MutilDataSourceXmlConfigBean { @Attribute(name="id") private String id ; @Attribute(name="class") private String clazz ; @Attribute(name="destroy-method") private String destroyMethod ="close"; @Attribute(name="lazy-init") private boolean lazyInit = true; @ElementList(entry = "property", inline = true , required= true) private List<MutilDataSourceXmlConfigBeanProperty> properties ; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getClazz() { return clazz; } public void setClazz(String clazz) { this.clazz = clazz; } public String getDestroyMethod() { return destroyMethod; } public void setDestroyMethod(String destroyMethod) { this.destroyMethod = destroyMethod; } public boolean isLazyInit() { return lazyInit; } public void setLazyInit(boolean lazyInit) { this.lazyInit = lazyInit; } public List<MutilDataSourceXmlConfigBeanProperty> getProperties() { return properties; } public void setProperties(List<MutilDataSourceXmlConfigBeanProperty> properties) { this.properties = properties; } }
package com.bky.datasource; import org.simpleframework.xml.Attribute; import org.simpleframework.xml.Root; @Root public class MutilDataSourceXmlConfigBeanProperty { @Attribute(name="name") private String name ; @Attribute(name="value") private String value ; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } }
package cn.richinfo.cmail.dbrouter; import java.io.File; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.simpleframework.xml.Serializer; import org.simpleframework.xml.core.Persister; public class MutilDataSourceXmlConfigUtil { public static void createXml(MutilDataSourceXmlConfig config , Map<MutilDataSourceXmlConfigBean, Map<String, String>> maps, String path,ContextHolder handdler) throws Exception{ Set<String> set = new HashSet<String>() ; for (MutilDataSourceXmlConfigBean key : maps.keySet()) { set.add(key.getId()) ; } handdler.init(set) ; MutilDataSourceXmlConfig configXml = createMutilDataSourceXmlConfig(config,maps,handdler); Serializer serializer = new Persister(); serializer.write(configXml, new File(path)); } public static MutilDataSourceXmlConfig createMutilDataSourceXmlConfig(MutilDataSourceXmlConfig config ,Map<MutilDataSourceXmlConfigBean, Map<String, String>> beansMap,ContextHolder handdler) { List<MutilDataSourceXmlConfigBean> beanList = new ArrayList<MutilDataSourceXmlConfigBean>(); for (MutilDataSourceXmlConfigBean key : beansMap.keySet()) { //设置bean属性id key.setId(handdler.getValue(key.getId())) ; beanList.add(createMutilDataSourceXmlConfigBean(key, beansMap.get(key))); } config.setBeans(beanList) ; return config; } /* public static void createXml(MutilDataSourceXmlConfig config ,MutilDataSourceXmlConfigBean bean , Map<String, Map<String, String>> maps, String path,ContextHolder handdler) throws Exception{ handdler.init(maps.keySet()) ; MutilDataSourceXmlConfig beans = createMutilDataSourceXmlConfig(config,bean, maps,handdler); Serializer serializer = new Persister(); serializer.write(beans, new File(path)); } public static MutilDataSourceXmlConfig createMutilDataSourceXmlConfig(MutilDataSourceXmlConfig beans ,MutilDataSourceXmlConfigBean bean ,Map<String, Map<String, String>> beansMap,ContextHolder handdler) { MutilDataSourceXmlConfig config = new MutilDataSourceXmlConfig(); //构建xml属性 config.setXmlns(beans.getXmlns()) ; config.setXmlnsxsi(beans.getXmlnsxsi()) ; config.setXsischemaLocation(beans.getXsischemaLocation()) ; List<MutilDataSourceXmlConfigBean> beanList = new ArrayList<MutilDataSourceXmlConfigBean>(); for (String key : beansMap.keySet()) { //设置bean属性id bean.setId(handdler.getValue(key)) ; beanList.add(createMutilDataSourceXmlConfigBean(bean, beansMap.get(key))); } beans.setBeans(beanList) ; return beans; } */ public static MutilDataSourceXmlConfigBean createMutilDataSourceXmlConfigBean(MutilDataSourceXmlConfigBean bean, Map<String, String> propMap) { // 构建bean //MutilDataSourceXmlConfigBean bean = new MutilDataSourceXmlConfigBean(); //bean.setId(param.getId()); //bean.setClazz(param.getClazz()); /*if (param.getDestroyMethod() != null) { bean.setDestroyMethod(param.getDestroyMethod()); } bean.setLazyInit(param.isLazyInit());*/ bean.setProperties(createMutilDataSourceXmlConfigBeanProperty(propMap)); return bean; } public static List<MutilDataSourceXmlConfigBeanProperty> createMutilDataSourceXmlConfigBeanProperty( Map<String, String> map) { List<MutilDataSourceXmlConfigBeanProperty> proList = new ArrayList<MutilDataSourceXmlConfigBeanProperty>(); MutilDataSourceXmlConfigBeanProperty property = null; for (String key : map.keySet()) { property = new MutilDataSourceXmlConfigBeanProperty(); property.setName(key); property.setValue(map.get(key)); proList.add(property); } return proList; } }
main方法
/** * 生成数据库路由bean配置文件 * @param list * @param filePath * @param ddrService * @author wuchaohui */ public static void createRoutBeanXml(List<DbRouterModel> list, String filePath ,DbRouterDatasourcePropertyService ddrService) { try { Map<MutilDataSourceXmlConfigBean, Map<String, String>> maps = new HashMap<MutilDataSourceXmlConfigBean, Map<String, String>>(); Map<String, String> map = null; for (int i = 0; i < list.size(); i++) { map = new HashMap<String, String>(); DbRouterModel model = list.get(i); dealDbRouterModelNullAttribute(model) ; if (DbRouterConst.DYNAMIC_DATASOURCE_DRUID_TYPE.equals(model.getDbRouterDatasourceType())) {// druid List<DbRouterDatasourcePropertyModel> props = ddrService .searchList(model.getDbRouterDatasourceType()); DruidDataSourceAttrModel attr = getDruidDataSourceAttrModel(props,model.getDbType(),model.getDbIp(),model.getDbPort(),model.getDbName(),model.getDbUser(),model.getDbPwd()); map = BeanCopierUtils.getProperties(attr); MutilDataSourceXmlConfigBean bean = new MutilDataSourceXmlConfigBean() ; bean.setId(String.valueOf(model.getCorpId())) ; bean.setClazz(DbRouterConst.DYNAMIC_DATASOURCE_DRUID_NAME); bean.setDestroyMethod("close"); bean.setLazyInit(true); maps.put(bean, map); } } ContextHolder handdler = new LogRouterContextHolder(); MutilDataSourceXmlConfig configParam = new MutilDataSourceXmlConfig(); MutilDataSourceXmlConfigUtil.createXml(configParam, maps, filePath, handdler); } catch (Exception e) { logger.error("cmd = HelpUtil:createRoutBeanXml | msg = 初始化生成日志懂爱数据库配置异常",e); } }
执行结果:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="ds_cmail_dbrouter_1002" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close" lazy-init="true"> <property name="testOnBorrow" value="false"/> <property name="testWhileIdle" value="true"/> <property name="validationQuery" value="SELECT 'x'"/> <property name="password" value="2146230530"/> <property name="url" value="jdbc:mysql://192.168.34.143:3308/test_logreport?null"/> <property name="removeAbandonedTimeout" value="180"/> <property name="testOnReturn" value="false"/> <property name="maxActive" value="20"/> <property name="username" value="richmail"/> <property name="logAbandoned" value="true"/> <property name="maxOpenPreparedStatements" value="10"/> <property name="maxWait" value="60000"/> <property name="minIdle" value="3"/> <property name="removeAbandoned" value="true"/> <property name="timeBetweenEvictionRunsMillis" value="30000"/> <property name="minEvictableIdleTimeMillis" value="1800000"/> <property name="initialSize" value="1"/> </bean> <bean id="ds_cmail_dbrouter_1001" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close" lazy-init="true"> <property name="testOnBorrow" value="false"/> <property name="testWhileIdle" value="true"/> <property name="validationQuery" value="SELECT 'x'"/> <property name="password" value="2146230530"/> <property name="url" value="jdbc:mysql://192.168.34.143:3308/test_logreport?null"/> <property name="removeAbandonedTimeout" value="180"/> <property name="testOnReturn" value="false"/> <property name="maxActive" value="20"/> <property name="username" value="richmail"/> <property name="logAbandoned" value="true"/> <property name="maxOpenPreparedStatements" value="10"/> <property name="maxWait" value="60000"/> <property name="minIdle" value="3"/> <property name="removeAbandoned" value="true"/> <property name="timeBetweenEvictionRunsMillis" value="30000"/> <property name="minEvictableIdleTimeMillis" value="1800000"/> <property name="initialSize" value="1"/> </bean> <bean id="ds_cmail_dbrouter_1000" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close" lazy-init="true"> <property name="testOnBorrow" value="false"/> <property name="testWhileIdle" value="true"/> <property name="validationQuery" value="SELECT 'x'"/> <property name="password" value="2146230530"/> <property name="url" value="jdbc:mysql://192.168.34.143:3308/test_logreport?null"/> <property name="removeAbandonedTimeout" value="180"/> <property name="testOnReturn" value="false"/> <property name="maxActive" value="20"/> <property name="username" value="richmail"/> <property name="logAbandoned" value="true"/> <property name="maxOpenPreparedStatements" value="10"/> <property name="maxWait" value="60000"/> <property name="minIdle" value="3"/> <property name="removeAbandoned" value="true"/> <property name="timeBetweenEvictionRunsMillis" value="30000"/> <property name="minEvictableIdleTimeMillis" value="1800000"/> <property name="initialSize" value="1"/> </bean> <bean id="ds_cmail_dbrouter_1010" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close" lazy-init="true"> <property name="testOnBorrow" value="false"/> <property name="testWhileIdle" value="true"/> <property name="validationQuery" value="SELECT 'x'"/> <property name="password" value="2146230530"/> <property name="url" value="jdbc:mysql://192.168.34.143:3308/test_logreport?null"/> <property name="removeAbandonedTimeout" value="180"/> <property name="testOnReturn" value="false"/> <property name="maxActive" value="20"/> <property name="username" value="richmail"/> <property name="logAbandoned" value="true"/> <property name="maxOpenPreparedStatements" value="10"/> <property name="maxWait" value="60000"/> <property name="minIdle" value="3"/> <property name="removeAbandoned" value="true"/> <property name="timeBetweenEvictionRunsMillis" value="30000"/> <property name="minEvictableIdleTimeMillis" value="1800000"/> <property name="initialSize" value="1"/> </bean> </beans>