gpt4 book ai didi

java - 如何仅运行一次 Spring Batch 的 read() 函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:01:24 25 4
gpt4 key购买 nike

我正在使用以下 xml 创建一个 Spring Batch 作业:

<batch:job id="simulatorJob" restartable="false">
<batch:step id="step1">
<batch:tasklet transaction-manager="transactionManager">
<batch:chunk reader="stockListner" writer="customWriter"
commit-interval="5">
</batch:chunk>
</batch:tasklet>
</batch:step>
</batch:job>

<bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" />

<bean id="stockListner" class="com.XXX.stock.java.StockReader" scope="step">
<property name="URL" value="NTPC,TCS" />
<!-- <property name="URL" value="NTPC" /> -->
<!-- <property name="URL" value="TCS" /> -->
</bean>

<bean id="customWriter" class="com.XXX.stock.java.FlatFileWriter" />

这是我的读者类:

private String URL;

public String getURL() {
return URL;
}

public void setURL(String uRL) {
URL = uRL;
}

public ArrayList<StockData> read() throws Exception, UnexpectedInputException,ParseException, NonTransientResourceException {
ArrayList<StockData> list = new ArrayList<StockData>();
String[] splitStocks = URL.split(",");

for(int i=0; i < splitStocks.length;i++){
list.add(stockReader.getStockData(splitStocks[i]));
}
return list;
}

但是读者类继续运行。我如何在第一次运行时停止?

我也试过这个:

public StockData read() throws Exception, UnexpectedInputException,ParseException, NonTransientResourceException {
ArrayList<StockData> list = new ArrayList<StockData>();
String[] splitStocks = URL.split(",");

for(int i=0; i < splitStocks.length;i++)
{
return stockReader.getStockData(splitStocks[i]);
}

return null;
}

read() 函数进入循环..

最佳答案

这个简单的委托(delegate)封装了一次性读取。

class OneItemReader<T> implements ItemReader<T> {
boolean read = false;
ItemReader<T> delegate;

@Override
public T read() {
if(read) {
return null;
}
T item = delegate.read();
read = true;
return item;
}
}

您可以创建自己的阅读器,而无需考虑一次性阅读,并使用这个小代理包装它。

您的 StockURLReader 可以定义为

class StockURLReader implements ItemReader<StockReader> {
String[] tokens = new String[0];
int index = 0;
StockDAO stockReader;

void setURL(String URL) {
this.tokens = URL.split(",");
index = 0;
}

StockData read() {
if(index < tokens.length) {
return stockReader.getStockData(tokens[index++]);
}
return null;
}
}

创建 OneTimeReader 并将 StockURLReader 设置为委托(delegate),您可以将 StockData 读取与一次性读取逻辑分开。
如果您想读取一组 StockData,最好的解决方案是创建一个 StockDataListBean,您可以在其中存储从拆分 URL 读取的所有 StockData

class StockDataListBean {
List<StockData> data = new LinkedList<StockData>();
}

并将StockURLReader修改为:

class StockURLReader implements ItemReader<StockDataListBean> {
String[] URLs = new String[0];
int index;
StockDAO stockReader;

void setURLs(String[] URL) {
this.URLs = URL;
index = 0;
}

StockDataListBean read() {
StockDataListBean item = null;
if(index < URLs.length)
{
item = new StockDataListBean();
for(String token : URLs[index].split(",").length)
{
item.data.add(stockReader.getStockData(token));
}
}
return item;
}
}

关于java - 如何仅运行一次 Spring Batch 的 read() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33367855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com