首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从ExecutionContext获取参数

从ExecutionContext获取参数
EN

Stack Overflow用户
提问于 2018-09-21 13:36:25
回答 1查看 1.3K关注 0票数 0

我有一个使用web参数执行的spring批处理作业,如:

代码语言:javascript
复制
https://localhost:8443/batch/async/orz003A?id=123&name=test

我已经将这些参数,idtest添加到了我的ExecutionContext

在我的安装程序Tasklet中,我很难访问它们,如下所示。

代码语言:javascript
复制
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.item.ExecutionContext;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.stereotype.Component;
import com.yrc.mcc.app.online.NTfp211;
import com.yrc.mcc.core.batch.tasklet.AbstractSetupTasklet;


@Component
public class Tfp211SetupTasklet extends AbstractSetupTasklet {

    final static Logger LOGGER = LoggerFactory.getLogger(Tfp211SetupTasklet.class);

    String gapId;

    @Override
    protected RepeatStatus performTask(ExecutionContext ec) {

        //TODO create the map, check the params for the needed params
        // throw an error if the param doesn't exist, because the param
        // is necessary to run the job. If the param does exist, set the specific param

        if (ec.isEmpty()) {
            LOGGER.info("this shit is empty");
        }
        //setg on GAPID
        gapId = ec.toString();
        ec.get(BATCH_PROGRAM_PARAMS);
        LOGGER.info(gapId);

        ec.put(AbstractSetupTasklet.BATCH_PROGRAM_NAME, NTfp211.class.getSimpleName());
        return RepeatStatus.FINISHED;
    }

}

有什么建议吗?

编辑:

这是我的AbstractSetupTaskler的一篇

代码语言:javascript
复制
Map<String, String> params = new HashMap<>();
        if (!ec.containsKey(BATCH_PROGRAM_PARAMS)) {
            ec.put(BATCH_PROGRAM_PARAMS, params);
        }

在每个作业的SetupTasklet中,我希望指定该作业所需的参数

编辑:我有这个任务,我相信它会启动我的工作。

代码语言:javascript
复制
@Component
public class CallM204ProgramTasklet implements Tasklet {

    private static final Logger LOGGER = LoggerFactory.getLogger(CallM204ProgramTasklet.class);

    @Autowired
    private CommonConfig commonConfig;

    @Autowired
    private ProgramFactory programFactory;

    @Autowired
    private MidusService midusService;

    @Override
    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
        ExecutionContext ec = chunkContext.getStepContext().getStepExecution().getJobExecution().getExecutionContext();
        JobParameters jobParameters = chunkContext.getStepContext().getStepExecution().getJobParameters();
        jobParameters.getParameters();
        String progName = ec.getString(AbstractSetupTasklet.BATCH_PROGRAM_NAME);
        Random randomSession = new Random();
        String sessionId = "000000" + randomSession.nextInt(1000000);
        sessionId = sessionId.substring(sessionId.length() - 6);
        SessionData sessionData = new SessionDataImpl("Batch_" + sessionId, commonConfig);
        IOHarness io = new BatchIOHarnessImpl(midusService, commonConfig.getMidus().getSendToMidus());
        sessionData.setIOHarness(io);
        sessionData.setUserId("mccBatch");
        Program program = programFactory.createProgram(progName, sessionData);
        String progResult = null;
        // Create necessary globals for flat file handling.
        @SuppressWarnings("unchecked")
        Map<String, MccFtpFile> files = (Map<String, MccFtpFile>) ec.get(AbstractSetupTasklet.BATCH_FTP_FILES);
        if (files != null) {
            for (MccFtpFile mccFtpFile : files.values()) {
                program.setg(mccFtpFile.getGlobalName(), mccFtpFile.getLocalFile());
            }
        }
        @SuppressWarnings("unchecked")
        Map<String, String> params = (Map<String, String>) ec.get(AbstractSetupTasklet.BATCH_PROGRAM_PARAMS);
        //put params into globals
        if (params != null) {
            params.forEach((k, v) -> program.setg(k, v));
        }
        try {
            program.processUnthreaded(sessionData);
            progResult = io.close(sessionData);
        } catch (Exception e) {
            progResult = "Error running renovated program " + progName + ": " + e.getMessage();
            LOGGER.error(progResult, e);
            chunkContext.getStepContext().getStepExecution().setExitStatus(ExitStatus.FAILED);
        } finally {
            String currResult = ec.getString(AbstractSetupTasklet.BATCH_PROGRAM_RESULT).trim();
            // Put the program result into the execution context.
            ec.putString(AbstractSetupTasklet.BATCH_PROGRAM_RESULT, currResult + "\r" + progResult);
        }
        return RepeatStatus.FINISHED;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-21 17:59:10

您需要设置一个作业启动程序,并传递在docs中描述的参数:https://docs.spring.io/spring-batch/4.0.x/reference/html/job.html#runningJobsFromWebContainer

之后,您可以从块上下文中访问任务线程中的作业参数。例如:

代码语言:javascript
复制
class MyTasklet implements Tasklet {

    @Override
    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
        JobParameters jobParameters = chunkContext.getStepContext().getStepExecution().getJobParameters();
        // get id and name from jobParameters
        // use id and name to do the required work
        return RepeatStatus.FINISHED;
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52444951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档