spring自带定时任务概要
2015-12-03 00:00
501 查看
摘要: spring自带定时任务概要
orcl定时任务小弟是干干接触到,感觉非常好用,其在数据批量处理和移植上都非常不错。
下面我来说明我使用的定时任务:
首先我已经构建好了ssh架构,并在spring配置文件中写好了触发器
首先该触发器是只需要一个,id 只是一个代号,可以随便写, 后面引用的class一定是固定的触发器类,这个spring都已经给了,
如果有多个定时任务,可以在<property>属性中定义list属性, 进行添加。总之触发器只要一个就可以了
然后开始配置触发器中配置的属性: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类。
这个目标类中的toMidData方法就是要执行的方法,在配置文件中都有配置,可以参看。
该方法中最主要的方法就是 meTakeAppDataService.getAppData();我们来看一下getAPPData()方法:
getAPPData()方法中主要是将findCusData方法中查询出来的数据插入到me_mid_customer_info表中,这种方式是实现数据传递的一种方式,但是这里要注意这里边用了两个jdbcDao和jdbcDao1, 应为这个service中对两个不同的数据库进行了操作(不同用户),需要两个事物,所以我们还要在spring的配置文件中开启两个事物(前提是你使用的而是hibernate操作,他支持多事物操作。如果是mybatis只能用一个事物进行操作)
如此基本配置完成, 启动服务后,会在配置文件中添加事物,然后开启触发器,找到目标类,执行布标方法,数据开始传递。
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>
首先该触发器是只需要一个,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>
然后开始配置触发器中配置的属性: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); } } }
这个目标类中的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 ""; } }
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"/>
如此基本配置完成, 启动服务后,会在配置文件中添加事物,然后开启触发器,找到目标类,执行布标方法,数据开始传递。
相关文章推荐
- 蜂窝教育Java培训 让我跨过就业障碍
- springMVC 拦截器如何做登录检查及页面跳转
- Mybatis整合Spring
- JAVA基础之分布式对象
- JAVA高级特性-流与文件
- Java内部类详解
- Java NIO:浅析I/O模型
- java.io.IOException: Bad connect ack with firstBad
- eclipse导入hadoop示例源码on ubuntu14.04
- java根据Map的值删除HashMap中的对象元素
- Java应用中使用ShutdownHook友好地清理现场
- Java 程序性能优化《第一章》Java性能调优概述 1.2性能调优的层次
- spring通过配置文件创建bean
- java的poi技术读取和导入Excel
- springmvc框架搭建(maven)
- myeclipse 10 在mac中字体模糊问题解决方案
- Java新手之路——Day 04 数据类型转换
- javase-反射字段学习记录
- Java lucene小讲解
- javaSE(23)(反射)