先说需求,一个系统,脱机和联机,脱机要向联机每隔五秒发送心跳,由于脱机时部署两台服务器,联机这边数据库看到的数据就是每隔五秒会有两条数据,原本的job是用quartz来实现的,本想着加锁就可以,事实证明我想的太简单了
看了一下elastic-job是可以实现分布式管理的,它可以有多种方式,这里我写我用到的最方便的——spring配置
首先是你要执行的job继承一下SimpleJob,代码如下
public class SendHeartMonitorJob implements SimpleJob {
public void handle() throws Exception {
String logId = UUID.randomUUID().toString();
logger.info("logId:{},============上传监控信息开始============", logId);
/**
* 单机版和脱机版 执行发送监控心跳数据Job
*/
ServiceModelEnums currentModel = sysConfiglManager.getServiceModel();
if (ServiceModelEnums.OFFLINE == currentModel || ServiceModelEnums.SINGLE == currentModel) {
Result result = monitorRecordService.sendHeartMonitor(logId);
if (!result.isSuccess()) {
logger.warn("logId:{},执行发送监控心跳数据Job异常,异常信息:{}", logId, result.getMsg());
} else {
logger.info("logId:{},执行发送监控心跳数据Job成功", logId);
}
} else {
logger.info("logId:{},当前模式不需要执行发送监控心跳数据Job", logId);
}
logger.info("logId:{},============上传监控信息结束============", logId);
}
@Override
public void execute(ShardingContext shardingContext) {
try {
handle();
} catch (Exception e) {
logger.warn("logId:{},执行发送监控心跳数据Job异常,异常信息:{}", e.getMessage());
}
//System.out.println("发送心跳"+ DateUtil.now(DateUtil.DEFAULT_FORMAT));
logger.warn("logId:{},发送心跳成功。。。。。。。。。"+ DateUtil.now(DateUtil.DEFAULT_FORMAT));
}
}
这是要发送心跳的job,下面是配置,让他五秒一次
job和spring的集成
<!--配置作业注册中心 -->
<reg:zookeeper id="regCenter" server-lists="${config.dubbo.zk.host}" namespace="xx-job"
base-sleep-time-milliseconds="1000" max-sleep-time-milliseconds="3000" max-retries="3" />
<!-- 配置发送心跳的job-->
<job:simple id="sendHeartMonitorJob" class="com.yuantu.unified.system.job.SendHeartMonitorJob" registry-center-ref="regCenter"
sharding-total-count="1" cron="*/5 * * * * ? *" overwrite="true" /> <!--每五秒执行一次-->
这个配置好后其实就可以运行了,但是因为我的zk是在配置文件写的,所以server-lists这个地方用了通配符表示zk的地址"${config.dubbo.zk.host}" sharding-total-count指的是你分片的个数,根据你的需求改
以上
最后
白茶清欢无别事 我在等风也等你