Spring Batch Job从多个来源读取

如何从倍数数据库中读取项目?我已经知道从文件中可以做到。

以下示例适用于从多个文件读取

...

<job id="readMultiFileJob" xmlns="http://www.springframework.org/schema/batch">

<step id="step1">

<tasklet>

<chunk reader="multiResourceReader" writer="flatFileItemWriter"

commit-interval="1" />

</tasklet>

</step>

</job>

...

<bean id="multiResourceReader"

class=" org.springframework.batch.item.file.MultiResourceItemReader">

<property name="resources" value="file:csv/inputs/domain-*.csv" />

<property name="delegate" ref="flatFileItemReader" />

</bean>

...


这样三个豆子

<bean id="database2" class="org.springframework.batch.item.database.JdbcCursorItemReader">

<property name="name" value="database2Reader" />

<property name="dataSource" ref="dataSource2" />

<property name="sql" value="select image from object where image like '%/images/%'" />

<property name="rowMapper">

<bean class="sym.batch.ImagesRowMapper2" />

</property>

</bean>

回答:

没有可立即使用的组件可以执行您的要求;唯一的解决方案是编写一个ItemReader<>委托给JdbcCursorItemReader(或委托给或委托HibernateCursorItemReader给任何通用ItemReader实现)的自定义。

您需要准备所有必要的东西(数据源,会话,实际数据库读取器),并将所有委派的读取器绑定到您的自定义读取器。

编辑:您需要使用recussion来模拟一个循环,ItemReader.read()并在整个作业重新启动期间保留阅读器和委托状态。

class MyItemReader<T> implements ItemReader<T>, ItemStream {

private ItemReader[] delegates;

private int delegateIndex;

private ItemReader<T> currentDelegate;

private ExecutionContext stepExecutionContext;

public void setDelegates(ItemReader[] delegates) {

this.delegates = delegates;

}

@BeforeStep

private void beforeStep(StepExecution stepExecution) {

this.stepExecutionContext = stepExecution.getExecutionContext();

}

public T read() {

T item = null;

if(null != currentDelegate) {

item = currentDelegate.read();

if(null == item) {

((ItemStream)this.currentDelegate).close();

this.currentDelegate = null;

}

}

// Move to next delegate if previous was exhausted!

if(null == item && this.delegateIndex< this.delegates.length) {

this.currentDelegate = this.delegates[this.currentIndex++];

((ItemStream)this.currentDelegate).open(this.stepExecutionContext);

update(this.stepExecutionContext);

// Recurse to read() to simulate loop through delegates

item = read();

}

return item;

}

public void open(ExecutionContext ctx) {

// During open restore last active reader and restore its state

if(ctx.containsKey("index")) {

this.delegateIndex = ctx.getInt("index");

this.currentDelegate = this.delegates[this.delegateIndex];

((ItemStream)this.currentDelegate ).open(ctx);

}

}

public void update(ExecutionContext ctx) {

// Update current delegate index and state

ctx.putInt("index", this.delegateIndex);

if(null != this.currentDelegate) {

((ItemStream)this.currentDelegate).update(ctx);

}

}

public void close(ExecutionContext ctx) {

if(null != this.currentDelegate) {

((ItemStream)this.currentDelegate).close();

}

}


<bean id="myItemReader" class=path.to.MyItemReader>

<property name="delegates">

<array>

<ref bean="itemReader1"/>

<ref bean="itemReader2"/>

<ref bean="itemReader3"/>

</array>

</property>

</bean>


EDIT2:记住设置属性 ;这是让MyItemReader.read()正常工作所必需的

<bean id="itemReader1" class="JdbcCursorItemReader">

<property name="name" value="itemReader1" />

<!-- Set other properties -->

</bean>

以上是 Spring Batch Job从多个来源读取 的全部内容, 来源链接: utcz.com/qa/401381.html

回到顶部