gpt4 book ai didi

spring - Spring Batch 的问题

转载 作者:行者123 更新时间:2023-12-04 12:06:38 26 4
gpt4 key购买 nike

嗨,我最近一直在 Spring Batch 工作,需要一些帮助。

1)我想使用多个线程运行我的作业,因此我使用了 TaskExecutor,如下所示,

            @Bean
public TaskExecutor taskExecutor() {
SimpleAsyncTaskExecutor taskExecutor = new SimpleAsyncTaskExecutor();
taskExecutor.setConcurrencyLimit(4);
return taskExecutor;
}

@Bean
public Step myStep() {
return stepBuilderFactory.get("myStep")
.<MyEntity,AnotherEntity> chunk(1)
.reader(reader())
.processor(processor())
.writer(writer())
.taskExecutor(taskExecutor())
.throttleLimit(4)
.build();
}

但是,在执行时可以在控制台中看到下面的行。

o.s.b.c.l.support.SimpleJobLauncher : No TaskExecutor has been set, defaulting to synchronous executor.



这是什么意思?但是,在调试时,我可以看到四个 SimpleAsyncExecutor 线程正在运行。有人可以对此有所了解吗?

2)我不想使用 spring 批处理创建的元数据表运行我的批处理应用程序。我试过添加 spring.batch.initialize-schema=never .但它没有用。我还看到了一些使用 ResourcelessTransactionManager 来做到这一点的方法。 , MapJobRepositoryFactoryBean .但是我必须为我的工作进行一些数据库事务。那我用这个可以吗?
我也可以通过扩展 DefaultBatchConfigurer 来做到这一点。并覆盖:
@Override
public void setDataSource(DataSource dataSource) {
// override to do not set datasource even if a datasource exist.
// initialize will use a Map based JobRepository (instead of database)
}

请进一步指导我。谢谢。

更新:

我的完整配置类在这里。
@EnableBatchProcessing
@EnableScheduling
@Configuration
public class MyBatchConfiguration{

@Autowired
public JobBuilderFactory jobBuilderFactory;

@Autowired
public StepBuilderFactory stepBuilderFactory;

@Autowired
public DataSource dataSource;


/* @Override
public void setDataSource(DataSource dataSource) {
// override to do not set datasource even if a datasource exist.
// initialize will use a Map based JobRepository (instead of database)
}*/
@Bean
public Step myStep() {

return stepBuilderFactory.get("myStep")
.<MyEntity,AnotherEntity> chunk(1)
.reader(reader())
.processor(processor())
.writer(writer())
.taskExecutor(executor())
.throttleLimit(4)
.build();
}

@Bean
public Job myJob() {

return jobBuilderFactory.get("myJob")
.incrementer(new RunIdIncrementer())
.listener(listener())
.flow(myStep())
.end()
.build();
}

@Bean
public MyJobListener myJobListener()
{
return new MyJobListener();
}
@Bean
public ItemReader<MyEntity> reader()
{

return new MyReader();
}

@Bean
public ItemWriter<? super AnotherEntity> writer()
{
return new MyWriter();
}

@Bean
public ItemProcessor<MyEntity,AnotherEntity> processor()
{
return new MyProcessor();
}

@Bean
public TaskExecutor taskExecutor() {
SimpleAsyncTaskExecutor taskExecutor = new SimpleAsyncTaskExecutor();
taskExecutor.setConcurrencyLimit(4);
return taskExecutor;
}}

最佳答案

将来,请将其分解为两个独立的问题。话虽如此,让我对这两个问题进行一些说明。

SimpleJobLauncher :没有设置TaskExecutor,默认为同步执行器。

您的配置正在配置 myStep使用您的 TaskExecutor .它的作用是导致 Spring Batch 在它自己的线程中执行每个块(基于 TaskExecutor 的参数)。您看到的日志消息与该行为无关。它与启动你的工作有关。默认情况下,SimpleJobLauncher将在它运行的同一线程上启 Action 业,从而阻塞该线程。你可以注入(inject)一个 TaskExecutorSimpleJobLauncher这将导致作业在与 JobLauncher 不同的线程上执行本身。这是框架对多线程的两种不同使用。

我不想使用 spring 批处理创建的元数据表运行我的批处理应用程序

这里的简短回答是只对元数据表使用内存数据库,如 HSQLDB 或 H2。这提供了生产级数据存储(以便正确处理并发)而无需实际持久化数据。如果您使用 ResourcelessTransactionManager ,您实际上正在关闭事务(如果您正在以任何容量使用数据库,这是一个坏主意),因为 TransactionManager实际上没有做任何事情(这是一个无操作的实现)。

关于spring - Spring Batch 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50198635/

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