在 mapper 中使用 jobParameters
Use jobParameters in mapper
我正在使用 Spring Batch 创建作业,该作业是从 Camel 处理器手动启动的。
我需要向我的作业传递一些参数,其中一个需要在我的作业的映射器中使用,但我找不到实现此目的的方法。
这是我的工作:
@Bean
public LineMapper<MyEntity> lineMapper() {
DefaultLineMapper<MyEntity> lineMapper = new DefaultLineMapper<MyEntity>();
DelimitedLineTokenizer lineTokenizer = new DelimitedLineTokenizer() {
{
setNames(new String[] { "val1", "val2" });
}
};
lineTokenizer.setDelimiter(";");
lineMapper.setLineTokenizer(lineTokenizer);
lineMapper.setFieldSetMapper(new MyEntityFieldsetMapper());
return lineMapper;
}
public class MyEntityFieldsetMapper implements FieldSetMapper<MyEntity> {
@Override
public MyEntity mapFieldSet(FieldSet fieldSet) throws BindException {
MyEntity MyEntity = new MyEntity();
MyEntity.setValOne(fieldSet.readString("val1"));
MyEntity.setValTwo(fieldSet.readString("val2"));
// Here I need to set the variable in job parameters
MyEntity.setValThree();
return MyEntity;
}
}
@Bean
@StepScope
public FlatFileItemReader<MyEntity> MyEntityFlatFileItemReader(
@Value("#{jobParameters[inputCsvPath]}")
String inputCsvPath, @Value("#{jobParameters[myCustomVal]}")
String myCustomVal) {
//Create reader instance
FlatFileItemReader<MyEntity> reader = new FlatFileItemReader<MyEntity>();
//Set input file location
reader.setResource(new FileSystemResource(inputCsvPath));
//Set number of lines to skips. Use it if file has header rows.
reader.setLinesToSkip(0);
//Configure how each line will be parsed and mapped to different values
reader.setLineMapper(lineMapper());
return reader;
}
@Bean
public Job readCSVFilesJob(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory,
ItemReader<MyEntity> MyEntityItemReader, ItemWriter<MyEntity> MyEntityWriter) {
Step step = stepBuilderFactory.get("step").<MyEntity, MyEntity>chunk(10000).reader(MyEntityItemReader)
.writer(MyEntityWriter).build();
return jobBuilderFactory.get("readCSVFilesJob").incrementer(new RunIdIncrementer()).start(step).build();
}
我可以在 ItemReader
中获取 jobParameters
,但无法将其传递给我的 lineMapper
和 FieldSetMapper
。
有办法吗?
将您的 LineMapper
bean 步骤限定范围并在其中注入作业参数,就像您对 reader 所做的那样,例如:
@Bean
@StepScope
public LineMapper<MyEntity> lineMapper(@Value("#{jobParameters[inputCsvPath]}") String inputCsvPath) {
// use job parameter here
}
如果您还想在其中注入作业参数,您可能还需要将 MyEntityFieldsetMapper
声明为步骤作用域 bean。
我正在使用 Spring Batch 创建作业,该作业是从 Camel 处理器手动启动的。
我需要向我的作业传递一些参数,其中一个需要在我的作业的映射器中使用,但我找不到实现此目的的方法。
这是我的工作:
@Bean
public LineMapper<MyEntity> lineMapper() {
DefaultLineMapper<MyEntity> lineMapper = new DefaultLineMapper<MyEntity>();
DelimitedLineTokenizer lineTokenizer = new DelimitedLineTokenizer() {
{
setNames(new String[] { "val1", "val2" });
}
};
lineTokenizer.setDelimiter(";");
lineMapper.setLineTokenizer(lineTokenizer);
lineMapper.setFieldSetMapper(new MyEntityFieldsetMapper());
return lineMapper;
}
public class MyEntityFieldsetMapper implements FieldSetMapper<MyEntity> {
@Override
public MyEntity mapFieldSet(FieldSet fieldSet) throws BindException {
MyEntity MyEntity = new MyEntity();
MyEntity.setValOne(fieldSet.readString("val1"));
MyEntity.setValTwo(fieldSet.readString("val2"));
// Here I need to set the variable in job parameters
MyEntity.setValThree();
return MyEntity;
}
}
@Bean
@StepScope
public FlatFileItemReader<MyEntity> MyEntityFlatFileItemReader(
@Value("#{jobParameters[inputCsvPath]}")
String inputCsvPath, @Value("#{jobParameters[myCustomVal]}")
String myCustomVal) {
//Create reader instance
FlatFileItemReader<MyEntity> reader = new FlatFileItemReader<MyEntity>();
//Set input file location
reader.setResource(new FileSystemResource(inputCsvPath));
//Set number of lines to skips. Use it if file has header rows.
reader.setLinesToSkip(0);
//Configure how each line will be parsed and mapped to different values
reader.setLineMapper(lineMapper());
return reader;
}
@Bean
public Job readCSVFilesJob(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory,
ItemReader<MyEntity> MyEntityItemReader, ItemWriter<MyEntity> MyEntityWriter) {
Step step = stepBuilderFactory.get("step").<MyEntity, MyEntity>chunk(10000).reader(MyEntityItemReader)
.writer(MyEntityWriter).build();
return jobBuilderFactory.get("readCSVFilesJob").incrementer(new RunIdIncrementer()).start(step).build();
}
我可以在 ItemReader
中获取 jobParameters
,但无法将其传递给我的 lineMapper
和 FieldSetMapper
。
有办法吗?
将您的 LineMapper
bean 步骤限定范围并在其中注入作业参数,就像您对 reader 所做的那样,例如:
@Bean
@StepScope
public LineMapper<MyEntity> lineMapper(@Value("#{jobParameters[inputCsvPath]}") String inputCsvPath) {
// use job parameter here
}
如果您还想在其中注入作业参数,您可能还需要将 MyEntityFieldsetMapper
声明为步骤作用域 bean。