您的位置:首页 > 编程语言 > Java开发

spring自带定时任务概要

2015-12-03 00:00 501 查看
摘要: spring自带定时任务概要

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"/>

如此基本配置完成, 启动服务后,会在配置文件中添加事物,然后开启触发器,找到目标类,执行布标方法,数据开始传递。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  orcl定时任务