IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> SSM框架中使用@Scheduled定时器,只想执行一次 -> 正文阅读

[大数据]SSM框架中使用@Scheduled定时器,只想执行一次


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

@Service
public class RedisUtil {

	@Autowired
	RedisTemplate redisTemplate;

	public <T> T getObject(String key, Class<T> clazz) {
		Object valueObj = redisTemplate.opsForValue().get(key);
		if (valueObj == null) {
			return null;
		}
		if (clazz.isInstance(valueObj)) {
			return (T) valueObj;
		} else if (clazz == Long.class && valueObj instanceof Integer) {
			Integer obj = (Integer) valueObj;
			return (T) Long.valueOf(obj.longValue());
		}
		return null;
	}

	public void setObject(String key, Object value, Long second) {
		redisTemplate.opsForValue().set(key, value, second, TimeUnit.SECONDS);
	}

	public void setObjectForever(String key, Object value) {
		redisTemplate.opsForValue().set(key, value);
	}

	public Long increment(String key, Long second) {
		Long value = redisTemplate.opsForValue().increment(key);
		redisTemplate.expire(key, second, TimeUnit.SECONDS);
		return value;
	}

	public void decrement(String key) {
		redisTemplate.opsForValue().decrement(key);
	}


	public boolean setIfAbsent(String key, Long second) {
		return redisTemplate.opsForValue().setIfAbsent(key, "1", second, TimeUnit.SECONDS);
	}
}


import cn.hutool.core.date.DateUtil;

import com.easy.hotel.pms.service.impl.RedisUtil;
import lombok.AllArgsConstructor;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Date;
 
 
@Component
@AllArgsConstructor
public class RedisGeoCommunityRunner {


	private final RedisUtil redisUtil;

	private static String redisGeoCommunityCount = "REDIS_GEO_COMMUNITY_COUNT";


	/*
		@Scheduled是设计来定期执行操作的,不是只执行一次。
		ps.定时器是跑在服务端的任务调度,为什么会和客户端的请求联系起来呢?你的描述是不是有些问题
		如果只想执行一次,
		1.粗暴的方式是在这个scheduler里设置标识位,代码进行判断,执行过了就直接返回了
		2.cron表达式具体到时间,如0 0 21 18 8 ? 2020,这种方式的肯定只执行一次
		3.如果是项目启动时需要做一些操作,web.xml里可以配置应用启、停的监听
		4.如果是bean组件实例化后进行一次性操作,@PostConstruct注解可以满足
		5.如果想项目启动x秒后,进行一次性操作,quartz有SimpleTrigger接口,可以配置repeatCount=1
	 */
	@Scheduled(cron = "*/5 * * * * ?")//每隔5秒执行一次
	public void totalIndex() {
		try {
			System.out.println(com.easy.hotel.pms.util.DateUtil.toDateTimeStr(DateUtil.toLocalDateTime(new Date())) );
			Integer count = redisUtil.getObject(redisGeoCommunityCount, Integer.class);
			if(count == null){
				redisUtil.setObjectForever(redisGeoCommunityCount,1);
				count = redisUtil.getObject(redisGeoCommunityCount, Integer.class);
			}
			if(count > 1){
				return ;
			}else{
				redisUtil.setObjectForever(redisGeoCommunityCount,2);
			}

			execteOnlyOnce( );


		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private void execteOnlyOnce( ) {
		System.out.println("只执行一次");

	}
}

?

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-04-28 11:56:15  更:2022-04-28 11:58:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:53:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码