当我运行一个spring批处理项目时,发生了异常!
异常详情:
Caused by: java.lang.NullPointerException: null
at org.springframework.batch.item.xml.StaxEventItemReader.moveCursorToNextFragment(StaxEventItemReader.java:141)
Run Code Online (Sandbox Code Playgroud)
文件名正确!
配置代码:
@Bean
@StepScope
public StaxEventItemReader xmlFileItemReader(@Value("#{jobParameters['fileType']}") String fileType,
@Value("#{jobExecutionContext['extractFileName']}") String fileName) throws Exception {
System.out.println("======================== fileName =========================="+fileName);
StaxEventItemReader reader = new StaxEventItemReader();
reader.setResource(new FileSystemResource(fileName));
reader.setFragmentRootElementName("PortData");
reader.setUnmarshaller(unmarshaller());
reader.afterPropertiesSet();
return reader;
}
Run Code Online (Sandbox Code Playgroud) 我需要在 Spring Batch 作业中插入聚合。但是聚合步骤需要有整个数据集可用。
在纯 SQL 中,很容易编写 SQL 聚合请求:完整的数据集(存储在数据库中)可用。
但是在 Spring Batch 作业中,一切都在内存中完成,并以分块方式传播。那么如何处理那种散落的数据呢?
您对插入聚合步骤/流程的最佳实践有什么建议吗?
非常感谢您的启发
我正在尝试从 spring boot fat jar 运行 spring 批处理作业,但在引用嵌套 jar 时遇到问题。
这是我使用的命令:
java -cp bignibou-batch-core/build/libs/bignibou-batch-core.jar:lib/spring-batch-core-3.0.3.RELEASE.jar org.springframework.batch.core.launch.support.CommandLineJobRunner com.bignibou.batch.configuration.BatchConfiguration mailingJob
Run Code Online (Sandbox Code Playgroud)
请注意我如何使用冒号引用嵌套的 Spring Batch jar。为什么这不起作用?
它说它找不到主类:
Erreur : impossible de trouver ou charger la classe principale org.springframework.batch.core.launch.support.CommandLineJobRunner
Run Code Online (Sandbox Code Playgroud) 在检查记录是否在 90 天前创建的处理器中,如果阅读器读取了过时的记录,我想终止该步骤,而不是该作业。
我试过 stepExecution.setStatus()、stepExecution.setEndTime(new Date()) 等等。
任何人都可以建议一种直接而明确的方式来终止步骤吗?谢谢。
对于重试功能,我想使用
org.springframework.batch.retry.interceptor.RetryOperationsInterceptor.
我可以在 spring-batch 2.1.X 中找到它,但在 spring-batch 2.2.X 中找不到。
被删除了吗?它有问题吗?
如果它被删除了,我应该使用不同的方法来代替,它是什么?
我的服务正在启动春季批处理作业。我希望能够将一些对象传递给作业,每次这个对象参数都会不同。我需要在我的 tasklet 中使用这个对象。我正在通过 JobLauncher 开始工作。就我用谷歌搜索而言,我发现 JobParameters 在这种情况下不会帮助我。我还发现很多答案都是使用 JobExecutionContext 或其他任何东西。但我想在工作开始之前注入参数对象。有可能吗?
启动工作的服务
@Service
public class MyServiceImpl implements MyService {
@Autowired
private JobLauncher jobLauncher;
@Autowired
private Job myJob;
@Override
public MyResponse startJob(InputParameter inputObject) {
try {
//Here I want to pass somehow inputObject ot JobExecution
jobLauncher.run(myJob, new JobParameters());
} catch (Exception e) {
return new MyResponse("FAILED")
}
return new MyResponse("OK");
}
}
Run Code Online (Sandbox Code Playgroud)
我的任务
@Component
@Scope("step")
public class MyTasklet implements Tasklet{
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
InputParameter inputObject = …Run Code Online (Sandbox Code Playgroud) 我有以下编写器类原型:
public class MyWriter extends AbstractItemStreamItemWriter<FieldSet> {
...
@Override
public void close()
{
...
{
...
}
Run Code Online (Sandbox Code Playgroud)
我的工作由以下定义@Beans:
@Bean
protected Step step(ItemReader<FieldSet> reader, ItemWriter<FieldSet> writer)
{
return stepBuilder.get("step")
.<FieldSet, FieldSet> chunk(chunkSize)
.reader(reader)
.writer(writer)
.listener(this)
.build();
}
@Bean
protected Job myImportJob(Step step, JobExecutionListener jobExecutionListener)
{
return jobBuilder
.get("myImportJob")
.listener(jobExecutionListener)
.start(step)
.build();
}
Run Code Online (Sandbox Code Playgroud)
该作业是从 MQ 侦听器触发的,如下所示:
@Autowired
private Job job;
@Autowired
private JobLauncher jobLauncher;
@JmsListener(destination = "queue_name")
public void receiveMessage(TextMessage message) throws JMSException
{
log.warn("Received message {} with listener {}.", …Run Code Online (Sandbox Code Playgroud) 我正在编写一个Spring Batch/Boot应用程序,用于将数据从informix数据库提取到java数据对象,但我无法弄清楚java.sql.SQLException:没有这样的列名问题.
这是方法:
public UserDo getUserAddress(UserDo item) {
try {
myJdbcTemplate.queryForObject(getUserAddressQuery, new RowMapper<UserDo>() {
@Override
public UserDo mapRow(ResultSet rs, int arg1) throws SQLException {
try {
item.setAddressLine1(rs.getString("cad_add_line_1"));
item.setAddressLine2(rs.getString("cad_add_line_2" + "cad_add_line_3" + "cad_add_line_4"));
item.setCity(rs.getString("cad_city_name"));
item.setState(rs.getString("cad_ste_prv_cd"));
item.setZip(rs.getString("cad_postal_code" + "cad_postal_cd_4"));
item.setCountry(rs.getString("cad_country_code"));
} catch (SQLException sqle){
logger.error(sqle.getMessage(), sqle);
}
return item;
}
}, item.getUserId());
} catch (EmptyResultDataAccessException erdae) {
logger.error(erdae.getMessage(), erdae);
} catch (IncorrectResultSizeDataAccessException irsdae) {
logger.error(irsdae.getMessage(), irsdae);
}
return item;
}
Run Code Online (Sandbox Code Playgroud)
这是由JdbcTemplate以下各项执行的查询:
private final String getUserAddressQuery = "select cad_add_line_1, …Run Code Online (Sandbox Code Playgroud) <bean id="fileDiffTaskelt" class="org.springframework.batch.core.step.tasklet.SystemCommandTasklet" scope="step">
<property name="command" value="diff #{jobParameters['INPUT_FILE']} #{jobParameters['PREVIOUS_FILE']} | grep -e '<' -e '>' | grep -x '.\{20\}' > #{jobParameters['FILTERED_FILE']}"/>
<property name="timeout" value="60000"/>
<property name="workingDirectory" value="/tmp/hub"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
我在 IDE 中收到此错误:与元素类型“属性”关联的属性“值”的值不得包含“<”字符。我在我的 grep 命令中使用了这个字符,非常重要,卡在这里。
我正在开发一个Spring Batch应用程序,该应用程序应仅将AWS Cloud用于特定的配置文件。当前,我有一个使用aws的配置文件,另一个不应使用的配置文件,因为它使用本地数据库,本地文件等在本地运行应用程序(同时AWS配置文件将使用RDS,S3等)
对于使用AWS概要文件的配置,我具有以下内容:
@Configuration
@Profile("!localDev")
public class FileReaderConfigAWS {
@Value("${cloud.aws.s3.bucket}")
private String amazonS3Bucket;
@Autowired
private ResourceLoader resourceLoader;
private static final Logger logger = LoggerFactory.getLogger(FileReaderConfigAWS.class);
@Bean
@StepScope
public FlatFileItemReader<Object> flatFileReader(@Value("#{jobParameters['inputFile']}") String inputFile, LineMapper
lineMapper) {
FlatFileItemReader<Object> flatFileItemReader = new FlatFileItemReader<>();
flatFileItemReader.setResource(resourceLoader.getResource("s3://" + this.amazonS3Bucket + "/" + inputFile));
flatFileItemReader.setLineMapper(lineMapper);
return flatFileItemReader;
}
@Bean
public AbstractFileValidator inputFileValidator() {
InputS3Validator inputS3Validator = new InputS3Validator();
inputS3Validator.setRequiredKeys(new String[]{InputFileSystemValidator.INPUT_FILE});
return inputS3Validator;
}
}
Run Code Online (Sandbox Code Playgroud)
对于我的localDev配置文件,我具有以下内容:
@Profile("localDev")
@Configuration
public class FileReaderConfigLocalDev {
@Bean
@StepScope
public FlatFileItemReader<Object> flatFileReader(@Value("#{jobParameters['inputFile']}") String …Run Code Online (Sandbox Code Playgroud) spring-batch ×10
spring ×6
java ×5
spring-boot ×2
aop ×1
informix ×1
jar ×1
jdbc ×1
spring-retry ×1
xml ×1