我正在尝试使用spring批处理从cassandra读取数据,其中我已经实现了ItemReader,ItemProcessor和ItemWriter。我能够读取数据,处理它并将数据写回到同一个表中。我正在创建xml文件来执行作业:
的xml:
<job id="LoadStatusIndicator" job-repository="jobRepository" restartable="false">
<step id="LoadStatus" next="">
<tasklet>
<chunk reader="StatusReader" processor="ItemProcessor" writer="ItemWriter"
commit-interval="10" />
</tasklet>
</step>
</job>
<beans:bean id="ItemWriter" scope="step"
class="com.batch.writer.ItemWriter">
</beans:bean>
<beans:bean id="ItemProcessor" scope="step"
class="com.batch.processor.ItemProcessor">
</beans:bean>
<beans:bean id="Reader" scope="step"
class="com.reader.ItemReader">
<beans:property name="dataSource" ref="CassandraSource" />
</beans:bean>
的applicationContext.xml:
<beans:bean id="CassandraSource" parent="DataSourceParent">
<beans:property name="url" value="jdbc:cassandra://${cassandra.hostName}:${cassandra.port}/${cassandra.keyspace}" />
<beans:property name="driverClassName" value="org.apache.cassandra.cql.jdbc.CassandraDriver" />
</beans:bean>
读者类:
public static final String query = "SELECT * FROM test_1 allow filtering;";
@Override
public List<Item> read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException
{
List<Item> results = new ArrayList<Item>();
try {
results = cassandraTemplate.select(query,Item.class);
} catch (Exception e) {
e.printStackTrace();
}
return results;
}
作家类:
@Override
public void write(List<? extends Item> item) throws Exception {
try {
cassandraTemplate.insert(item);
}catch(Exception e){e.printStackTrace();}
但问题是整个工作多次被执行,事实上它并没有停止。我必须强制停止执行作业。我表中只有2行。 我认为这是因为xml中定义的commit-interval,但是commit-interval = 10,作业执行次数超过10次
根据我的理解,当我运行xml文件意味着我只运行一次作业时,它会调用读取器一次将数据保存在运行时内存(作业存储库)中,调用项目处理器一次(我使用列表)并立即插入整个列表
答案 0 :(得分:2)
<强>解决强>
在读者课上我写道:
if (results.size!=0)
return results;
else
return null;