当前位置: 首页 > news >正文

网站搭建教程视频wordpress社交模板

网站搭建教程视频,wordpress社交模板,网站建设实训的意义,郑州关键词排名外包今天来说一个Java多机部署下定时任务的处理方案。 需求: 有两台服务器同时部署了同一套代码#xff0c; 代码中写有spring自带的定时任务#xff0c;但是每次执行定时任务时只需要一台机器去执行。 当拿到这个需求时我脑子中立马出现了两个简单的解决方案#xff1a; 利用ip…今天来说一个Java多机部署下定时任务的处理方案。 需求: 有两台服务器同时部署了同一套代码 代码中写有spring自带的定时任务但是每次执行定时任务时只需要一台机器去执行。 当拿到这个需求时我脑子中立马出现了两个简单的解决方案 利用ip进行判断 两台机器ip肯定不一样 指定某一台机器的ip运行。只在一台机器上部署定时任务的代码。最后两个方案又都被自己否决了。 第一条如果指定ip的机器出现了问题怎么办 例如说宕机了 那么该制定ip的机器上的定时任务是不是就无法运行了如果以后该服务器迁移导致ip变化怎么办第二条 同上 还有就是要维护两套代码很不方便。 因为上面两个假设都不成立 只能另找他法。 于是便想到利用mysql去解决 之前了解过一点mysql的锁机制 知道如果有同时的两个任务去写数据库中同一条记录 只有一条会成功 这是利用了mysql的排他锁。 下面就开始代码演示 这里主要想给大家的是一个思路的提示 代码还是很简单的。 首先需要单独创建一张表 CREATE TABLE t_schedule_cluster ( id bigint(20) NOT NULL AUTO_INCREMENT COMMENT cname:主键, execute int(1) NOT NULL COMMENT cname:执行状态, version int(11) NOT NULL COMMENT cname:版本号\r\n , task_name varchar(128) NOT NULL COMMENT cname:任务名称\r\n , execute_ip varchar(32) DEFAULT NULL COMMENT cname:执行ip\r\n , update_time datetime DEFAULT NULL COMMENT cname:修改时间\r\n , PRIMARY KEY (id), KEY Index_series_id (execute) ) ENGINEInnoDB AUTO_INCREMENT8 DEFAULT CHARSETutf8 COMMENTcname:多机定时任务调度; 看一下建成后的表结构 注释写的已经很清楚了 初始化时需要添加一些定时任务的名称task_name 这个要和你代码中保持一致 后面会提到 代码首先看下我代码中用到的spring定时任务代码首先看下我代码中用到的spring定时任务 ?xml version1.0 encodingUTF-8? beans xmlns xmlns:xsixmlns:taskxsi:schemaLocationdefault-lazy-inittrue description使用Spring的 Scheduled的定时任务配置/description !--支持annotation的方式-- task:annotation-driven / task:scheduler idspringScheduler pool-size10/ task:scheduled-tasks schedulerspringScheduler!-- 测试使用 项目启动后每隔一分钟执行一次 --task:scheduled reflistCarAction methodlistCar cron0 0/1 0 * * ?/task:scheduled reflistCarAction methodlistCar cron0 0/1 0 * * ?/ /task:scheduled-tasks /beans 相信大家都是用过这种定时任务的设置方法 因为它是spring自带的 所以使用起来很方便 这里我指定了两个定时任务来模拟两台机器的情况 两个定时任务都是项目启动后每隔一分钟执行一次。然后看看这个listCar中的代码 //定时任务的名称 这个和数据库中的task_name是保持一致的 保证要执行该定时任务。 public static final String LIST_CAR_TASK listCarTask; private ScheduleClusterTask scheduleClusterTask; //这个时间是根据spring-scheduler.xml中配置的定时刷新时间, 比如说我们以后要设置这个定时任务时4小时刷新一次 public static final long maxExpireTime 4 * 3600;public void listCar() {if (scheduleClusterTask.isValidMachine(maxExpireTime, CommonConstants.ScheduleTaskName.LIST_CAR_TASK)) {//执行具体的task方法 doTask();//将execute状态更新为0scheduleClusterTask.end(LIST_CAR_TASK);}} 最后看下最核心的代码ScheduleClusterTask.java /*** 多机定时任务工具类* Created by WangMeng on 2017/4/12.*/ Service public class ScheduleClusterTask {private ScheduleClusterEntityService scheduleClusterEntityService;/*** 这里因为两台机器都有同样的定时任务 会同时执行这个方法只有一台机器可以执行成功返回true。* param maxExpireTime 最大的检查时间。* param taskName 任务名称。* return*/public boolean isValidMachine(long maxExpireTime, String taskName) {boolean isValid false;try {//通过taskName去数据库中查找到该条记录 如果大家使用的是mybatis这里需要改一下 就是一个简单的查询操作ScheduleClusterEntity carIndexEntity scheduleClusterEntityService.findOne(ScheduleClusterEntity.Fields.taskName.eq(taskName));int execute carIndexEntity.getExecute();String ip InetAddress.getLocalHost().getHostAddress();long currentTimeMillis System.currentTimeMillis();long time carIndexEntity.getUpdateTime().getTime();if (execute 0 time maxExpireTime - 1000 currentTimeMillis) {isValid checkMachine(taskName, carIndexEntity, ip);} else if (time maxExpireTime - 1000 currentTimeMillis){//这里要判断下 如果上一次执行出现异常导致execute没有更新为0 那么这里要判断上一次更新时间的间隔。isValid checkMachine(taskName, carIndexEntity, ip);}} catch (UnknownHostException e) {e.printStackTrace();}return isValid;}/*** end方法主要是将excute(是否正在执行的标志位0:没有执行 1:正在执行)更新为0* param taskName* return*/public boolean end (String taskName) {ScheduleClusterEntity carIndexEntity scheduleClusterEntityService.findOne(ScheduleClusterEntity.Fields.taskName.eq(taskName));//将execute状态更新为0return scheduleClusterEntityService.end(carIndexEntity);}private boolean checkMachine(String taskName, ScheduleClusterEntity carIndexRefresh, String ip) {return scheduleClusterEntityService.start(taskName, carIndexRefresh.getVersion(), ip);}Autowiredpublic void setScheduleClusterEntityService(ScheduleClusterEntityService scheduleClusterEntityService) {this.scheduleClusterEntityService scheduleClusterEntityService;} } 这里还有start方法 看看怎样的操作 Repository public class DefaultScheduleClusterEntityDao extends AbstractDaoScheduleClusterEntity implements ScheduleClusterEntityDao {Overridepublic boolean start(String taskName, int version, String ip) {String sql update t_schedule_cluster set execute 1, version ?, execute_ip ?, update_time ? where task_name ? and version ?;Sql s new Sql(sql);s.addParam(version 1);s.addParam(ip);s.addParam(SqlTimeUtils.nowTimestamp());s.addParam(taskName);s.addParam(version);return 1 executeUpdate(s);} } 核心的代码到了这里就没有了 代码确实是非常非常的简单 有兴趣的话大家可以在本地测试一下就可以。当然还有更多很好地解决方案 我这里秉承的是最简单的处理方式 如果大家对我这个方案有疑问或者做的不好的地方都希望大家能够提出来 谢谢了转载于:https://blog.51cto.com/14311648/2390405
http://wiki.neutronadmin.com/news/15667/

相关文章:

  • 网站规划小结涿州做网站
  • 微网站是什么意思云南信息港
  • 企业网站带后台营销推广有哪些步骤
  • 可信赖的广州做网站网店推广工作内容
  • ps切片以后 怎么做网站电子商务的网站建设过程
  • 企业网站推广方案策划专业企业网站建设定制
  • 国产做网站网络专业公司排行榜
  • 网站安全建设目的网站建设公司选哪个好
  • 潍坊网站建设招聘wordpress两个域名
  • 网站结构建设方案中山网站制
  • 线上推广的三种方式seo推广主管
  • 六安seo网站推广报价要怎么判断网站是什么cms做的
  • 网站收录平台免费logo生成器官网
  • 户外保险网站长沙网站设计开发
  • 马鞍山建设网站中国做的手机系统下载网站
  • 做网站优化最快的方式移动应用开发好就业吗
  • 深圳网站设计+建设首选深圳市微信开发在哪能看
  • 建设人才信息网是什么网站直通车怎么开效果最佳
  • 亚洲杯篮球直播在什么网站漂亮的学校网站模板下载
  • 怎么做app下载网站优化好的网站
  • 销售网站建设深圳东门买衣服攻略
  • 地方汽车网站模板购买深圳公司注销
  • 义乌外贸网站制作中国机加工订单网
  • 网站开发需求分析参考文献淘客推广效果
  • 网站套餐表格模板昌平区事业单位公共知识培训网站
  • 软件工网站开发课程设计报告扁平化配色方案网站
  • 常熟网站设计wordpress页面添加图片不显示
  • 万网提供的网站建设服务的具体项目建筑工程东莞网站建设
  • 网站宣传推广方案wordpress安全博客
  • 自己做网站排版wordpress图片本地化工具