我有一個像這樣的復合專案處理器:
@Bean
public CompositeItemProcessor<User, User> compositeItemProcessor() throws Exception {
CompositeItemProcessor<User, User> processor = new CompositeItemProcessor<>();
List<ItemProcessor<User, User>> processors = Arrays.asList(new Processor(),validatingItemProcessor());
processor.setDelegates(processors);
processor.afterPropertiesSet();
return processor;
}
我無法通過
這是處理器 1jobExecutionId
進入任何行程。@Beforestep
public class Processor implements ItemProcessor<User, User> {
private static final Map<String, String> DEPT_NAMES =
new HashMap<>();
private Long jobExecutionId;
@BeforeStep
public void beforeStep(StepExecution stepExecution) {
this.jobExecutionId = stepExecution.getJobExecutionId();
}
public Processor() {
DEPT_NAMES.put("001", "Technology");
DEPT_NAMES.put("002", "Operations");
DEPT_NAMES.put("003", "Accounts");
}
@Override
public User process(User user) throws Exception {
System.out.println(this.jobExecutionId);
String deptCode = user.getDept();
String dept = DEPT_NAMES.get(deptCode);
user.setDept(dept);
user.setTime(new Date());
System.out.println(String.format("Converted from [%s] to [%s]", deptCode, dept));
return user;
}
}
這是處理器 2。
@Bean
public ValidatingItemProcessor<User> validatingItemProcessor() {
return new ValidatingItemProcessor<>(new UserValidator());
}
這是我的作業配置。
Step step = stepBuilderFactory.get("ETL-file-load")
.<User, User>chunk(100)
.reader(itemReader)
.processor(compositeItemProcessor())
.writer(itemWriter)
.faultTolerant()
.skipPolicy(jobSkipPolicy())
.listener(userValidationListener())
.build();
return jobBuilderFactory.get("ETL-Load")
.incrementer(new RunIdIncrementer())
.start(step)
.build();
我正在為跳過的用戶記錄使用偵聽器。
@Bean
public UserValidationListener userValidationListener() {
return new UserValidationListener();
}
public class UserValidationListener implements SkipListener<User, User> {
@Override
public void onSkipInRead(Throwable throwable) {
}
@Override
public void onSkipInWrite(User user, Throwable throwable) {
}
@Override
public void onSkipInProcess(User user, Throwable throwable) {
System.out.println(user.toString());
System.out.println(throwable.getMessage());
//write error
//errorStaorage.()
}
}
使用這種配置,我無法jobExecutionId
在任何處理器中使用。
我嘗試過使用單個處理器而不是復合處理器。我得到jobExecutionId
.
Step step = stepBuilderFactory.get("ETL-file-load")
.<User, User>chunk(100)
.reader(itemReader)
.processor(new Processor())
.writer(itemWriter)
.faultTolerant()
.skipPolicy(jobSkipPolicy())
.listener(userValidationListener())
.build();
我得到了jobExecutionId
Converted from [001] to [Technology]
1
Converted from [002] to [Operations]
1
Converted from [003] to [Accounts]
1
Converted from [001] to [Technology]
1
Converted from [001] to [Technology]
1
jobId在哪里。因此,這使我得出一個結論,即我的設定方式存在錯誤,composite processor
無法獲取id
with @BeforeStep
。
為什么@Beforestep
在使用復合專案處理器時行為不同并且不會被呼叫?
更新 根據建議的答案,我添加了這個。
@Bean
public Processor itemProcessor() {
return new Processor();
}
現在我的步驟看起來像這樣......
Step step = stepBuilderFactory.get("ETL-file-load")
.<User, User>chunk(100)
.reader(itemReader)
.processor(compositeItemProcessor())
.writer(itemWriter)
.faultTolerant()
.skipPolicy(jobSkipPolicy())
.listener(userValidationListener())
.listener(itemProcessor())
.build();
uj5u.com熱心網友回復:
問題是您的處理器沒有被隱式注冊為偵聽器,只有復合處理器是。您需要在您的步驟中明確執行此操作
@Bean
public CompositeItemProcessor<User, User> compositeItemProcessor() throws Exception {
CompositeItemProcessor<User, User> processor = new CompositeItemProcessor<>();
List<ItemProcessor<User, User>> processors = Arrays.asList(processor(), validatingItemProcessor());
processor.setDelegates(processors);
processor.afterPropertiesSet();
return processor;
}
@Bean
public ItemProcessor<User, User> processor() {
return new Processor();
}
@Bean
public void step() {
Step step = stepBuilderFactory.get("ETL-file-load")
.<User, User>chunk(100)
.reader(itemReader)
.processor(compositeItemProcessor())
.writer(itemWriter)
.faultTolerant()
.skipPolicy(jobSkipPolicy())
.listener(userValidationListener())
.listener(processor()) // register your custom processor as a listener to execute @BeforeStep
.build();
return step;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/506915.html