首先配置spring-context.xml文件

在xmlns 下加如下代码

xmlns:task="http://www.springframework.org/schema/task"

在xsi:schemaLocation里添加如下代码

http://www.springframework.org/schema/task 
http://www.springframework.org/schema/task/spring-task-3.1.xsd

还有任务扫描

<task:annotation-driven />

以上配置完成,新建java类写定时任务

package com.test.job;

import java.util.Date;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import lombok.extern.log4j.Log4j2; /**
* 定时任务测试
* @author ljl
*
*/
@Log4j2
@Component
public class TestJob { @Scheduled(cron = "0 */5 * * * ?")
public void test1() {
log.info("每5分钟执行一次"+ new Date());
} @Scheduled(cron = "0 0 12 * * ?")
private void test2() {
log.info("每天中午12点执行"+ new Date());
} }

以上定时任务完成。

思考:如果多台服务器部署同一个项目,就会出现一个定时任务多次执行的问题,如何解决?

网上找了以下四种方法,可以作为参考。

1、设置执行定时任务的机器名,在代码中判断,只让某一台机器执行。

2、如果有可能,将定时任务独立出来,成为一个单独的项目工程,单一部署。

3、将任务的定时触发模块、任务的执行模块分离。任务的定时触发模块每台机器都允许触发任务,但是任务的执行模块,只要收到一个执行任务,那么下一个执行任务就被忽略掉。任务开始执行设置running = true,任务执行完毕设置running = false,当running

为ture时候,下一个任务不允许执行。需要注意的是,一定要在finally中加上running = false,要不然任务异常的话,下一次任务永远不会再执行了。
4、在数据库建一个表:timerT,表里面有三个字段:status(表当前定时器是否处于可运行状态)、timestamp(时间戳)、serverIP(正在运行定时器的服务器IP)。当两台服务器,都运行起来后,服务器A开始执行定时器,这时,A会去读取表timerT的status字段,当为0时,则执行定时器的业务逻辑,此时A定时器,需要把status改为1,以便让另一台服务器的定时器B不去执行业务逻辑并把当前服务器的IP记录到表中,同时修改启动一个新的线程,在XXX长的时间间隔内不断去修改timestamp的值,当A执行完业务逻辑时,就把status的值改为0,这样B定时器就可以执行。这样做可以解决一个问题,就是:当其中一个定时器A挂掉后,我们另一个定时器B,可以比对timestap的值与当前时间是否超过XXX时长,如果超过,则证明定时器A已经挂掉,这时B就会把status的值改成1,把serverIP改成B定时器所在的服务器IP,并执行业务逻辑。

java项目定时任务实现的更多相关文章

  1. GitHub Java项目推荐|功能丰富的 Java 工具包|提高开发效率

    GitHub Java项目推荐|功能丰富的 Java 工具包|提高开发效率 功能丰富的 Java 工具包.它帮助我们实现了常用的工具方法,从而减少代码的体积,提高开发效率.该项目最初是作者工作项目中的 ...

  2. 353 stars Java项目!Java小白必看!austin介绍 【第一话】

    有好几个群友问我为什么最近更新变慢了.工作忙是一方面,另一方面是我更新文章的动力确实下降了.近大半年一直在更新的<对线面试官>系列,到现在已经40篇了. 说实话,当时我更新该系列有很大一部 ...

  3. eclipse — 导入android项目后识别成java项目的问题及解决

    最近在eclipse导入android项目的时候遇到了奇葩问题,再此记录 遇到的问题就是:将完好的android项目导入到eclipse的时候,原本这是一个很容易的事情,但是导入成功后发现,,,靠ec ...

  4. owner:轻松管理java项目配置

    前段时间,一同事说在 github 上“活捉了”一个很有趣的开源项目,它是一个超轻量级的 jar 包,能够帮助你在 java 项目中摒弃样板式的 properties 配置代码,让你轻松自如地管理和使 ...

  5. Scala:Java 项目中混入scala代码

    Spark 是用Scala代码写的.为了调试Spark,做了如下尝试. 1.Eclipse下:Java 项目 ,Using Maven,编写了一个java 版Spark应用. Spark的代码(sca ...

  6. 将 java 项目打包成可运行的 jar 包(main 函数带参数),并上传到 linux 服务器上运行

    一.概述 java项目有两种架构,一种是 B/S 架构的,一种是 C/S 架构的. 对于 B/S 架构来说,我们常见的 java ee 即是 B/S 架构,通常,开发人员会在本地进行开发,然后将项目打 ...

  7. Java开发程序,使用编辑器编写创建Java项目、类

    打开Eclipse 出现界面 工作空间的路径可以选择一个大空间的磁盘存放,点击确定: 创建:程序左上角-文件-新建-JAVA项目 输入项目名(项目名不能为中文),点击完成: 在   包资源管理器中点击 ...

  8. Java开发环境的搭建以及使用eclipse从头一步步创建java项目

    一.java 开发环境的搭建 这里主要说的是在windows 环境下怎么配置环境. 1.首先安装JDK java的sdk简称JDK ,去其官方网站下载最近的JDK即可..http://www.orac ...

  9. eclipse java项目中明明引入了jar包 为什么项目启动的时候不能找到jar包 项目中已经 引入了 com.branchitech.app 包 ,但时tomcat启动的时候还是报错? java.lang.ClassNotFoundException: com.branchitech.app.startup.AppStartupContextListener java.lang.ClassN

    eclipse java项目中明明引入了jar包 为什么项目启动的时候不能找到jar包 项目中已经 引入了 com.branchitech.app 包 ,但时tomcat启动的时候还是报错?java. ...

随机推荐

  1. alter table *** add constraint *** 用法---约束

    1.主键约束:要对一个列加主键约束的话,这列就必须要满足的条件就是分空因为主键约束:就是对一个列进行了约束,约束为(非空.不重复)以下是代码   要对一个列加主键,列名为id,表名为emp 格式为:a ...

  2. VijosP1112:小胖的奇偶

    描述 huyichen和xuzhenyi在玩一个游戏:他写一个由0和1组成的序列. huyichen选其中的一段(比如第3位到第5位),问他这段里面有奇数个1还是偶数个1.xuzhenyi回答你的问题 ...

  3. python list列表sort、sorted、reverse排序

    列表排序:sort是修改原列表,sorted提供原列表的一个有序副本 li=[2,1,4,5,0]li.sort() #默认从小到大print li结果:[0, 1, 2, 4, 5] li=[2,1 ...

  4. PCL推荐的命名规范(1)

    博客转载自:http://www.pclcn.org/study/shownews.php?lang=cn&id=209 文件命名 所有的文件名单词之间应该用下划线隔开,例 如unordere ...

  5. submatrix

    given a 2-d matrix with 0 or 1 values largest square of all 1's dynamic programming, dp[i][j] = 1 + ...

  6. Adding In-App Purchase to your iOS and OS X Applications

    Adding In-App Purchase to your iOS and OS X Applications In-App Purchase allows you to sell addition ...

  7. iOS内购流程二(添加产品、沙盒账号以及上架流程)

    注意:使用了IAP的App必须先配置好协议.税务和银行业务 一.创建一个App应用 1.登录iTunes Store,点击我的App 2.新建一个App(如果App已经创建,直接点击App进入就行了) ...

  8. poj3186(区间dp)

    题目链接:http://poj.org/problem?id=3186 题意:给一行n个数,每次可以取出行首或者行末的数,如果第ai是第i次取出的,可以得到ai*i的收益,求最大的总收益: 思路:区间 ...

  9. loj #6079. 「2017 山东一轮集训 Day7」养猫【最大费用最大流】

    首先假设全睡觉,然后用费用流考虑平衡要求建立网络流 把1~n的点看作是i-k+1~k这一段的和,连接(i,i+k,1,e[i]-s[i]),表示把i改成吃饭,能对i~i+k-1这一段的点产生影响:然后 ...

  10. 剑指Offer的学习笔记(C#篇)-- 用两个栈实现队列

    题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 一 . 概念! 首先要理解栈和队列的概念. 1. 栈:咱可以简单的把栈理解成装羽毛球的球桶.或者我们吃的 ...