Spring 批处理@BeforeContext 执行失败
Spring Batch @BeforeContext Fails to Execute
我在 spring 批处理中有一个情况,我有多个项目处理器组成一个复合项目处理器。我需要在同一步骤中在两个处理器之间共享一些上下文数据。我找到了一个访问上下文的有效解决方案,如下所示。也就是说,有一个替代解决方案看起来更简洁,但它使用了永远不会被调用的@BeforeStepAnnotation。如果可能的话,我想使用第二种解决方案。非常感谢任何有关如何执行此操作的建议。
这个有效:
@Component
@StepScope
public class MyItemProcessor implements ItemProcessor<String,String> {
@Value(#{stepExecution});
private StepExecution stepExecution;
public String process(String s){
//Do things
Context context = new Context();
context.set("Hello Context");
ExecutionContext executionContext = stepExecution.getExecutionContext();
executionContext.put("Context", context);
}
}
这失败了:
@Component
@StepScope
public class MyItemProcessor implements ItemProcessor<String,String> {
private ExecutionContext executionContext;
public String process(String s){
//Do things
Context context = new Context();
context.set("Hello Context");
executionContext.put("Context", context);
}
@BeforeStep
public getCurrentContext(StepExecution stepExecution){
executionContext = stepExecution.getExecutionContext();
}
}
由于您的项目处理器是组合的一部分,因此不会对 @BeforeStep
注释进行内省,因此它不会注册为侦听器。 Spring Batch 只会自省注册为处理器的对象(在您的情况下是复合对象),而不是整个对象图。
您需要将任何组合处理器注册为侦听器才能正常工作。以下链接可能会有所帮助:
- Spring-batch @BeforeStep does not work with @StepScope
- https://github.com/spring-projects/spring-batch/issues/1428#issuecomment-566277832
我在 spring 批处理中有一个情况,我有多个项目处理器组成一个复合项目处理器。我需要在同一步骤中在两个处理器之间共享一些上下文数据。我找到了一个访问上下文的有效解决方案,如下所示。也就是说,有一个替代解决方案看起来更简洁,但它使用了永远不会被调用的@BeforeStepAnnotation。如果可能的话,我想使用第二种解决方案。非常感谢任何有关如何执行此操作的建议。
这个有效:
@Component
@StepScope
public class MyItemProcessor implements ItemProcessor<String,String> {
@Value(#{stepExecution});
private StepExecution stepExecution;
public String process(String s){
//Do things
Context context = new Context();
context.set("Hello Context");
ExecutionContext executionContext = stepExecution.getExecutionContext();
executionContext.put("Context", context);
}
}
这失败了:
@Component
@StepScope
public class MyItemProcessor implements ItemProcessor<String,String> {
private ExecutionContext executionContext;
public String process(String s){
//Do things
Context context = new Context();
context.set("Hello Context");
executionContext.put("Context", context);
}
@BeforeStep
public getCurrentContext(StepExecution stepExecution){
executionContext = stepExecution.getExecutionContext();
}
}
由于您的项目处理器是组合的一部分,因此不会对 @BeforeStep
注释进行内省,因此它不会注册为侦听器。 Spring Batch 只会自省注册为处理器的对象(在您的情况下是复合对象),而不是整个对象图。
您需要将任何组合处理器注册为侦听器才能正常工作。以下链接可能会有所帮助:
- Spring-batch @BeforeStep does not work with @StepScope
- https://github.com/spring-projects/spring-batch/issues/1428#issuecomment-566277832