spring-batch DefaultJobParametersExtractor 源码

  • 2022-08-16
  • 浏览 (406)

spring-batch DefaultJobParametersExtractor 代码

文件路径:/spring-batch-core/src/main/java/org/springframework/batch/core/step/job/DefaultJobParametersExtractor.java

/*
 * Copyright 2006-2013 the original author or authors.
 *
 * 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
 *
 *      https://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.
 */
package org.springframework.batch.core.step.job;

import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParameter;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.item.ExecutionContext;

/**
 * Simple implementation of {@link JobParametersExtractor} which pulls parameters with
 * named keys out of the step execution context and the job parameters of the surrounding
 * job.
 *
 * @author Dave Syer
 * @author Will Schipp
 *
 */
public class DefaultJobParametersExtractor implements JobParametersExtractor {

	private Set<String> keys = new HashSet<>();

	private boolean useAllParentParameters = true;

	/**
	 * The key names to pull out of the execution context or job parameters, if they
	 * exist. If a key doesn't exist in the execution context then the job parameters from
	 * the enclosing job execution are tried, and if there is nothing there either then no
	 * parameter is extracted. Key names ending with <code>(long)</code>,
	 * <code>(int)</code>, <code>(double)</code>, <code>(date)</code> or
	 * <code>(string)</code> will be assumed to refer to values of the respective type and
	 * assigned to job parameters accordingly (there will be an error if they are not of
	 * the right type). Without a special suffix in that form a parameter is assumed to be
	 * of type String.
	 * @param keys the keys to set
	 */
	public void setKeys(String[] keys) {
		this.keys = new HashSet<>(Arrays.asList(keys));
	}

	/**
	 * @see JobParametersExtractor#getJobParameters(Job, StepExecution)
	 */
	@Override
	public JobParameters getJobParameters(Job job, StepExecution stepExecution) {
		JobParametersBuilder builder = new JobParametersBuilder();
		Map<String, JobParameter> jobParameters = stepExecution.getJobParameters().getParameters();
		ExecutionContext executionContext = stepExecution.getExecutionContext();
		if (useAllParentParameters) {
			for (String key : jobParameters.keySet()) {
				builder.addParameter(key, jobParameters.get(key));
			}
		}
		for (String key : keys) {
			if (key.endsWith("(long)")) {
				key = key.replace("(long)", "");
				if (executionContext.containsKey(key)) {
					builder.addLong(key, executionContext.getLong(key));
				}
				else if (jobParameters.containsKey(key)) {
					builder.addLong(key, (Long) jobParameters.get(key).getValue());
				}
			}
			else if (key.endsWith("(int)")) {
				key = key.replace("(int)", "");
				if (executionContext.containsKey(key)) {
					builder.addLong(key, (long) executionContext.getInt(key));
				}
				else if (jobParameters.containsKey(key)) {
					builder.addLong(key, (Long) jobParameters.get(key).getValue());
				}
			}
			else if (key.endsWith("(double)")) {
				key = key.replace("(double)", "");
				if (executionContext.containsKey(key)) {
					builder.addDouble(key, executionContext.getDouble(key));
				}
				else if (jobParameters.containsKey(key)) {
					builder.addDouble(key, (Double) jobParameters.get(key).getValue());
				}
			}
			else if (key.endsWith("(string)")) {
				key = key.replace("(string)", "");
				if (executionContext.containsKey(key)) {
					builder.addString(key, executionContext.getString(key));
				}
				else if (jobParameters.containsKey(key)) {
					builder.addString(key, (String) jobParameters.get(key).getValue());
				}
			}
			else if (key.endsWith("(date)")) {
				key = key.replace("(date)", "");
				if (executionContext.containsKey(key)) {
					builder.addDate(key, (Date) executionContext.get(key));
				}
				else if (jobParameters.containsKey(key)) {
					builder.addDate(key, (Date) jobParameters.get(key).getValue());
				}
			}
			else {
				if (executionContext.containsKey(key)) {
					builder.addString(key, executionContext.get(key).toString());
				}
				else if (jobParameters.containsKey(key)) {
					builder.addString(key, jobParameters.get(key).getValue().toString());
				}
			}
		}
		return builder.toJobParameters();
	}

	/**
	 * setter to support switching off all parent parameters
	 * @param useAllParentParameters if false do not include parent parameters. True if
	 * all parent parameters need to be included.
	 */
	public void setUseAllParentParameters(boolean useAllParentParameters) {
		this.useAllParentParameters = useAllParentParameters;
	}

}

相关信息

spring-batch 源码目录

相关文章

spring-batch JobParametersExtractor 源码

spring-batch JobStep 源码

spring-batch package-info 源码

0  赞