-
springboot+redis 相信是不少中下企业进行项目开发必备的技术之一,用它做定时任务可谓是恰到好处,本文以一个简单的案例入手,讲述如何实现任务的获取和执行。
-
jedis工具类
@Log
@Component
public class JedisClient {
public static JedisPool jedisPool = null;
static {
if(jedisPool == null){
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(200);
config.setMaxIdle(50);
config.setMinIdle(8);//设置最小空闲数
config.setMaxWaitMillis(10000);
config.setTestOnBorrow(true);
config.setTestOnReturn(true);
//Idle时进行连接扫描
config.setTestWhileIdle(true);
//表示idle object evitor两次扫描之间要sleep的毫秒数
config.setTimeBetweenEvictionRunsMillis(30000);
//表示idle object evitor每次扫描的最多的对象数
config.setNumTestsPerEvictionRun(10);
//表示一个对象至少停留在idle状态的最短时间,然后才能被idle object evitor扫描并驱逐;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义
config.setMinEvictableIdleTimeMillis(60000);
jedisPool = new JedisPool(config, "127.0.0.1", 6379, 10000, "",2);
}
}
/**
* 获取Jedis实例
* @return
*/
public synchronized static Jedis getJedis() {
try{
if (jedisPool != null) {
Jedis resource = jedisPool.getResource();
return resource;
}
}catch(Exception e){
e.printStackTrace();
}
return null;
}
/**
* 释放jedis资源
* @param jedis
*/
public static void close(final Jedis jedis) {
if (jedis != null) {
jedis.close();
}
}
// 添加查询队列
public static boolean addEmsTraceInfoUploadToQue(JSONObject json) {
Jedis jedis =null;
try {
jedis = getJedis();
long r = 0;
r = jedis.rpush("one_que", json.toString());
if (r > 0) {
return true;
} else {
return false;
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
close(jedis);
}
return false;
}
/**
* 获取抓取任务
* @return
*/
public static JSONObject takeEmsTraceInfoUploadFromQue() {
Jedis jedis = null;
try {
jedis = getJedis();
String jsonList = jedis.lpop("one_que");
if (StringUtils.isNotBlank(jsonList)) {
return JSONObject.fromObject(jsonList);
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
close(jedis);
}
return null;
}
/**
* 添加 list的值 从左边添加 lpush
* @return
*/
public static boolean addDataToQueList(String key,String value) {
Jedis jedis = null;
try {
jedis = getJedis();
jedis.lpush(key,value); //key>=0从头到尾,key<0从尾到头
return true;
} catch (Exception ex) {
ex.printStackTrace();
} finally {
close(jedis);
}
return false;
}
/**
* 添加 hash的值
* @return
*/
public static boolean addDataToQueSet(String key,String field,String value) {
Jedis jedis = null;
try {
jedis = getJedis();
jedis.hset(key, field, value);
return true;
} catch (Exception ex) {
ex.printStackTrace();
} finally {
close(jedis);
}
return false;
}
/**
* 从左边获取 list 一个 值
* @return
*/
public static String takeOneDataFromQueLeftList(String key) {
Jedis jedis = null;
try {
jedis = getJedis();
String value = jedis.lindex(key, 0); //key>=0从头到尾,key<0从尾到头
return value;
} catch (Exception ex) {
ex.printStackTrace();
} finally {
close(jedis);
}
return null;
}
/**
* 获取 hash 一个 值
* @return
*/
public static String takeOneDataFromQueLeftSet(String key,String field) {
Jedis jedis = null;
try {
jedis = getJedis();
String hget = jedis.hget(key, field);
return hget;
} catch (Exception ex) {
ex.printStackTrace();
} finally {
close(jedis);
}
return null;
}
/**
* 获取 hash 所有 值
* @return
*/
public static Map<String, String> takeAllDataFromQueLeftSet(String key) {
Jedis jedis = null;
try {
jedis = getJedis();
Map<String, String> hgetAll = jedis.hgetAll(key);
return hgetAll;
} catch (Exception ex) {
ex.printStackTrace();
} finally {
close(jedis);
}
return null;
}
/**
* 获取 hash 的长度
* @return
*/
public static Long getLengthSet(String key) {
Jedis jedis = null;
try {
jedis = getJedis();
Long hlen = jedis.hlen(key);
return hlen;
} catch (Exception ex) {
ex.printStackTrace();
} finally {
close(jedis);
}
return null;
}
/**
* 获取 zset 的长度/数量
* @return
*/
public static Long getLengthZSet(String key) {
Jedis jedis = null;
try {
jedis = getJedis();
Long hlen = jedis.zcard(key);
return hlen;
} catch (Exception ex) {
ex.printStackTrace();
} finally {
close(jedis);
}
return null;
}
/**
* 添加 zset 成员
* @return
*/
public static boolean addZsetOneData(String key,Long score,String member) {
Jedis jedis = null;
try {
jedis = getJedis();
Long zrange = jedis.zadd(key, score, member);
return true;
} catch (Exception ex) {
ex.printStackTrace();
} finally {
close(jedis);
}
return false;
}
/**
* 删除 zset 成员
* @return
*/
public static boolean delZsetOneData(String key,double start,double end) {
Jedis jedis = null;
try {
jedis = getJedis();
jedis.zremrangeByScore(key, start, end);
return true;
} catch (Exception ex) {
ex.printStackTrace();
} finally {
close(jedis);
}
return false;
}
/**
* 获取zset 成员排名 从小到大
* @return
*/
public static Set<Tuple> getRangeZrangeWithScores(String key) {
Jedis jedis = null;
try {
jedis = getJedis();
Set<Tuple> zrange = jedis.zrangeWithScores(key, 0, -1);
return zrange;
} catch (Exception ex) {
ex.printStackTrace();
} finally {
close(jedis);
}
return null;
}
/**
* 从左边获取 list 所有 值
* @return
*/
public static List<String> takeAllDataFromQueList(String key) {
Jedis jedis = null;
try {
jedis = getJedis();
List<String> value = jedis.lrange(key, 0, -1); //key>=0从头到尾,key<0从尾到头
return value;
} catch (Exception ex) {
ex.printStackTrace();
} finally {
close(jedis);
}
return null;
}
/**
* 删除 list 值 从头到尾 删除一个 list的元素
* @return
*/
public static boolean delDataFromQueList(String key) {
Jedis jedis = null;
try {
jedis = getJedis();
jedis.lpop(key); //key>=0从头到尾,key<0从尾到头
return true;
} catch (Exception ex) {
ex.printStackTrace();
} finally {
close(jedis);
}
return false;
}
public static long getQueSize(String redisKey) {
Jedis jedis = getJedis();
long size = 0;
try {
size = jedis.llen(redisKey);
return size;
} catch (Exception ex) {
ex.printStackTrace();
return 0;
} finally {
close(jedis);
}
}
}
- 定时获取任务
@Log
@Component
public class TrackJob {
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private JedisClient jedisClient;
private static boolean isRunning = false;
@Scheduled(cron="*/23 * * * * ?") // 每秒钟启动 0 0 23 * * ? 0 */1 * * * ? 0 0 8 * * ?
public void trackMailedJob() {
Map<String, Object> queryForList = jdbcTemplate.queryForMap(
"select setting_value1,setting_value2,setting_value3 from d_setting where setting_key='t1'");
String settingValue1 = queryForList.get("setting_value1").toString();
if (settingValue1.equalsIgnoreCase("on")) {
if (isRunning) {
return;
}
isRunning = true;
try {
List<Map<String, Object>> queryForMap = jdbcTemplate
.queryForList("select id,bag_code from p_bag where cur_status between 10 and 16 and receive_time >= ? and receive_time<=? and cur_operate_time<=? order by id desc limit 50",
TimeUtil.dataStringToNumber(queryForList.get("setting_value2").toString()),TimeUtil.dataStringToNumber(queryForList.get("setting_value3").toString()),System.currentTimeMillis()-2*3600000l);
if (queryForMap.size() == 0) {
log.info("没有要爬取的任务===========");
isRunning = false;
return;
}
log.info("开始抓取要查询的数据");
for (Map<String, Object> map : queryForMap) {
long id = (long) map.get("id");
String bagCode = (String) map.get("bag_code");
JSONObject jsonObject = new JSONObject();
jsonObject.put("id", id);
jsonObject.put("bagCode", bagCode);
jedisClient.addEmsTraceInfoUploadToQue(jsonObject);
log.info("QCS获取任务:"+jsonObject);
}
isRunning = false;
} catch (Exception e) {
log.info(e.getLocalizedMessage());
}finally {
isRunning = false;
}
}
}
}
- 获取任务并执行
@Service
@Log
public class TrackBagServiceJob {
@Autowired
private QcsMailTrackService qcsMailTrackService;
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private JedisClient jedisClient;
@Scheduled(cron="*/47 * * * * ?") // 每秒钟启动 0 0 23 * * ? 0 */1 * * * ? 0 0 8 * * ?
public void handelBagCode(){
if (QcsMailTrackService.loginStatus == 0) {
List<Map<String,Object>> queryForList = jdbcTemplate.queryForList("select setting_value1,setting_value2 from d_setting where setting_key=?","track_username_password");
String username="";
String password="";
for (Map<String, Object> map : queryForList) {
username =(String) map.get("setting_value1");
password =(String) map.get("setting_value2");
}
try {
JSONObject login = qcsMailTrackService.login(username, password);
if (login.optString("status").equals("true")) {
try {
while (true) {
JSONObject takeEmsTraceInfoUploadFromQue = jedisClient.takeEmsTraceInfoUploadFromQue();
long id = takeEmsTraceInfoUploadFromQue.optLong("id");
String bagCode = takeEmsTraceInfoUploadFromQue.optString("bagCode");
if (bagCode != null) {
beginTrack(id, bagCode);
}
}
} catch (Exception e) {
log.info("爬取数据出错"+e.getLocalizedMessage());
}
}else {
QcsMailTrackService.loginStatus=0;
Thread.sleep(60000);
log.info("登录失败,自动重试中,错误信息:"+login.optString("error"));
}
} catch (Exception e) {
log.info("访问QCS失败"+e.getLocalizedMessage());
}
}else {
while (true) {
JSONObject takeEmsTraceInfoUploadFromQue = jedisClient.takeEmsTraceInfoUploadFromQue();
long id = takeEmsTraceInfoUploadFromQue.optLong("id");
String bagCode = takeEmsTraceInfoUploadFromQue.optString("bagCode");
if (bagCode != null) {
beginTrack(id, bagCode);
}
}
}
}
private void beginTrack(Long id, String bagCode){
try {
JSONObject queryBag = qcsMailTrackService.queryBag(bagCode);
jdbcTemplate.execute("update p_bag set cur_operate_time="+System.currentTimeMillis()+" where id="+id);
if (queryBag.optString("error").contains("moved")) {
QcsMailTrackService.loginStatus=0;
Thread.sleep(60000);
}else {
String sentedTime="";
String mailedTime="";
if (StringUtils.isNotBlank(queryBag.optString("sentedTime")) ) {
sentedTime = queryBag.optString("sentedTime");
}else{
sentedTime="";
}
if (StringUtils.isNotBlank(queryBag.optString("mailedTime")) ) {
mailedTime = queryBag.optString("mailedTime");
}else {
mailedTime="";
}
if(StringUtils.isNotBlank(sentedTime)) {
jdbcTemplate.execute("update p_bag set dispatch_time="+TimeUtil.dataStringToNumber(sentedTime)+" where id="+id);
}
if(StringUtils.isNotBlank(mailedTime)) {
jdbcTemplate.execute("update p_bag set mailed_time="+TimeUtil.dataStringToNumber(mailedTime)+" where id="+id);
}
if (StringUtils.isNotBlank(sentedTime) && StringUtils.isNotBlank(mailedTime) ) {
long dataStringToNumber1 = TimeUtil.dataStringToNumber(sentedTime);
long dataStringToNumber2 = TimeUtil.dataStringToNumber(mailedTime);
int i = TimeUtil.differentDaysByMillisecond(dataStringToNumber1,dataStringToNumber2);
jdbcTemplate.execute("update p_bag set total_time="+i+", cur_status=17 where id="+id);
}
}
} catch (Exception e) {
e.printStackTrace();
log.info("保存数据出错啦"+e.getLocalizedMessage());
}
}
}