一般系统都会有定时任务存在,比如订单系统,会根据定时任务来实时同步订单状态,同步交易状态等等。定时任务可以使用Quartz 定时任务,也可以自己写一个任务调度系统,只要能实现功能就可以。
下面我简单介绍一下Quartz 定时任务配置,需要配置三个bean,分别为:quartz,trigger,scheduler:
quartz:配置目标bean和方法
trigger:触发器,配置quartz和cron表达式,指定触发时机
scheduler:将触发器配置到任务调度中
<!-- ****work start*********** -->
<bean id="updateAccessTokenQuartz" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><!--配置quartz-->
<property name="targetObject" ref="accessTokenService" /><!--目标类,配置bean-->
<property name="targetMethod" value="updateAccessToken" /><!--目标方法-->
<property name="concurrent" value="false" />
</bean>
<bean id="updateAccessTokenTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"><!--配置触发器-->
<property name="jobDetail" ref="updateAccessTokenQuartz" /><!--连接quartz对象-->
<!--cron表达式-->
<property name="cronExpression" value="0 0 0/1 * * ?" />
</bean>
<bean id="updateAccessTokenScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><!--配置-Scheduler->
<property name="triggers">
<list>
<ref bean="updateAccessTokenTrigger" /><!--连接trigger-->
</list>
</property>
<property name="autoStartup">
<value>false</value>
</property>
<property name="quartzProperties">
<props>
<prop key="org.quartz.threadPool.threadCount">1</prop>
</props>
</property>
</bean>
代码:
public static final String WX_ACCESS_TOKEN = "https://api.weixin.qq.com/cgi-bin/token?grant_type=Grant&appid=AppId&secret=AppSecret";
//service 代码
package com.demo.mobile.service.impl;
import org.springframework.util.StringUtils;
import com.alibaba.fastjson.JSON;
import com.demo.mobile.constant.Constant;
import com.demo.mobile.service.WxAccessokenService;
import com.demo.mobile.util.SSLClient;
import com.demo.mobile.platform.common.bean.BaseService;
importcom.demo.mobile.platform.common.cache.RedisCache ;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.util.StreamUtils;
import javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.Map;
/**
* @description: 获取token
* @author: feng
* @create: 2018
**/
@Service
public class WxAccessTokenServicempl extends BaseService implements WxAccessTokenService {
@Resource
private RedisCache redisCache;
@Override
public String getAccessToken() {
String s = redisCache.get(Constant.KEY);
logger.info("WxAccessokenServicempl-getAccessToken:{}", s);
if (StringUtils.isEmpty(s)) {
updateAccessToken();
s = redisCache.get(Constant.KEY);
logger.info("WxAccessokenServicempl-updateAccessToken-result:{}", s);
}
return s;
}
@Override
public void setAccessToken(String token) {
redisCache.set(Constant.KEY, token);
}
@Override
public Boolean deleteAccessToken() {
return redisCache.delete(Constant.KEY) > 0L;
}
public Boolean updateAccessToken() {
SSLClient client = null;
String url = Constant.WX_ACCESS_TOKEN.replace("Grant", Constant.GRANT).replace("AppId", Constant.WX_APPID).replace("AppSecret", Constant.WX_APPSECRET);
HttpGet get = new HttpGet(url);
logger.info("WxTokenWorkerImpl-url:{}", url);
HttpResponse execute = null;
try {
client = new SSLClient();
execute = client.execute(get);
//logger.info("updateAccessToken:{}",JSON.toJSONString(execute));
if (execute.getStatusLine().getStatusCode() == HttpStatus.OK.value()) {
HttpEntity entity = execute.getEntity();
InputStream content = entity.getContent();
String s = StreamUtils.copyToString(content, Charset.forName("UTF-8"));
Map map = JSON.parseObject(s, Map.class);
logger.info("updateAccessToken-map:{}", JSON.toJSONString(map));
String access_token = (String) map.get("access_token");
logger.info("updateAccessToken-access_token:{}", JSON.toJSONString(access_token));
if (StringUtils.isEmpty(access_token)) {
return false;
}
redisCache.delete("access_token");
redisCache.set("access_token", access_token);
return true;
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
}
bean配置:
<bean id="accessTokenService" class="com.demo.mobile.service.impl.WxAccessTokenService"></bean>