JAVA经典案例SpringBoot集成Redis做定时任务

  • 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());
		}
	
	}
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃早餐的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值