精华内容
下载资源
问答
  • 定时任务不触发立即执行,等待下次Cron触发频率到达时刻开始按照Cron频率依次执行 扩展: scheduleBuilder.withMisfireHandlingInstructionDoNothing(); 不触发立即执行,等待下次Cron触发频率到达时刻开始按照...

    scheduleBuilder.withMisfireHandlingInstructionDoNothing();

    定时任务不触发立即执行,等待下次Cron触发频率到达时刻开始按照Cron频率依次执行

    扩展:

    scheduleBuilder.withMisfireHandlingInstructionDoNothing();
    不触发立即执行,等待下次Cron触发频率到达时刻开始按照Cron频率依次执行
    
    scheduleBuilder.withMisfireHandlingInstructionFireAndProceed();
    以当前时间为触发频率立刻触发一次执行,然后按照Cron频率依次执行
    
    scheduleBuilder.withMisfireHandlingInstructionIgnoreMisfires();
    以错过的第一个频率时间立刻开始执行,重做错过的所有频率周期后,当下一次触发频率发生时间大于当前时间后,再按照正常的Cron频率依次执行
    
    示例:
    val trigger = newTrigger().
     withSchedule(
      cronSchedule("0 0 9-17 ? * MON-FRI").
       withMisfireHandlingInstructionFireAndProceed()  //or other
     ).
     build()

    In this example the trigger should fire every hour between 9 AM and 5 PM, from Monday to Friday. But once again first two invocations were missed (so the trigger misfired) and this situation was discovered at 10:15 AM. Note that available misfire instructions are different compared to simple triggers:

    InstructionMeaning
    smart policy - defaultSee: withMisfireHandlingInstructionFireAndProceed
    withMisfireHandlingInstructionIgnoreMisfires
    MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY
    All misfired executions are immediately executed, then the trigger runs back on schedule.
    Example scenario: the executions scheduled at 9 and 10 AM are executed immediately. The next scheduled execution (at 11 AM) runs on time.
    withMisfireHandlingInstructionFireAndProceed
    MISFIRE_INSTRUCTION_FIRE_ONCE_NOW
    Immediately executes first misfired execution and discards other (i.e. all misfired executions are merged together). Then back to schedule. No matter how many trigger executions were missed, only single immediate execution is performed.
    Example scenario: the executions scheduled at 9 and 10 AM are merged and executed only once (in other words: the execution scheduled at 10 AM is discarded). The next scheduled execution (at 11 AM) runs on time.
    withMisfireHandlingInstructionDoNothing
    MISFIRE_INSTRUCTION_DO_NOTHING
    All misfired executions are discarded, the scheduler simply waits for next scheduled time.
    Example scenario: the executions scheduled at 9 and 10 AM are discarded, so basically nothing happens. The next scheduled execution (at 11 AM) runs on time.

    代码如下:

    public void addJob(TaskConfBO bo) throws Exception {
    	//获去调度器实例
    	Scheduler scheduler = schedulerFactoryBean.getScheduler();
    
    	//新增定时任务
    	// 构建job信息
    	JobDetail jobDetail = JobBuilder.newJob(DataAnalysisJob.class)
    			.withIdentity(bo.getId(), bo.getOrgId()).build();
    	JobDataMap jobDataMap = jobDetail.getJobDataMap();
    	jobDataMap.put("id", bo.getId());
    	// 表达式调度构建器(即任务执行的时间)
    	CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(bo.getCron());
    	
        //定时任务不触发立即执行,等待下次Cron触发频率到达时刻开始按照Cron频率依次执行
    	scheduleBuilder.withMisfireHandlingInstructionDoNothing();
    
    	// 按新的cronExpression表达式构建一个新的trigger
    	TriggerBuilder<CronTrigger> triggerBuilder =TriggerBuilder.newTrigger().withIdentity(bo.getId(), bo.getOrgId())
    			.withSchedule(scheduleBuilder);
    	// 默认立即执行
    	if (bo.getStartTime() != null) {
    		// 指定时间执行
    		triggerBuilder.startAt(bo.getStartTime());
    	}
    	if (bo.getEndTime() != null) {
    		// 指定时间结束
    		triggerBuilder.endAt(bo.getEndTime());
    	}
    
    	CronTrigger trigger = triggerBuilder.build();
    
    	//设置job执行
    	scheduler.scheduleJob(jobDetail, trigger);
    }

    展开全文
  • 定时任务执行一次的cron表达式

    万次阅读 2019-06-27 10:48:04
    执行一次定时任务 红色框里面的为cron表达式,从左往右分别为秒/分/时/日/月/年 具体是那一天执行一次就不用加(?)问号了,没有必要。 cron表达式这样写就可以了,只会执行一次,然后就不会再执行了。 ...

    只执行一次的定时任务

    在这里插入图片描述
    红色框里面的为cron表达式,从左往右分别为秒/分/时/日/月/年
    cron表达式这样写就可以了,只会执行一次,然后就不会再执行了。

    展开全文
  • springboot使用定时任务,根据cron表达式执行定时任务,比如设置了每小时执行一次,但是不会立即执行一次。 解决方式: 增加@PostConstruct注解,如下: 启动服务可以立即执行一次。 ...

    springboot使用定时任务,根据cron表达式执行定时任务,比如设置了每小时执行一次,但是不会立即执行一次。

    解决方式:

    增加@PostConstruct注解,如下:

    启动服务可以立即执行一次。

     

     

     

    展开全文
  • 订单支付成功时立即执行一次同步任务,如果失败,则没半小时执行一次同步任务,直至同步成功。 问题: spring定时任务定为半小时,订单成功支付时,无法立即执行任务,只能等0-30分钟后执行同步任务,所以需要做一...

    业务场景:

    订单支付成功时,订单信息需要给银行系统同步,由于不能保证银行返回信息的时间,所以使用队列进行同步,并且用spring的定时任务执行。

    需求:

    订单支付成功时立即执行一次同步任务,如果失败,则没半小时执行一次同步任务,直至同步成功。

    问题:

    spring定时任务定为半小时,订单成功支付时,无法立即执行任务,只能等0-30分钟后执行同步任务,所以需要做一个功能,在订单支付成功的时候,调用一次同步任务。

    解决方案:

    在服务启动时,初始化一个A线程,该线程每隔N秒扫描一次任务集合,集合中存放着某个任务,扫描到就执行任务。然后在订单支付成功时,在将订单放入队列后,接着将订单放入任务集合,由A线程扫描并执行。


    支付成功后代码:

    BizLogger.info("订单支付成功!!!");
    Singleton.put(SpdbRateTask.class);

    Singleton:

    import java.util.concurrent.ConcurrentHashMap;
    
    public class Singleton {
    	private static ConcurrentHashMap<String,Class> map = new ConcurrentHashMap<String,Class>();
    	public static ConcurrentHashMap<String,Class> getMap(){
    		return map;
    	}
    	
    	public static void put(Class clazz){
    		map.put(clazz.getCanonicalName(), clazz);
    	}
    }

    初始化线程任务:

    import java.util.Iterator;
    import java.util.Map;
    import java.util.Timer;
    import java.util.TimerTask;
    import java.util.concurrent.ConcurrentHashMap;
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    import org.springframework.web.context.support.WebApplicationContextUtils;
    import com.jniu.app.task.ExcutTask;
    import com.jniu.app.util.Singleton;
    import com.jniu.bas.context.Context;
    import com.jniu.bas.log4j.logger.BizLogger;
    
    public class ProjectInit implements ServletContextListener {
    	private ConcurrentHashMap<String, Class> map = Singleton.getMap();
    
    	/**
    	 * 初始化学校缓存
    	 */
    	@Override
    	public void contextInitialized(final ServletContextEvent sce) {
    		// 初始化当前上下文
            Context ctx = Context.createContext("currentContext", null);
            Context.pushCurrentContext(ctx);
    		TimerTask task = new TimerTask() {
    			@Override
    			public void run() {
    				Iterator<Map.Entry<String, Class>> it = map.entrySet().iterator();
    				ExcutTask t = null;
    				try {
    					Thread.sleep(3000);//任务不多,且不是很频繁,队列使用的是redis的list,为了防止定时任务执行时redis中还没有数据,这里延迟三秒
    					while (it.hasNext()) {
    						Map.Entry<String, Class> entry = it.next();
    						BizLogger.info("项目任务"+entry.getValue().getCanonicalName()+"执行开始");
    						t = ((ExcutTask) WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext()).getBean(entry.getValue()));
    						t.a();
    						BizLogger.info("项目任务"+t.getClass().getCanonicalName()+"执行完成");
    						it.remove();
    					}
    				} catch (Exception e) {
    					e.printStackTrace();
    					BizLogger.info("项目任务"+t.getClass().getCanonicalName()+"执行失败");
    				}
    			}
    		};
    		Timer timer = new Timer();
    		long delay = 0;
    		long intevalPeriod = 10 * 1000;//每十秒检查一遍任务集合
    		timer.scheduleAtFixedRate(task, delay, intevalPeriod);
    	}
    
    	/**
    	 * 销毁工作
    	 */
    	@Override
    	public void contextDestroyed(ServletContextEvent sce) {
    		// TODO Auto-generated method stub
    	}
    }

    spring定时任务:

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.stereotype.Service;
    import com.jniu.app.constans.Constans;
    import com.jniu.app.service.SpdbOrderService;
    import com.jniu.bas.log4j.logger.BizLogger;
    import com.jniu.bas.result.ResultBean;
    
    @Service
    public class SpdbRateTask implements ExcutTask{
    	@Autowired
    	RedisTemplate<String, Object> redisTemplate;
    	@Autowired
    	SpdbOrderService spdbOrderService;
    	
    	public void a(){
    		String t = null;
    		ResultBean resultBean = null;
    		try {
    			long size = redisTemplate.opsForList().size(Constans.SPDB_RATE_QUEUE);
    			if(size>0){
    				for(int i=0;i<size;i++){
    					t = (String)redisTemplate.opsForList().rightPop(Constans.SPDB_RATE_QUEUE);
    					if(t!=null){
    						resultBean = spdbOrderService.transDetailObtain(t);
    						if(!resultBean.isSuccess()){
    							redisTemplate.opsForList().leftPush(Constans.SPDB_RATE_QUEUE, t);
    						}
    					}
    				}
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    			if(t!=null)
    				redisTemplate.opsForList().leftPush(Constans.SPDB_RATE_QUEUE, t);
    			BizLogger.info(resultBean.getMessage());
    		}
    	}
    
    	@Override
    	public String toString() {
    		return "SpdbRateTask-----name";
    	}
    }





    展开全文
  • linux crontab 命令,最小的执行时间是一分钟。这篇文章主要介绍了linux定时任务crontab 实现每秒执行一次的方法,需要的朋友可以参考下
  • 步package com.eh.util;import java.util.Calendar; import java.util.Date;... * java定时任务,每天定时执行任务 * @author wls * */ public class TimerManager { //时间间隔 private static
  • 现在有个项目需求,需要定时任务,在项目启动的时候就执行一次 只需要加个如下红色注释即可 @PostConstruct @Scheduled(cron = "0 30 7 * * ?")
  • @Scheduled(cron = "0 */30 * * * ?") //每30分钟执行一次 @PostConstruct //启动项目先执行 public void scheduled() { .... } 推荐阅读 开启定时任务,cron表达式的写法
  • Spring 的@Scheduled定时任务,按照Spring定时任务配置 的配置方法,结果每次定时任务都是执行了两,很尴尬 @Scheduled(cron = "*/20 * * * * ?") public void process(){ logger.info("hello world"); } 二...
  • 原因是 再定时任务的类中 还有@Component 注解,删掉@Component 注解即可
  • 在SpringBoot2.x 的项目上写了个定时任务,每天凌晨1点执行,那么令人费解的是:定时任务在服务器上总是执行两次,这个bug就闹大了,但是在本机调试始终只执行一次,查了很多原因都说是实例化bean两次的问题,但是看...
  • 直接上代码,调用run方法,传入定时任务执行时间,到时间自动执行 import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling....
  • JAVA定时执行任务,每天定时几点钟执行任务 转自:https://www.cnblogs.com/longshiyVip/p/4546123.html JAVA定时执行任务,每天定时几点钟执行任务的示例如下: 1.建立TimerManage类,设置时间点,时间点设置的管理...
  • 个tomcat下部署了两个应用,个是普通web应用syncc,另个应用syncc_wx属于微信公众号后台程序涉及消息定时推送,tomcat未分离...”spring定时任务执行的异常排查处理.docx"针对上述描述问题进行分析和解决。
  • java定时任务,每天定时执行任务

    千次阅读 2017-10-20 00:33:56
    java定时任务,每天定时执行任务
  • JAVA定时执行任务,每天定时几点钟执行任务的示例如下: 1.建立TimerManage类,设置时间点,时间点设置的管理类,代码如下: package com.pcitc.time; import java.util.Calendar; import java.util.Date; import ...
  • 先说我的项目吧,定时任务主要是按时提醒客户端该发数据了,但是在实际运行中,我发现定时任务指定的Job总是被多次执行,而且不是固定的次数,是逐步增加的。 郁闷了好久啊,找不到方法,今天突然灵光乍现!因为我...
  • quartz 定时任务,项目启动立即执行

    万次阅读 2019-04-29 16:33:39
    需求:某个定时任务在不需要手动触发,项目启动立即执行。(配置式) quartz-config.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" ...
  • 防止 crontab 定时任务重复执行

    千次阅读 2020-05-20 19:50:39
    一个脚本执行需要 1 小时,使用 crontab 每隔2小时执行一次,一般情况下下次执行脚本时上次脚本执行肯定是跑完了的;但是,假如,程序卡住了呢?下次执行时上次脚本还在,会咋样?会再启动一个脚本,这时候就有两个...
  • @schedule 注解是springboot 常用的定时任务注解,使用起来简单方便,但是如果定时任务非常多,或者有的任务很耗时,会影响到其他定时任务执行,因为schedule 默认是单线程的,个任务在执行时,其他任务是不能执行的....
  • 公司项目原先采用springmvc自带定时任务,新增定时任务时麻烦存在重复性工作而且不灵活没有页面展示。 废话不说,开干,定时任务数据配置存储在数据库 pom.xml //加入Quartz依赖 <dependency> <...
  • 开门见山:  定时任务执行了两,你的web.xml可能加载了两spring.xml配置文件    
  • java定时任务 每天定时执行任务

    千次阅读 2015-04-23 19:38:02
    转载网址:http://www.open-open.com/lib/view/open1338175095183.html ... java定时任务,每天定时执行任务。以下是这个例子的全部代码。 ? 1 2
  • getData();//先调用一次 datasInterval && clearInterval(datasInterval);//判断定时器是否存在,若存在关掉 datasInterval = setInterval(getData, 30000);//启动定时器,30s一次
  • 定时任务设置与执行

    2019-09-18 10:49:16
    定时任务设置与执行 首先所谓的定时任务就是在指定的时间执行你需要操作的代码 也就是不需要你手动地去执行只要定好任务内容触发启动条件 他就会自动地按照规定的时间去完成任务内容一次或多次 下面我就先讲一下怎么...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 58,027
精华内容 23,210
关键字:

定时任务立即执行一次