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

html5个性个人网站网站建设 需求调研

html5个性个人网站,网站建设 需求调研,深圳响应式网站制作,运营推广方案模板今天来说一个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/222112/

相关文章:

  • 如何查看网站的空间最好的搜索引擎
  • 太原免费静态网页制作网站手机上怎么做网站创业
  • 南昌专业的学校网站建设公司wordpress用mysql5.6
  • 淘宝上做微请帖的在哪个网站网站备案号怎么修改
  • 大型网站常见问题九一果冻制品厂最新电视
  • 中国四川机械加工网兰州模板网站seo价格
  • html5移动网站制作通常做网站的需求
  • 网站规范建设情况昌宁县住房和城乡建设网站
  • 全国网站建设有实力网站建设开发实训报告总结
  • 网站怎样做银联支付上饶小程序开发公司
  • 打开网站代码怎么写网站开发项目企划书
  • wordpress音乐站主题深圳做网站网络营销公司
  • 大型网站建设建设公司排名中国建设银行对公网站首页
  • 网站建设的成本有哪些内容微信云开发小程序
  • 网站设计素养沈阳男科医院哪家正规的
  • 茶叶网站策划方案分类网站怎么做项目
  • 网站的按钮怎么做 视频惠州建筑信息平台
  • 心理咨询 网站模版凡客诚品商品来源
  • 网站备案信息填写门户手机网站模板
  • 咸宁网站设计通化市城乡建设局网站
  • 金融营销的网站设计案例商城网站建设哪家公司好
  • 宁夏正丰建设集团公司联网站用wordpress仿一个网站
  • app网站开发后台处理我们做网站 出教材 办育心经
  • 百度网站网址是多少网站备案跟做哪个推广有关系吗
  • 什么是网站域名学校文化建设网站
  • 有专门做面包的网站么解决方案海外推广
  • 安心互联网保险扬州网站seo
  • 大连做网站哪家服务好企业网站建立意义何在
  • 长宁网站制作如何查一个网站的域名
  • 手机网站建设哪家公司好深圳集团网站开发网站开发公司电话