java - Spring批处理如何在Skip Listener中获取作业执行上下文
问题描述
我正在寻求帮助以找到在我的块侦听器中设置作业执行上下文的方法。
@Bean
public Step testStep(
JdbcCursorItemReader<TestStep> testStageDataReader,
TestStepProcessor testStepProcessor,
CompositeItemWriter<Writer> testWriter,
PlatformTransactionManager transactionManager,
JobRepository jobRepository, TestChunkListener testChunkListener) {
return stepBuilderFactory
.get("TESTING")
.<>chunk(100)
.reader(testStageDataReader)
.processor(testStepProcessor)
.writer(testWriter)
.faultTolerant()
.skip(DataIntegrityViolationException.class)
.skipLimit(4)
.listener(testSkipListener)
.transactionManager(transactionManager)
.repository(jobRepository)
.build();
}
跳过监听器
@Component
@RequiredArgsConstructor
@Slf4j
@StepScope
public class TestSkipListener {
private final TestRepository testRepository;
@Value("#{jobExecutionContext['jobExecutionTestId']}")
private Long jobExecutionTestId; //this is null
@OnSkipInWrite
public void onSkipInWrite(Writer writer,
Throwable t) {
logException(t);
}
}
我正在设置作业执行 ID
@Component
@Slf4j
@RequiredArgsConstructor
public class TestJobListener extends JobExecutionListenerSupport {
@Override
public void beforeJob(JobExecution jobExecution) {
long jobExecutionId = jobExecution.getJobId();
jobExecution.getExecutionContext()
.put("jobExecutionTestId", jobExecutionId);
}
}
这在我的处理器和编写器中工作正常,但在跳过侦听器时,它是空的
解决方案
在这段时间之后,你肯定找到了方法。但是我遇到了同样的情况,找到了你的帖子,最后自己想出了一个解决方案。让我们在这里为下一个卡住的开发人员分享它:
您可以使用加载执行上下文@Value
。关键取决于Scope
您在课堂上使用的内容。
@工作范围 :
@Component
@JobScope
public class MySkipListener implements SkipListener<T, T> {
@Value("#{jobExecution.executionContext}")
private ExecutionContext executionContext;
@Override
public void onSkipInRead(Throwable throwable) {
String myVariableInContext = executionContext.get("myVariableKey");
// do your stuff
}
@StepScope:
@Component
@StepScope
public class MySkipListener implements SkipListener<T, T> {
@Value("#{stepExecution.jobExecution.executionContext}")
private ExecutionContext executionContext;
@Override
public void onSkipInRead(Throwable throwable) {
String myVariableInContext = executionContext.get("myVariableKey");
// do your stuff
}
推荐阅读
- javascript - 关于验证确认密码和纯字母文本是否正确
- java - Spring&Hibernate:“字段列表”中的未知列,但列名匹配
- python - 使用 Selenium 查找元素,文本和类属性存在但无法找到元素?
- sql - Spring Data JPA Native Query - 如何使用 Postgres ARRAY 类型作为参数
- python - 为什么 Python Turtle 不响应我的运动输入?
- android - 在android上安装多个ttf字体文件
- karate - 如何在空手道中向 xml 文件添加元素/属性
- python - moduleNotFoundError:没有在 Visual Studio 代码中命名的模块
- macos - macOS 上的 Ping 请求超时
- c# - 防止表单显示在工作区域之外