* 判断ScheduleServer是否正常运行
* @author zhoufang
*
*/
private void update(){
DistributeLock lock=(DistributeLock) getHibernateTemplate().execute(new HibernateCallback() {
@Override
public Object doInHibernate(Session session) throws HibernateException,
SQLException {
Query query=session.createQuery("from com.taobao.zeus.store.mysql.persistence.DistributeLock where subgroup=? order by id desc");
query.setParameter(0, Environment.getScheduleGroup());
query.setMaxResults(1);
DistributeLock lock= (DistributeLock) query.uniqueResult();
if(lock==null){
lock=new DistributeLock();
lock.setHost(host);
lock.setServerUpdate(new Date());
lock.setSubgroup(Environment.getScheduleGroup());
session.save(lock);
lock=(DistributeLock) query.uniqueResult();
}
return lock;
}
});
if(host.equals(lock.getHost())){
log.error("hold the locker and update time");
lock.setServerUpdate(new Date());
getHibernateTemplate().update(lock);
zeusSchedule.startup(port);
}else{//其他服务器抢占了锁
log.error("not my locker");
//如果最近更新时间在2分钟以上,则认为抢占的Master服务器已经失去连接,本服务器主动进行抢占
if(System.currentTimeMillis()-lock.getServerUpdate().getTime()>1000*60*2L){
log.error("rob the locker and update");
lock.setHost(host);
lock.setServerUpdate(new Date());
lock.setSubgroup(Environment.getScheduleGroup());
getHibernateTemplate().update(lock);
zeusSchedule.startup(port);
}else{//如果Master服务器没有问题,本服务器停止server角色
zeusSchedule.shutdown();
}
}
try {
worker.connect(lock.getHost(),port);
} catch (Exception e) {
ScheduleInfoLog.error("start up worker fail", e);
}
}