/** * Copyright 2016 vip.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.vip.saturn.job.internal.server; import java.util.Collections; import java.util.List; import java.util.Properties; import com.google.common.base.Strings; import com.vip.saturn.job.basic.AbstractSaturnService; import com.vip.saturn.job.basic.JobScheduler; import com.vip.saturn.job.internal.election.LeaderElectionService; import com.vip.saturn.job.utils.LocalHostService; import com.vip.saturn.job.utils.ResourceUtils; /** * 作业服务器节点服务. * @author dylan.xue */ public class ServerService extends AbstractSaturnService { private LeaderElectionService leaderElectionService; public ServerService(final JobScheduler jobScheduler) { super(jobScheduler); } @Override public void start(){ leaderElectionService = jobScheduler.getLeaderElectionService(); } /** * 持久化作业服务器上线相关信息. */ public void persistServerOnline() { if (!leaderElectionService.hasLeader()) { leaderElectionService.leaderElection(); } persistIp(); persistVersion(); ephemeralPersistServerReady(); } private void persistVersion() { final Properties props = ResourceUtils .getResource("properties/saturn-core.properties"); if (props != null) { String version = props.getProperty("build.version"); if (!Strings.isNullOrEmpty(version)) { getJobNodeStorage().fillJobNodeIfNullOrOverwrite(ServerNode.getVersionNode(executorName), version); } } } public void resetCount() { persistProcessFailureCount(0); persistProcessSuccessCount(0); } private void persistIp() { getJobNodeStorage().fillJobNodeIfNullOrOverwrite(ServerNode.getIpNode(executorName), LocalHostService.cachedIpAddress); } private void ephemeralPersistServerReady() { getJobNodeStorage().fillEphemeralJobNode(ServerNode.getStatusNode(executorName), ServerStatus.READY); } /** * 清除立即运行的标记 */ public void clearRunOneTimePath(){ getJobNodeStorage().removeJobNodeIfExisted(ServerNode.getRunOneTimePath(executorName)); } /** * 清除立即终止作业的标记 */ public void clearStopOneTimePath(){ getJobNodeStorage().removeJobNodeIfExisted(ServerNode.getStopOneTimePath(executorName)); } /** * 在开始或结束执行作业时更新服务器状态. * * @param status 服务器状态 */ public void updateServerStatus(final ServerStatus status) { getJobNodeStorage().updateJobNode(ServerNode.getStatusNode(executorName), status); } /** * 获取该作业的所有服务器列表. * * @return 所有的作业服务器列表 */ public List<String> getAllServers() { List<String> result = getJobNodeStorage().getJobNodeChildrenKeys(ServerNode.ROOT); Collections.sort(result); return result; } /** * 判断当前服务器是否是等待执行的状态. * * @return 当前服务器是否是等待执行的状态 */ public boolean isServerReady() { String statusNode = ServerNode.getStatusNode(executorName); if (getJobNodeStorage().isJobNodeExisted(statusNode) && ServerStatus.READY.name().equals(getJobNodeStorage().getJobNodeData(statusNode))) { return true; } return false; } /** * 持久化统计处理数据成功的数量的数据. * * @param processSuccessCount 成功数 */ public void persistProcessSuccessCount(final int processSuccessCount) { getJobNodeStorage().replaceJobNode(ServerNode.getProcessSuccessCountNode(executorName), processSuccessCount); } /** * 持久化统计处理数据失败的数量的数据. * * @param processFailureCount 失败数 */ public void persistProcessFailureCount(final int processFailureCount) { getJobNodeStorage().replaceJobNode(ServerNode.getProcessFailureCountNode(executorName), processFailureCount); } }