春季批处理 - org.springframework.batch.item.ReaderNotOpenException - jdbccursoritemreader

Posted

技术标签:

【中文标题】春季批处理 - org.springframework.batch.item.ReaderNotOpenException - jdbccursoritemreader【英文标题】:Spring batch - org.springframework.batch.item.ReaderNotOpenException - jdbccursoritemreader 【发布时间】:2021-06-21 09:56:42 【问题描述】:

在项目阅读器实现中尝试读取 JdbcCursorItemReader 时,我得到阅读器未打开异常。我检查了堆栈溢出,但无法讨论 jdbc 项目阅读器。

这里是批量配置和项目阅读器实现的代码。仅添加了必需的代码。

    public class BatchConfig extends DefaultBatchConfigurer 
@Bean
public ItemReader<Allocation> allocationReader() 
return new AllocationReader(dataSource);

@Bean
public Step step() 
return stepBuilderFactory.get("step").<Allocation, Allocation>chunk (1).reader(allocationReader()).processor(allocationProcessor()).writer(allocationWriter()).build();






    public class AllocationReader implements ItemReader<Allocation> 
private DataSource ds;
private string block;
public AllocationReader(DataSource ds) 
this.ds = ds;

@BeforeStep
public void readStep(StepExecution StepExecution) 
this.stepExecution = StepExecution;
block = StepExecution.getJobExecution().get ExecutionContext().get("blocks");

@Override
public Allocation read() 
JdbcCursorItemReader<Allocation> reader = new JdbcCursorItemReader<Allocation>();
reader.setSql("select * from blocks where block_ref = + block);
reader.setDataSource(this.ds);
reader.setRowMapper(new AllocationMapper());
return reader.read();

我无法在批处理配置中将项目阅读器编写为 bean,因为我需要在进入项目阅读器以访问 stepexecution 之前调用。

如果Item reader read()函数返回类型更改为jdbccursorItemReader类型,会在Step reader()中抛出类型异常。

让我知道我缺少什么或需要任何其他代码 sn-p。

【问题讨论】:

【参考方案1】:

您正在AllocationReaderread 方法中创建一个JdbcCursorItemReader 实例。这是不正确的。此方法的代码应该是实际read操作的实现,而不是用于创建项目阅读器。

我无法在批处理配置中将项目阅读器编写为 bean,因为我需要在进入项目阅读器的步骤之前调用以访问步骤执行。

对于这个用例,您可以将阅读器定义为步进范围的 bean,并根据需要从作业执行上下文中注入属性。这在此处的参考文档中进行了解释:Late Binding of Job and Step Attributes。在您的情况下,读者可以这样定义:

@Bean
@StepScoped
public JdbcCursorItemReader<Allocation> itemReader(@Value("#jobExecutionContext['block']") String block) 
   // use "block" as needed to define the reader
   JdbcCursorItemReader<Allocation> reader = new JdbcCursorItemReader<Allocation>();
   reader.setSql("select * from blocks where block_ref = " + block);
   reader.setDataSource(this.ds);
   reader.setRowMapper(new AllocationMapper());
   return reader;

当你定义一个ItemStream的item reader bean时,你需要让bean定义方法至少返回ItemStreamReader(或者实际的实现类型),这样Spring Batch才能正确地定义bean的作用域并调用@ 987654329@ 在该步骤中适当。否则,open 方法将不会被调用,因此您将得到 ReaderNotOpenException

【讨论】:

以上是关于春季批处理 - org.springframework.batch.item.ReaderNotOpenException - jdbccursoritemreader的主要内容,如果未能解决你的问题,请参考以下文章

春季启动批处理到具有多个作业的春季云任务

春季批处理作业未读取第一行

Springboot--事件监听

Springboot使用validator进行参数校验

Springboot使用validator进行参数校验

Springboot使用validator进行参数校验