orcl定时任务小弟是干干接触到,感觉非常好用,其在数据批量处理和移植上都非常不错。

下面我来说明我使用的定时任务:

首先我已经构建好了ssh架构,并在spring配置文件中写好了触发器

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:p="http://www.springframework.org/schema/p"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
    <!-- 启动触发器的配置开始 -->
 <bean  name="startupDelay" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  <!-- <property  value="60" ></property> -->
  <property name="triggers">
   <list>
    <!-- 每30秒执行一次 -->
    <!-- <ref bean="meTestDataScheduleJobTrigger" /> -->
    <!-- 每2分钟执行一次 -->
    <!-- <ref bean="insertBusConDataScheduleJobTrigger" /> -->
    <!-- 向客户表中插入数据 -->
    <!-- <ref bean="meRadomDataScheduleJobTrigger" /> -->
    <!-- 测试抓取APP数据保存到中间表 -->
    <ref bean="meTakeAppDataScheduleJobTrigger" />
   </list>
  </property>
   <property name="autoStartup" value="true" />
 </bean>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:p="http://www.springframework.org/schema/p"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
    <!-- 启动触发器的配置开始 -->
 <bean  name="startupDelay" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  <!-- <property  value="60" ></property> -->
  <property name="triggers">
   <list>
    <!-- 每30秒执行一次 -->
    <!-- <ref bean="meTestDataScheduleJobTrigger" /> -->
    <!-- 每2分钟执行一次 -->
    <!-- <ref bean="insertBusConDataScheduleJobTrigger" /> -->
    <!-- 向客户表中插入数据 -->
    <!-- <ref bean="meRadomDataScheduleJobTrigger" /> -->
    <!-- 测试抓取APP数据保存到中间表 -->
    <ref bean="meTakeAppDataScheduleJobTrigger" />
   </list>
  </property>
   <property name="autoStartup" value="true" />
 </bean>

首先该触发器是只需要一个,id 只是一个代号,可以随便写, 后面引用的class一定是固定的触发器类,这个spring都已经给了,

如果有多个定时任务,可以在<property>属性中定义list属性, 进行添加。总之触发器只要一个就可以了

<!-- 测试抓取APP数据保存到中间表 -->
 <bean id="meTakeAppDataScheduleJobTrigger"
  class="org.springframework.scheduling.quartz.CronTriggerBean">
  <property name="jobDetail">
   <ref bean="meTakeAppDataScheduleJobDetail" />
  </property>
  <property name="cronExpression">
  <!-- 测试每5分钟执行一次 -->
   <!-- <value>0 10 1 * * ?</value> -->
   <value>0 0/1 * * * ?</value>
  </property>
 </bean>
 <bean id="meTakeAppDataScheduleJob" class="com.minxinloan.auto.schedule.MeTakeCustData" />
 <bean id="meTakeAppDataScheduleJobDetail"
  class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
  <property name="targetObject">
   <ref bean="meTakeAppDataScheduleJob" />
  </property>
  <property name="targetMethod">
   <value>toMidData</value>
  </property>
 </bean>
 <!-- 测试抓取APP数据保存到中间表 -->
 <bean id="meTakeAppDataScheduleJobTrigger"
  class="org.springframework.scheduling.quartz.CronTriggerBean">
  <property name="jobDetail">
   <ref bean="meTakeAppDataScheduleJobDetail" />
  </property>
  <property name="cronExpression">
  <!-- 测试每5分钟执行一次 -->
   <!-- <value>0 10 1 * * ?</value> -->
   <value>0 0/1 * * * ?</value>
  </property>
 </bean>
 <bean id="meTakeAppDataScheduleJob" class="com.minxinloan.auto.schedule.MeTakeCustData" />
 <bean id="meTakeAppDataScheduleJobDetail"
  class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
  <property name="targetObject">
   <ref bean="meTakeAppDataScheduleJob" />
  </property>
  <property name="targetMethod">
   <value>toMidData</value>
  </property>
 </bean>

然后开始配置触发器中配置的属性:meTakeAppDataScheduleJobTrigger,写一个bean以meTakeAppDataScheduleJobTrigger命名,并制定固定的类,该bean下也有两个属性,一个指定了另一个固定的类,一个是<property name="cronExpression">,这个我只知道写上,具体意思还不清楚。

第一个属性指定了固定的类,还要用bean进行定义<bean id="meTakeAppDataScheduleJobDetail"
  class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">

这个bean下的属性就可以直接写你要执行的目标类和目标方法了。只能有一组目标类和目标方法。

<bean id="meTakeAppDataScheduleJob" class="com.minxinloan.auto.schedule.MeTakeCustData" />这个就是目标类,它里面要执行的方法就是目标方法

 

接下来开始写目标类,也就是定时任务要执行的MeTakeCustData类。

@Scope("prototype")
@Controller
public class MeTakeCustData {
 
 private final static Logger log = Logger.getLogger(MeTestDataTask.class);
 
 private final static SimpleDateFormat sd =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
 @Autowired
 MeTakeCustDataService meTakeAppDataService;
 
 @Autowired
 QuartzJobManagerService  quartzJobManagerService;
 
 public void toMidData(){
  String beginDate =sd.format(System.currentTimeMillis());
  
  try {
   log.info("抓取App端数据向中间表保存定时任务(start):"+sd.format(System.currentTimeMillis()));
   meTakeAppDataService.getAppData();
   log.info("抓取App端数据向中间表保存定时任务(end):"+sd.format(System.currentTimeMillis()));
   
   quartzJobManagerService.updateQuartzjobInfo("meTakeAppDataScheduleJobTrigger", quartzJobManagerService.JOB_STATUS_SUCCESS, "执行成功", beginDate);
  } catch (Exception e) {
   log.error("抓取App端数据向中间表保存的数据异常:"+e.getMessage());
//   quartzJobManagerService.updateQuartzjobInfo("meTakeAppDataScheduleJobTrigger", quartzJobManagerService.JOB_STATUS_SUCCESS, "执行成功", beginDate);
  }
  
 }
 
 
}
 @Scope("prototype")
@Controller
public class MeTakeCustData {
 
 private final static Logger log = Logger.getLogger(MeTestDataTask.class);
 
 private final static SimpleDateFormat sd =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
 @Autowired
 MeTakeCustDataService meTakeAppDataService;
 
 @Autowired
 QuartzJobManagerService  quartzJobManagerService;
 
 public void toMidData(){
  String beginDate =sd.format(System.currentTimeMillis());
  
  try {
   log.info("抓取App端数据向中间表保存定时任务(start):"+sd.format(System.currentTimeMillis()));
   meTakeAppDataService.getAppData();
   log.info("抓取App端数据向中间表保存定时任务(end):"+sd.format(System.currentTimeMillis()));
   
   quartzJobManagerService.updateQuartzjobInfo("meTakeAppDataScheduleJobTrigger", quartzJobManagerService.JOB_STATUS_SUCCESS, "执行成功", beginDate);
  } catch (Exception e) {
   log.error("抓取App端数据向中间表保存的数据异常:"+e.getMessage());
//   quartzJobManagerService.updateQuartzjobInfo("meTakeAppDataScheduleJobTrigger", quartzJobManagerService.JOB_STATUS_SUCCESS, "执行成功", beginDate);
  }
  
 }
 
 
}

这个目标类中的toMidData方法就是要执行的方法,在配置文件中都有配置,可以参看。

该方法中最主要的方法就是 meTakeAppDataService.getAppData();我们来看一下getAPPData()方法:

@Service(value = "MeTakeAppDataService")
@Transactional
public class MeTakeCustDataServiceImpl implements MeTakeCustDataService {
 public final static Logger logger = Logger.getLogger(MeTakeCustDataServiceImpl.class);
 private final static SimpleDateFormat sd =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 @Resource()
 @Qualifier("jdbcDao")
 private JdbcDao jdbcDao;
    
    @Resource()
 @Qualifier("jdbcDao1")
 private JdbcDao jdbcDao1;
 
 @Override
 public void getAppData() {
  System.out.println("开始抓取App端客户信息");
  List<Map> list = this.findCusData();
  for(int i = 0; i < list.size(); i++){
   System.out.println("抓取到的App端客户信息的id为:" + list.get(i).get("ID").toString());
   
   String sql = "insert into me_mid_customer_info "
     + "(id,"
     + "ch_name,"
     + "sex_cd,"
     + "id_type_cd,"
     + "id_number,"
     + "phone_number,"
     + "data_handle_date,"
     + "handle_terrace,"
     + "flag,"
     + "self_code,"
     + "other_code) VALUES "
     + "(seq_me_mid_customer_info.NEXTVAL,'" + getNull(list.get(i).get("NAME"))
     + "','" + getNull(list.get(i).get("SEX"))
     + "','" + getNull(list.get(i).get("IDTYPECD"))
     + "','" + getNull(list.get(i).get("IDNUMBER"))
     + "','" + getNull(list.get(i).get("PHONENUMBER"))
     + "','" + sd.format(System.currentTimeMillis())
     + "','" + ""//处理平台IOS,Android
     + "','" + "1"
     + "','" + getNull(list.get(i).get("REFERRALCODE"))
     + "','" + getNull(list.get(i).get("REFERRALOTHERCODE"))
     + "')";
   String sqlUpdate = "update me_customer_info set flag='2'";
    
   try {
    jdbcDao1.execute(sql);
    System.out.println("【SUCC】执行数据插入中间表成功!");
    jdbcDao.execute(sqlUpdate);
    System.out.println("【SUCC】修改数据成功");
   } catch (Exception e) {
    System.out.println("【ERROR】执行数据插入中间表报错!");
    e.printStackTrace();
   }
  }
 }
 
 public List findCusData(){
  List<Map> lists = new ArrayList<Map>();
  String sql = "select t.id,"
    + "t.name,"
    + "t.id_number,"
    + "t.sex,"
    + "t.id_type_cd,"
    + "t.phone_number,"
    + "t.cus_type,"
    + "t.register_time,"
    + "t.invest_status,"
    + "t.remark_info,"
    + "t.referral_code,"
    + "mr.REFERRALED_ID "
    + " from me_customer_info t left join me_referrals_info mr on mr.cus_id = t.id "
    + "where t.flag='1'"
    + " and t.id_number is not null"
    + " and t.name is not null";
  List l = jdbcDao.queryData(sql);
  //将l中的值取出命名方便取值
  for(int i = 0; i < l.size(); i++){
   Map map = new HashMap();
   List lt = (List)l.get(i);
   map.put("ID", getNull(lt.get(0)));
   map.put("NAME", getNull(lt.get(1)));
   map.put("IDNUMBER", getNull(lt.get(2)));
   map.put("SEX", getNull(lt.get(3)));
   map.put("IDTYPECD", getNull(lt.get(4)));
   map.put("PHONENUMBER", getNull(lt.get(5)));
   map.put("CUSTYPE", getNull(lt.get(6)));
   map.put("REGISTERTIME", getNull(lt.get(7)));
   map.put("INVESTSTATUS", getNull(lt.get(8)));
   map.put("REMARKINFO", getNull(lt.get(9)));
   map.put("REFERRALCODE", getNull(lt.get(10)));
   map.put("REFERRALOTHERCODE", getNull(lt.get(11)));
   lists.add(map);
   
  }
  
  
  return lists;
 }
 
 private String getNull(Object obj){
     if(null != obj){
  return obj.toString();
     }else if(obj.equals("null")){
  return "";
     }else{
      return "";
     }
     
 }
@Service(value = "MeTakeAppDataService")
@Transactional
public class MeTakeCustDataServiceImpl implements MeTakeCustDataService {
 public final static Logger logger = Logger.getLogger(MeTakeCustDataServiceImpl.class);
 private final static SimpleDateFormat sd =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 @Resource()
 @Qualifier("jdbcDao")
 private JdbcDao jdbcDao;
    
    @Resource()
 @Qualifier("jdbcDao1")
 private JdbcDao jdbcDao1;
 
 @Override
 public void getAppData() {
  System.out.println("开始抓取App端客户信息");
  List<Map> list = this.findCusData();
  for(int i = 0; i < list.size(); i++){
   System.out.println("抓取到的App端客户信息的id为:" + list.get(i).get("ID").toString());
   
   String sql = "insert into me_mid_customer_info "
     + "(id,"
     + "ch_name,"
     + "sex_cd,"
     + "id_type_cd,"
     + "id_number,"
     + "phone_number,"
     + "data_handle_date,"
     + "handle_terrace,"
     + "flag,"
     + "self_code,"
     + "other_code) VALUES "
     + "(seq_me_mid_customer_info.NEXTVAL,'" + getNull(list.get(i).get("NAME"))
     + "','" + getNull(list.get(i).get("SEX"))
     + "','" + getNull(list.get(i).get("IDTYPECD"))
     + "','" + getNull(list.get(i).get("IDNUMBER"))
     + "','" + getNull(list.get(i).get("PHONENUMBER"))
     + "','" + sd.format(System.currentTimeMillis())
     + "','" + ""//处理平台IOS,Android
     + "','" + "1"
     + "','" + getNull(list.get(i).get("REFERRALCODE"))
     + "','" + getNull(list.get(i).get("REFERRALOTHERCODE"))
     + "')";
   String sqlUpdate = "update me_customer_info set flag='2'";
    
   try {
    jdbcDao1.execute(sql);
    System.out.println("【SUCC】执行数据插入中间表成功!");
    jdbcDao.execute(sqlUpdate);
    System.out.println("【SUCC】修改数据成功");
   } catch (Exception e) {
    System.out.println("【ERROR】执行数据插入中间表报错!");
    e.printStackTrace();
   }
  }
 }
 
 public List findCusData(){
  List<Map> lists = new ArrayList<Map>();
  String sql = "select t.id,"
    + "t.name,"
    + "t.id_number,"
    + "t.sex,"
    + "t.id_type_cd,"
    + "t.phone_number,"
    + "t.cus_type,"
    + "t.register_time,"
    + "t.invest_status,"
    + "t.remark_info,"
    + "t.referral_code,"
    + "mr.REFERRALED_ID "
    + " from me_customer_info t left join me_referrals_info mr on mr.cus_id = t.id "
    + "where t.flag='1'"
    + " and t.id_number is not null"
    + " and t.name is not null";
  List l = jdbcDao.queryData(sql);
  //将l中的值取出命名方便取值
  for(int i = 0; i < l.size(); i++){
   Map map = new HashMap();
   List lt = (List)l.get(i);
   map.put("ID", getNull(lt.get(0)));
   map.put("NAME", getNull(lt.get(1)));
   map.put("IDNUMBER", getNull(lt.get(2)));
   map.put("SEX", getNull(lt.get(3)));
   map.put("IDTYPECD", getNull(lt.get(4)));
   map.put("PHONENUMBER", getNull(lt.get(5)));
   map.put("CUSTYPE", getNull(lt.get(6)));
   map.put("REGISTERTIME", getNull(lt.get(7)));
   map.put("INVESTSTATUS", getNull(lt.get(8)));
   map.put("REMARKINFO", getNull(lt.get(9)));
   map.put("REFERRALCODE", getNull(lt.get(10)));
   map.put("REFERRALOTHERCODE", getNull(lt.get(11)));
   lists.add(map);
   
  }
  
  
  return lists;
 }
 
 private String getNull(Object obj){
     if(null != obj){
  return obj.toString();
     }else if(obj.equals("null")){
  return "";
     }else{
      return "";
     }
     
 }

getAPPData()方法中主要是将findCusData方法中查询出来的数据插入到me_mid_customer_info表中,这种方式是实现数据传递的一种方式,但是这里要注意这里边用了两个jdbcDao和jdbcDao1, 应为这个service中对两个不同的数据库进行了操作(不同用户),需要两个事物,所以我们还要在spring的配置文件中开启两个事物(前提是你使用的而是hibernate操作,他支持多事物操作。如果是mybatis只能用一个事物进行操作)

<bean id="sessionFactory"
  class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="configurationClass">
   <value>org.hibernate.cfg.AnnotationConfiguration</value>
  </property>
  <property name="configLocation">
   <value>classpath:/springConfig/hibernate.cfg.xml</value>
  </property>
  <property name="hibernateProperties">
   <value>
    hibernate.dialect=${hibernate.dialect}
    hibernate.show_sql=${hibernate.show_sql}
    hibernate.format_sql=${format_sql}
    hibernate.jdbc.batch_size=${hibernate.jdbc.batch_size}
   </value>
  </property>
 </bean>

 <bean id="sessionFactory1"
  class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="dataSource" ref="dataSource1" />
  <property name="configurationClass">
   <value>org.hibernate.cfg.AnnotationConfiguration</value>
  </property>
  <property name="configLocation">
   <value>classpath:/springConfig/hibernate.cfg.xml</value>
  </property>
  <property name="hibernateProperties">
   <value>
    hibernate.dialect=${hibernate.dialect}
    hibernate.show_sql=${hibernate.show_sql}
    hibernate.format_sql=${format_sql}
    hibernate.jdbc.batch_size=${hibernate.jdbc.batch_size}
   </value>
  </property>
 </bean>

 <bean id="transactionManager2"
  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory" ref="sessionFactory1" />
 </bean>
 <bean id="transactionManager"
  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory" ref="sessionFactory" />
 </bean>
 <context:annotation-config />
 <bean id="transactionInterceptor"
  class="org.springframework.transaction.interceptor.TransactionInterceptor">
  <property name="transactionManager" ref="transactionManager" />
  <!-- 配置事务属性 -->
  <property name="transactionAttributes">
   <props>
    <prop key="*">PROPAGATION_REQUIRED, -Exception</prop>
   </props>
  </property>
 </bean>
 <bean id="transactionInterceptor2"
  class="org.springframework.transaction.interceptor.TransactionInterceptor">
  <property name="transactionManager" ref="transactionManager2" />
  <!-- 配置事务属性 -->
  <property name="transactionAttributes">
   <props>
    <prop key="*">PROPAGATION_REQUIRED, -Exception</prop>
   </props>
  </property>
 </bean>
 <bean class="com.minxin.base.web.hadler.KoalaHandlerExceptionResolver">
  <property name="defaultErrorView" value="error"></property>
  <!-- 定义需要特殊处理的异常,用类名或完全路径名作为key,异常也页面作为值 -->
  <property name="exceptionMappings">
   <props>
    <prop key="com.minxin.base.web.ValidationException">validationError </prop>
   </props>
  </property>
 </bean>

 <tx:annotation-driven transaction-manager="transactionManager" />
 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
  destroy-method="close">
  <property name="driverClassName" value="${mefc.jdbc.driver}" />
  <property name="url" value="${mefc.jdbc.url}" />
  <property name="username" value="${mefc.jdbc.username}" />
  <property name="password" value="${mefc.jdbc.password}" />
  <property name="maxActive" value="100" />
  <property name="maxIdle" value="30" />
  <property name="maxWait" value="1000" />
  <property name="defaultAutoCommit" value="true" />
  <property name="removeAbandoned" value="true" />
  <property name="removeAbandonedTimeout" value="180" />
 </bean>
 <bean id="dataSource1" class="org.apache.commons.dbcp.BasicDataSource"
  destroy-method="close">
  <property name="driverClassName" value="${memid.jdbc.driver}" />
  <property name="url" value="${memid.jdbc.url}" />
  <property name="username" value="${memid.jdbc.username}" />
  <property name="password" value="${memid.jdbc.password}" />
  <property name="maxActive" value="100" />
  <property name="maxIdle" value="30" />
  <property name="maxWait" value="1000" />
  <property name="defaultAutoCommit" value="true" />
  <property name="removeAbandoned" value="true" />
  <property name="removeAbandonedTimeout" value="180" />
 </bean>
 <!-- <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
  <property name="jndiName"> <value>java:comp/env/jdbc/minxinDataSource</value> 
  </property> </bean> -->
 <aop:aspectj-autoproxy />
 <bean id="jdbcDao" class="com.minxinloan.dao.impl.JdbcDaoImpl">
  <property name="sessionFactory" ref="sessionFactory"></property>
 </bean>
 <bean id="jdbcDao1" class="com.minxinloan.dao.impl.JdbcDaoImpl">
  <property name="sessionFactory" ref="sessionFactory1"></property>
 </bean>
 <bean id="logAspect" class="com.minxinloan.common.log.LogAspect" />
 <aop:config>
  <aop:pointcut id="pointcut"
   expression="execution( public * com.minxinloan.*.service..*.*(..)) and !execution( * com.minxinloan.common.log..*(..))" />
  <aop:aspect id="loggerAspectToDb" ref="logAspect">
   <aop:before pointcut-ref="pointcut" method="before" />
   <aop:after-returning pointcut-ref="pointcut"
    method="afterReturn" />
   <aop:around pointcut-ref="pointcut" method="around" />
  </aop:aspect>
 </aop:config>
 <import resource="me_mid_QuartzJob.xml"/>
 <bean id="sessionFactory"
  class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="configurationClass">
   <value>org.hibernate.cfg.AnnotationConfiguration</value>
  </property>
  <property name="configLocation">
   <value>classpath:/springConfig/hibernate.cfg.xml</value>
  </property>
  <property name="hibernateProperties">
   <value>
    hibernate.dialect=${hibernate.dialect}
    hibernate.show_sql=${hibernate.show_sql}
    hibernate.format_sql=${format_sql}
    hibernate.jdbc.batch_size=${hibernate.jdbc.batch_size}
   </value>
  </property>
 </bean>

 <bean id="sessionFactory1"
  class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="dataSource" ref="dataSource1" />
  <property name="configurationClass">
   <value>org.hibernate.cfg.AnnotationConfiguration</value>
  </property>
  <property name="configLocation">
   <value>classpath:/springConfig/hibernate.cfg.xml</value>
  </property>
  <property name="hibernateProperties">
   <value>
    hibernate.dialect=${hibernate.dialect}
    hibernate.show_sql=${hibernate.show_sql}
    hibernate.format_sql=${format_sql}
    hibernate.jdbc.batch_size=${hibernate.jdbc.batch_size}
   </value>
  </property>
 </bean>

 <bean id="transactionManager2"
  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory" ref="sessionFactory1" />
 </bean>
 <bean id="transactionManager"
  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory" ref="sessionFactory" />
 </bean>
 <context:annotation-config />
 <bean id="transactionInterceptor"
  class="org.springframework.transaction.interceptor.TransactionInterceptor">
  <property name="transactionManager" ref="transactionManager" />
  <!-- 配置事务属性 -->
  <property name="transactionAttributes">
   <props>
    <prop key="*">PROPAGATION_REQUIRED, -Exception</prop>
   </props>
  </property>
 </bean>
 <bean id="transactionInterceptor2"
  class="org.springframework.transaction.interceptor.TransactionInterceptor">
  <property name="transactionManager" ref="transactionManager2" />
  <!-- 配置事务属性 -->
  <property name="transactionAttributes">
   <props>
    <prop key="*">PROPAGATION_REQUIRED, -Exception</prop>
   </props>
  </property>
 </bean>
 <bean class="com.minxin.base.web.hadler.KoalaHandlerExceptionResolver">
  <property name="defaultErrorView" value="error"></property>
  <!-- 定义需要特殊处理的异常,用类名或完全路径名作为key,异常也页面作为值 -->
  <property name="exceptionMappings">
   <props>
    <prop key="com.minxin.base.web.ValidationException">validationError </prop>
   </props>
  </property>
 </bean>

 <tx:annotation-driven transaction-manager="transactionManager" />
 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
  destroy-method="close">
  <property name="driverClassName" value="${mefc.jdbc.driver}" />
  <property name="url" value="${mefc.jdbc.url}" />
  <property name="username" value="${mefc.jdbc.username}" />
  <property name="password" value="${mefc.jdbc.password}" />
  <property name="maxActive" value="100" />
  <property name="maxIdle" value="30" />
  <property name="maxWait" value="1000" />
  <property name="defaultAutoCommit" value="true" />
  <property name="removeAbandoned" value="true" />
  <property name="removeAbandonedTimeout" value="180" />
 </bean>
 <bean id="dataSource1" class="org.apache.commons.dbcp.BasicDataSource"
  destroy-method="close">
  <property name="driverClassName" value="${memid.jdbc.driver}" />
  <property name="url" value="${memid.jdbc.url}" />
  <property name="username" value="${memid.jdbc.username}" />
  <property name="password" value="${memid.jdbc.password}" />
  <property name="maxActive" value="100" />
  <property name="maxIdle" value="30" />
  <property name="maxWait" value="1000" />
  <property name="defaultAutoCommit" value="true" />
  <property name="removeAbandoned" value="true" />
  <property name="removeAbandonedTimeout" value="180" />
 </bean>
 <!-- <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
  <property name="jndiName"> <value>java:comp/env/jdbc/minxinDataSource</value> 
  </property> </bean> -->
 <aop:aspectj-autoproxy />
 <bean id="jdbcDao" class="com.minxinloan.dao.impl.JdbcDaoImpl">
  <property name="sessionFactory" ref="sessionFactory"></property>
 </bean>
 <bean id="jdbcDao1" class="com.minxinloan.dao.impl.JdbcDaoImpl">
  <property name="sessionFactory" ref="sessionFactory1"></property>
 </bean>
 <bean id="logAspect" class="com.minxinloan.common.log.LogAspect" />
 <aop:config>
  <aop:pointcut id="pointcut"
   expression="execution( public * com.minxinloan.*.service..*.*(..)) and !execution( * com.minxinloan.common.log..*(..))" />
  <aop:aspect id="loggerAspectToDb" ref="logAspect">
   <aop:before pointcut-ref="pointcut" method="before" />
   <aop:after-returning pointcut-ref="pointcut"
    method="afterReturn" />
   <aop:around pointcut-ref="pointcut" method="around" />
  </aop:aspect>
 </aop:config>
 <import resource="me_mid_QuartzJob.xml"/>

如此基本配置完成, 启动服务后,会在配置文件中添加事物,然后开启触发器,找到目标类,执行布标方法,数据开始传递。