elasticjob shutdown 及remove job和server

从代码一眼可以看出remove前会先shutdown job和server。
注意一点,无论是shutdown还是remove ,都不会删除config节点,即job定义还在zookeeper上。

 @Override
    public void remove(final Optional<String> jobName, final Optional<String> serverIp) {
    
    
        shutdown(jobName, serverIp);
        if (jobName.isPresent() && serverIp.isPresent()) {
    
    
            regCenter.remove(new JobNodePath(jobName.get()).getServerNodePath(serverIp.get()));
        } else if (jobName.isPresent()) {
    
    
            JobNodePath jobNodePath = new JobNodePath(jobName.get());
            List<String> servers = regCenter.getChildrenKeys(jobNodePath.getServerNodePath());
            for (String each : servers) {
    
    
                regCenter.remove(jobNodePath.getServerNodePath(each));
            }
        } else if (serverIp.isPresent()) {
    
    
            List<String> jobNames = regCenter.getChildrenKeys("/");
            for (String each : jobNames) {
    
    
                regCenter.remove(new JobNodePath(each).getServerNodePath(serverIp.get()));
            }
        }
    }

shutdown server谁shutdown server上所有job,实现job分配迁移。

如果不存在active的job instance,会有异常抛出,代码如下:

 Preconditions.checkArgument(jobName.isPresent() || serverIp.isPresent(), "At least indicate jobName or serverIp.");

由于shutdown 也会执行regCenter.remove,因此实际上remove里面regCenter.remove实际是多余和重复执行。

api只是remove zookeeper里面的node,运行节点job删除是通过如下代码实现的

class InstanceShutdownStatusJobListener extends AbstractJobListener {
    
    
        
        @Override
        protected void dataChanged(final String path, final Type eventType, final String data) {
    
    
            if (!JobRegistry.getInstance().isShutdown(jobName) && !JobRegistry.getInstance().getJobScheduleController(jobName).isPaused()
                    && isRemoveInstance(path, eventType) && !isReconnectedRegistryCenter()) {
    
    
                schedulerFacade.shutdownInstance();
            }
        }
        
        private boolean isRemoveInstance(final String path, final Type eventType) {
    
    
            return instanceNode.isLocalInstancePath(path) && Type.NODE_REMOVED == eventType;
        }
        
        private boolean isReconnectedRegistryCenter() {
    
    
            return instanceService.isLocalJobInstanceExisted();
        }
    }


 public void shutdownInstance() {
    
    
        if (leaderService.isLeader()) {
    
    
            leaderService.removeLeader();
        }
        monitorService.close();
        if (reconcileService.isRunning()) {
    
    
            reconcileService.stopAsync();
        }
        JobRegistry.getInstance().shutdown(jobName);
    }

猜你喜欢

转载自blog.csdn.net/weixin_40455124/article/details/112976797