/* * Copyright 1999-2015 dangdang.com. * <p> * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * </p> */ package com.dangdang.ddframe.job.lite.internal.schedule; import com.dangdang.ddframe.job.lite.api.strategy.JobInstance; import com.dangdang.ddframe.job.reg.base.CoordinatorRegistryCenter; import lombok.AccessLevel; import lombok.NoArgsConstructor; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * 作业注册表. * * @author zhangliang * @author caohao */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class JobRegistry { private static volatile JobRegistry instance; private Map<String, JobScheduleController> schedulerMap = new ConcurrentHashMap<>(); private Map<String, CoordinatorRegistryCenter> regCenterMap = new ConcurrentHashMap<>(); private Map<String, JobInstance> jobInstanceMap = new ConcurrentHashMap<>(); private Map<String, Boolean> jobRunningMap = new ConcurrentHashMap<>(); private Map<String, Integer> currentShardingTotalCountMap = new ConcurrentHashMap<>(); /** * 获取作业注册表实例. * * @return 作业注册表实例 */ public static JobRegistry getInstance() { if (null == instance) { synchronized (JobRegistry.class) { if (null == instance) { instance = new JobRegistry(); } } } return instance; } /** * 添加作业调度控制器. * * @param jobName 作业名称 * @param jobScheduleController 作业调度控制器 * @param regCenter 注册中心 */ public void registerJob(final String jobName, final JobScheduleController jobScheduleController, final CoordinatorRegistryCenter regCenter) { schedulerMap.put(jobName, jobScheduleController); regCenterMap.put(jobName, regCenter); regCenter.addCacheData("/" + jobName); } /** * 获取作业调度控制器. * * @param jobName 作业名称 * @return 作业调度控制器 */ public JobScheduleController getJobScheduleController(final String jobName) { return schedulerMap.get(jobName); } /** * 获取作业注册中心. * * @param jobName 作业名称 * @return 作业注册中心 */ public CoordinatorRegistryCenter getRegCenter(final String jobName) { return regCenterMap.get(jobName); } /** * 添加作业实例. * * @param jobName 作业名称 * @param jobInstance 作业实例 */ public void addJobInstance(final String jobName, final JobInstance jobInstance) { jobInstanceMap.put(jobName, jobInstance); } /** * 获取作业运行实例. * * @param jobName 作业名称 * @return 作业运行实例 */ public JobInstance getJobInstance(final String jobName) { return jobInstanceMap.get(jobName); } /** * 获取作业是否在运行. * * @param jobName 作业名称 * @return 作业是否在运行 */ public boolean isJobRunning(final String jobName) { Boolean result = jobRunningMap.get(jobName); return null == result ? false : result; } /** * 设置作业是否在运行. * * @param jobName 作业名称 * @param isRunning 作业是否在运行 */ public void setJobRunning(final String jobName, final boolean isRunning) { jobRunningMap.put(jobName, isRunning); } /** * 获取当前分片总数. * * @param jobName 作业名称 * @return 当前分片总数 */ public int getCurrentShardingTotalCount(final String jobName) { Integer result = currentShardingTotalCountMap.get(jobName); return null == result ? 0 : result; } /** * 设置当前分片总数. * * @param jobName 作业名称 * @param currentShardingTotalCount 当前分片总数 */ public void setCurrentShardingTotalCount(final String jobName, final int currentShardingTotalCount) { currentShardingTotalCountMap.put(jobName, currentShardingTotalCount); } /** * 终止任务调度. * * @param jobName 作业名称 */ public void shutdown(final String jobName) { JobScheduleController scheduleController = schedulerMap.remove(jobName); if (null != scheduleController) { scheduleController.shutdown(); } CoordinatorRegistryCenter regCenter = regCenterMap.remove(jobName); if (null != regCenter) { regCenter.evictCacheData("/" + jobName); } jobInstanceMap.remove(jobName); jobRunningMap.remove(jobName); currentShardingTotalCountMap.remove(jobName); } /** * 判断任务调度是否已终止. * * @param jobName 作业名称 * @return 任务调度是否已终止 */ public boolean isShutdown(final String jobName) { return !schedulerMap.containsKey(jobName) || !jobInstanceMap.containsKey(jobName); } }