我在春季启动应用程序中遇到了一个奇怪的问题,搜索了很多,但答案没有运气。基本上,我已经配置了一个非常简单的弹簧批处理作业,包括阅读器,处理器和编写器,我也有自己的数据源配置。
我只配置了一个作业,并且会有多个具有不同参数的同一作业的调用。也就是说,同一个作业URL将同时触发(10)不同的输入,并且所有内容都将并行运行。每个jobStep都有4个线程的节流,因此所有10个作业实例将跨越4个并行产生40个线程。
我每天遇到这种方法有两个问题,无法弄清楚问题,
o.s.b.c.l.support.SimpleJobLauncher:Job:[FlowJob: [name = marketing-job]]使用以下参数完成: [{time = 1513023822300,jobInput =“CustomerA”]及以下状态: [FAILED] o.s.batch.core.step.AbstractStep:遇到错误 在工作营销工作中执行步骤jobStep o.h.engine.jdbc.spi.SqlExceptionHelper:SQL错误:17008,SQLState: 08003 o.h.engine.jdbc.spi.SqlExceptionHelper:Closed Connection
连接关闭时出错。我已经设置了testOnBorrow,它应该确保池连接对作业有效,但这似乎不起作用。尝试使用testOnIdle但没有运气......
有人遇到过这些问题吗?有人可以帮我解决这个问题吗?
已在下面给出了作业和数据源的配置。
JOBConfig:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactoryPrimary",
transactionManagerRef = "transactionManager",
basePackages = "com.sample")
public class DatasourceConfig {
@Primary
@Bean(name = "dataSourcePrimary", destroyMethod = "")
public DataSource dataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setInitialSize(50);
dataSource.setMaxIdle(50);
dataSource.setMaxTotal(60);
dataSource.setValidationQuery("select 1 from dual");
dataSource.setValidationQueryTimeout(10);
dataSource.setTestOnBorrow(true);
dataSource.setTestWhileIdle(true);
//dataSource.setMinEvictableIdleTimeMillis(600000);
//dataSource.setTimeBetweenEvictionRunsMillis(600000);
return dataSource;
}
@Primary
@Bean(name = "entityManagerFactoryPrimary")
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
EntityManagerFactoryBuilder builder, @Qualifier("dataSourcePrimary") DataSource dataSource) {
return builder.dataSource(dataSource).packages("com.sample.entity")
.persistenceUnit("primary").build();
}
@Primary
@Bean(name = "transactionManager")
public PlatformTransactionManager transactionManager(
@Qualifier("entityManagerFactoryPrimary") EntityManagerFactory entityManagerFactoryPrimary) {
return new JpaTransactionManager(entityManagerFactoryPrimary);
}
@Primary
@Bean(name = "entityManagerPrimary")
public EntityManager entityManager(
@Qualifier("entityManagerFactoryPrimary") EntityManagerFactory entityManagerFactoryPrimary) {
return entityManagerFactoryPrimary.createEntityManager();
}
}
DataSourceConfig:
@Component
@StepScope
@RefreshScope
public class Reader
implements ItemReader<A>, StepExecutionListener {
private List<A> a;
@Override
public void beforeStep(StepExecution stepExecution) {
List<A> aList =
new ArrayList<A>();
// code to populate the data list 'a' from DB.
}
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
// TODO Auto-generated method stub
return null;
}
@Override
public synchronized A read() {
if (a.size() > 0) {
return a.remove(0);
}
return null;
}
}
@Component
public class Writer implements ItemWriter<A> {
@Override
public void write(List<? extends A> a) {
// get 'a' and write
}
}
更新:添加了Reader&amp;作者根据请求
{{1}}