/**
* 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.execution;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.vip.saturn.job.basic.AbstractSaturnService;
import com.vip.saturn.job.basic.JobExecutionMultipleShardingContext;
import com.vip.saturn.job.basic.JobScheduler;
import com.vip.saturn.job.basic.SaturnExecutionContext;
import com.vip.saturn.job.internal.config.ConfigurationService;
import com.vip.saturn.job.internal.failover.FailoverService;
import com.vip.saturn.job.internal.offset.OffsetService;
/**
* 作业运行时上下文服务.
*
*
*/
public class ExecutionContextService extends AbstractSaturnService {
private ConfigurationService configService;
private FailoverService failoverService;
private OffsetService offsetService;
public ExecutionContextService(JobScheduler jobScheduler) {
super(jobScheduler);
}
@Override
public void start(){
configService = jobScheduler.getConfigService();
failoverService = jobScheduler.getFailoverService();
offsetService = jobScheduler.getOffsetService();
}
/**
* 获取当前作业服务器运行时分片上下文.
*
* @return 当前作业服务器运行时分片上下文
*/
public JobExecutionMultipleShardingContext getJobExecutionShardingContext() {
// JobExecutionMultipleShardingContext result = new JobExecutionMultipleShardingContext();
SaturnExecutionContext result = new SaturnExecutionContext();
result.setJobName(configService.getJobName());
result.setShardingTotalCount(configService.getShardingTotalCount());
List<Integer> shardingItems = getShardingItems();
removeRunningItems(shardingItems);
result.setShardingItems(shardingItems);
result.setJobParameter(configService.getJobParameter());
result.setCustomContext(configService.getCustomContext());
result.setJobConfiguration(jobConfiguration);
if(coordinatorRegistryCenter != null){
result.setNamespace(coordinatorRegistryCenter.getNamespace());
result.setExecutorName(coordinatorRegistryCenter.getExecutorName());
}
if (result.getShardingItems().isEmpty()) {
return result;
}
Map<Integer, String> shardingItemParameters = configService.getShardingItemParameters();
if(shardingItemParameters.containsKey(-1)) { // 本地模式
for (int each : result.getShardingItems()) {
result.getShardingItemParameters().put(each, shardingItemParameters.get(-1));
}
} else {
for (int each : result.getShardingItems()) {
if (shardingItemParameters.containsKey(each)) {
result.getShardingItemParameters().put(each, shardingItemParameters.get(each));
}
}
}
result.setOffsets(offsetService.getOffsets(result.getShardingItems()));
if(jobConfiguration.getTimeoutSeconds() >0 ){
result.setTimetoutSeconds(jobConfiguration.getTimeoutSeconds());
}
return result;
}
private void removeRunningItems(final List<Integer> items) {
List<Integer> toBeRemovedItems = new ArrayList<>(items.size());
for (int each : items) {
if (isRunningItem(each)) {
toBeRemovedItems.add(each);
}
}
items.removeAll(toBeRemovedItems);
}
private boolean isRunningItem(final int item) {
return jobScheduler.getJobNodeStorage().isJobNodeExisted(ExecutionNode.getRunningNode(item));
}
/**
* 获取分片项列表。
* @return 分片项列表。
*/
public List<Integer> getShardingItems() {
List<Integer> shardingItems = jobScheduler.getShardingService().getLocalHostShardingItems();
if (configService.isFailover()) {
List<Integer> failoverItems = failoverService.getLocalHostFailoverItems();
if (!failoverItems.isEmpty()) {
return failoverItems;
} else {
shardingItems.removeAll(failoverService.getLocalHostTakeOffItems());
return shardingItems;
}
} else {
return shardingItems;
}
}
}