- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前有一个应用程序,我正在尝试诊断我在设置中所做的错误,但没有运气确定为什么它在非常特定的情况之外无法工作。
首先是我正在使用的代码。
配置.java
@EnableBatchProcessing
@SpringBootApplication(scanBasePackages="com.lcbo")
@EnableIntegration
public class COnfig {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Autowired
private LCBOInventoryTrackerProperties inventoryTrackerProperties;
@Bean
public Job processLCBOInventory(@Qualifier("getLCBOStoreDataStep") final Step getLCBOStoreDataStep) {
return jobBuilderFactory
.get("processLCBOInventory")
.incrementer(new RunIdIncrementer())
.start(getLCBOStoreDataStep)
.build();
}
/**
* This tasklet downloads the .zip file, unzips, and saves it in the appropriate folder under resources.
* Execute at 6am daily
*
// * @param AcquireDataFileTasklet acquireDataFiles
* @return Step - returns Step status; either SUCCESS or FAILURE
*/
@Bean
public Step getCurrentLCBODataStep(final AcquireDataFileTasklet acquireDataFiles,
final ExecutionContextPromotionListener listener) {
return stepBuilderFactory
.get("getCurrentLCBODataStep")
.tasklet(acquireDataFiles)
.allowStartIfComplete(true)
.listener(listener)
.build();
}
@Bean
public Step getLCBOStoreDataStep(final LCBOStoreReader lcboStoreReader,
final LCBOStoreWriter lcboStoreWriter) {
return stepBuilderFactory
.get("getLCBOStoreDataStep")
.<LCBOStore, LCBOStore>chunk(inventoryTrackerProperties.getDefaults().getChunkSize())
.reader(lcboStoreReader)
.writer(lcboStoreWriter)
.build();
}
}
读者阶层
@Component
public class LCBOStoreReader extends AbstractLCBOReader implements ItemReader, InterstepDataRetriever {
private static final Logger log = LoggerFactory.getLogger(LCBOStoreReader.class);
@Override
public ItemReader<LCBOStore> read() throws UnexpectedInputException, ParseException, NonTransientResourceException {
Class<LCBOStore> classType = LCBOStore.class;
return createCSVReader(classType, currentCSVFilePath, inventoryTrackerProperties.getLCBOFilPropertiess().getStores());
}
/*
@Override
public void beforeStep(final StepExecution stepExecution) {
JobExecution jobExecution = stepExecution.getJobExecution();
ExecutionContext jobContext = jobExecution.getExecutionContext();
this.currentWorkingDate = (String) jobContext.get("currentWorkingDateKey");
}
*/
@Override
public void retrieveInterstepDataFromJobContext(final ExecutionContext jobContext) {
this.currentCSVFilePath = (String) jobContext.get("currentCSVFilePathKey");
}
}
及其扩展的类(因为 FlatFileItemReader 设置由多个读取器使用)
public abstract class AbstractLCBOReader {
@Autowired
protected LCBOInventoryTrackerProperties inventoryTrackerProperties;
protected String currentCSVFilePathKey;
protected String currentCSVFilePath;
private static final Logger log = LoggerFactory.getLogger(AbstractLCBOReader.class);
protected <T> ItemReader<T> createCSVReader(final Class<T> classType,
final String currentCSVFilePath,
final LCBOFileDetailsProperties properties) {
FlatFileItemReader<T> reader = new FlatFileItemReader<>();
// Skip a line to ignore the header information in these files
reader.setLinesToSkip(properties.getNumberOfLinesToSkipInFile());
reader.setResource(new FileSystemResource(currentCSVFilePath + File.separator + properties.getFileName()));
reader.setLineMapper(createLineMapper(classType, properties));
reader.setRecordSeparatorPolicy(new DefaultRecordSeparatorPolicy());
reader.setEncoding("utf8");
return reader;
}
private <T> LineMapper<T> createLineMapper(final Class<T> classType, final LCBOFileProperties.LCBOFileDetailsProperties properties) {
DefaultLineMapper<T> lineMapper = new DefaultLineMapper<>();
lineMapper.setLineTokenizer(createLineTokenizer(properties));
lineMapper.setFieldSetMapper(createFieldSetMapper(classType));
return lineMapper;
}
private <T> FieldSetMapper<T> createFieldSetMapper(final Class<T> classType) {
BeanWrapperFieldSetMapper<T> fieldSetMapper = new BeanWrapperFieldSetMapper<>();
fieldSetMapper.setTargetType(classType);
return fieldSetMapper;
}
private LineTokenizer createLineTokenizer(final LCBOFileProperties.LCBOFileDetailsProperties properties) {
LCBOFileProperties.Column[] columns = properties.getColumns();
int[] columnIndexes = new int[columns.length];
String[] columnNames = new String[columns.length];
// populating the columnIndexes
for (int i = 0; i < columns.length; i++) {
columnIndexes[i] = columns[i].getColumnIndex();
columnNames[i] = columns[i].getColumnName();
}
DelimitedLineTokenizer lineTokenizer = new DelimitedLineTokenizer();
lineTokenizer.setIncludedFields(columnIndexes);
lineTokenizer.setNames(columnNames);
lineTokenizer.setDelimiter(",");
lineTokenizer.setQuoteCharacter('"');
return lineTokenizer;
}
}
执行此操作时的错误将是该对象无法从 FlatFileItemreader 转换为作为 createCSVReader 中第一个参数传递的对象。这是一个例子。
public class LCBOStore {
private Long id;
private String addressLineOne;
private String addressLineTwo;
private String city;
private String postalCode;
private String latitude;
private String longitude;
private String updatedAt; //Convert to Date
public LCBOStore(final Long id, final String addressLineOne, final String addressLineTwo, final String city,
final String postalCode, final String latitude, final String longitude, final String updatedAt) {
this.id = id;
this.addressLineOne = addressLineOne;
this.addressLineTwo = addressLineTwo;
this.city = city;
this.postalCode = postalCode;
this.latitude = latitude;
this.longitude = longitude;
this.updatedAt = updatedAt;
}
public Long getId() {
return id;
}
public String getAddressLineOne() {
return addressLineOne;
}
public String getAddressLineTwo() {
return addressLineTwo;
}
public String getCity() {
return city;
}
public String getPostalCode() {
return postalCode;
}
public String getLatitude() {
return latitude;
}
public String getLongitude() {
return longitude;
}
public String getUpdatedAt() {
return updatedAt;
}
public void setId(final Long id) {
this.id = id;
}
public void setAddressLineOne(final String addressLineOne) {
this.addressLineOne = addressLineOne;
}
public void setAddressLineTwo(final String addressLineTwo) {
this.addressLineTwo = addressLineTwo;
}
public void setCity(final String city) {
this.city = city;
}
public void setPostalCode(final String postalCode) {
this.postalCode = postalCode;
}
public void setLatitude(final String latitude) {
this.latitude = latitude;
}
public void setLongitude(final String longitude) {
this.longitude = longitude;
}
public void setUpdatedAt(final String updatedAt) {
this.updatedAt = updatedAt;
}
@Override
public String toString() {
return "StoreDBModel [id=" + id + ", addressLineOne=" + addressLineOne + ", city=" + city
+ ", postalCode=" + postalCode + ", latitude=" + latitude + ", longitude="
+ longitude + ", updatedAt=" + updatedAt + "]";
}
}
现在,如果我将 createCSVReader 中存在的 FlatFileItemReader 模式移至自定义 Reader 类的构造函数中,或者将其放在配置文件中,则它可以正常工作。但是,我无法弄清楚如何在这些配置中使用作业和步骤上下文(从我的测试看来,构造函数在您可以访问步骤和 jobContext 之前执行,并且我永远无法弄清楚放入 Config 类中时如何访问。)。至少对我来说,将 Reader 代码放在自己的文件中而不是填充到构造函数中看起来更干净。
简而言之,有没有办法修复这个操作系统,使其在自己的阅读器类中可以工作?我这样做是否错误并使用了不良做法?也许是两者的混合?如果有任何遗漏,请询问,我会尽力澄清。
最佳答案
因此,在评论中的一些帮助下,我发现答案非常简单。这是我的解决方案。
首先,将粗体代码添加到抽象类createCSVWriter方法
**protected <T> T** createCSVReader(final Class<T> classType,
final String currentCSVFilePath,
final LCBOFileDetailsProperties properties) throws Exception {
FlatFileItemReader<T> reader = new FlatFileItemReader<>();
// Skip a line to ignore the header information in these files
reader.setLinesToSkip(properties.getNumberOfLinesToSkipInFile());
reader.setResource(new FileSystemResource(currentCSVFilePath + File.separator + properties.getFileName()));
reader.setLineMapper(createLineMapper(classType, properties));
reader.setRecordSeparatorPolicy(new DefaultRecordSeparatorPolicy());
reader.setEncoding("utf8");
**return reader.read();**
}
手动执行读取调用将阻止它返回比您的读者类所需的更多内容。然后在 reader 类中编辑以下内容
@Override
public **LCBOStore** read() throws **Exception**, UnexpectedInputException, ParseException, NonTransientResourceException {
Class<LCBOStore> classType = LCBOStore.class;
return createCSVReader(classType, currentCSVFilePath, inventoryTrackerProperties.getLCBOFilPropertiess().getStores());
}
这只会返回您创建的对象,从而解决问题。
关于java - 从自定义 ItemReader 访问时无法强制转换 FlatFileItemReader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43269834/
我已经创建了我的自定义 ItemReader: @Component("pricereader") public class MyItemReader implements ItemReader{ @
我正在尝试访问 itemReader 中的 JobParameters,我遵循了 Spring 用户指南中的“作业和步骤属性的后期绑定(bind)”,但无法使其工作。 这是我的配置: Spring 批
我正在从数据库中读取数据,它有很多行,是的,但是“我认为读者在该步骤中释放了内存”。它需要超过 1Gb 的内存。怎样才能改善呢?使用另一种阅读器? ...
我正在使用 Spring Batch 的 ItemReader 来读取文件 我的输入文件包含由 分隔的一长串字符串, 如下所示: 2333,443445,5555,3344... 每个字符串都应该转换
我用 JdbcTemplate 实现了 ItemReader 。 问题是 read() 在无限循环中被调用。 public class MyReader implements ItemReader,
使用 Spring Batch 我试图将输入文件的每一行作为 String 提供给 ItemProcessor 而 中没有任何“CSV 解析”项目阅读器。 我提出了一个包含以下 reader() 方法
在我的 springbatch+quartz 设置中,我正在使用 FlatFileItemReader 读取一个 CSV 文件。我想为读者设置光标以使用给定的读者参数启动下一个作业实例。是否可以?
以下是我的 Spring Batch 用例。 从 Web 服务读取输入。 Web 服务将返回所有记录。 处理记录。 将处理过的记录一一写入。 我很清楚第 2 步和第 3 步,但无法弄清楚如何实现一个可
我有一个 Spring Batch 应用程序,它使用 JdbcCursorItemReader 从数据库表中读取数据,并使用 FlatFileItemWriter 将其写入平面文件。 当我测试我的应用
我有一个 Spring Batch 应用程序,它使用 JdbcCursorItemReader 从数据库表中读取数据,并使用 FlatFileItemWriter 将其写入平面文件。 当我测试我的应用
我正在尝试读取固定长度的文本文件并使用 spring Batch 将其寄存器导入数据库,但输入文件的常规布局是嵌套的,类似于(添加制表只是为了简化可视化): FILE HEADER ENTER
我想验证文件名和记录。我的应用上下文如下 我的项目阅读器上下文如下所示
我在我的批处理 Spring 项目中定义了一个作业流,并定义了 ItemReader、ItemProcessor、ItemWriter 等 我的 ItemReader 如下代码: @Component
我有一个带有简单自定义读取器和写入器的 Spring Batch 项目。当我运行代码时,我最终会出现一个无限循环,打印第一个项目“项目 1”。我究竟做错了什么? 这是我的代码: Reader.java
我刚刚开始使用 Spring Batch,想知道维护要在 ItemReader 中读取的项目列表的最佳实践是什么。我看到的例子是这样的: private static List items = new
我目前有一个应用程序,我正在尝试诊断我在设置中所做的错误,但没有运气确定为什么它在非常特定的情况之外无法工作。 首先是我正在使用的代码。 配置.java @EnableBatchProcessing
我正在尝试使用 ListItemReader 创建一个 Spring Batch 作业, ItemProcessor和 ItemWriter . XML 如下所示,
我有一个从数据库读取的多线程批处理作业,我担心不同的线程会重新读取记录,因为 ItemReader 在 Spring 批处理中不是线程安全的。我经历了SpringBatch FAQ部分指出 You c
当我尝试读取 csv 文件时,Spring 批处理遇到了这个问题。 我必须读取具有如下结构的CSV: valueHeader;valueHeader;valueHeader;valueHeader;v
我有一个 Spring Batch 项目,其中有 JsonResouurceAsyncPagingItemReader,这是一个自定义 ItemReader,它从 Web 服务异步检索数据。 此自定义
我是一名优秀的程序员,十分优秀!