@Configuration
class BatchConfig(){
companion object {
private val logger: Logger = LogManager.getLogger(BatchConfig::class.java)
}
@Autowired
private lateinit var dataSource : DataSource
fun itemReader(): JdbcCursorItemReader<Data_Batch> {
return JdbcCursorItemReaderBuilder<Data_Batch>()
.dataSource(dataSource)
.name("BatchReader")
.sql("SELECT batch_code , batch_name FROM data_batch")
.rowMapper(Batch_Mapper())
.build()
}
fun itemProcessor(): Batch_Procesor {
return Batch_Procesor()
}
fun itemWriter(): JdbcBatchItemWriter<Data_Batch_ETL> {
return JdbcBatchItemWriterBuilder<Data_Batch_ETL>()
.sql("INSERT INTO data_batch_etl (batch_name, batch_source) VALUES (:batch_name, :batch_source)")
.dataSource(dataSource)
.beanMapped()
.build()
}
@Bean
fun step1(jobRepository: JobRepository
, taskExecutor: TaskExecutor
): Step {
return StepBuilder("Step1",jobRepository).chunk<Data_Batch,Data_Batch_ETL>(3,transactionManager())
.reader(itemReader())
.processor(itemProcessor())
.writer(itemWriter())
.build()
}
@Bean
fun Job1( jobRepository: JobRepository ,step1 : Step , listener : JobCompletionNotificationListener) : Job {
return JobBuilder("Job1",jobRepository)
.listener(listener)
.start(step1)
.build()
}
@Bean
fun transactionManager() : PlatformTransactionManager{
var transection = DataSourceTransactionManager(dataSource)
return transection
}
}
@Entity(name = "Data_Batch")
class Data_Batch {
@Id
@GeneratedValue
@Column(name = "batch_code", nullable = false)
open var batch_code: Long? = null
@Column(name = "batch_name", nullable = false)
open var batch_name : String? = null
}
@Entity(name = "Data_Batch_ETL")
class Data_Batch_ETL {
@Id
@GeneratedValue
@Column(name = "batch_code", nullable = false)
open var batch_code: Long? = null
@Column(name = "batch_name", nullable = false)
open var batch_name : String? = null
@Column(name = "batch_source")
open var batch_source : String? = null
}
spring.application.name=spring_batch
spring.jpa.hibernate.ddl-auto=update
spring.jpa.generate-ddl=true
server.port=8094
spring.datasource.url=jdbc:postgresql://localhost:5432/backend2
spring.datasource.username=postgres
spring.datasource.password=password
spring.jpa.show-sql=true
logging.level.org.hibernate.engine.transaction.internal.TransactionImpl=DEBUG
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.datasource.driver-class-name=org.postgresql.Driver
server.shutdown=graceful
spring.lifecycle.timeout-per-shutdown-phase=60s
spring.batch.job.enabled: true
spring.batch.jdbc.initialize-schema=always
@Component
class Batch_Mapper : RowMapper<Data_Batch> {
companion object{
open val batch_code : String = "batch_code"
open val batch_name : String = "batch_name"
}
override fun mapRow(rs: ResultSet, rowNum: Int): Data_Batch {
var item = Data_Batch()
item.batch_code = rs.getLong(batch_code)
item.batch_name = rs.getString(batch_name)
return item
}
}
@Component
class Batch_Procesor : ItemProcessor<Data_Batch,Data_Batch_ETL>{
override fun process(item: Data_Batch): Data_Batch_ETL {
val transform : Data_Batch_ETL = Data_Batch_ETL()
transform.batch_code = item.batch_code!!
transform.batch_name = item.batch_name!!.uppercase()
transform.batch_source = "Data_Batch"
return transform
}
}
Бегать
Задание: [SimpleJob: [name=Job1]] запущено со следующими параметрами: [{}]
: Шаг уже завершен или его невозможно перезапустить, поэтому никаких действий для выполнения не требуется: StepExecution: id=3, version=7, name=Step1, status=COMPLETED, exitStatus=COMPLETED, readCount=0, filterCount=0, writeCount=0 readSkipCount=0 , writeSkipCount=0,processSkipCount=0, commitCount=5,rollbackCount=0, exitDescription=
Задание: [SimpleJob: [name=Job1]] завершено со следующими параметрами: [{}] и следующим статусом: [ЗАВЕРШЕНО] через 19 мс.
В таблице data_batch есть данные!!
Задание выполнено успешно, но данные не были перемещены.





Вы не передаете никаких параметров задания, поэтому каждый раз оказываетесь в одном и том же экземпляре задания (хэш пустого набора параметров будет одинаковым). По умолчанию шаг, который уже был завершен при предыдущем запуске, не подлежит перезапуску, но вы можете пометить его как перезапускаемый, вызвав следующий метод в StepBuilder:
.allowStartIfComplete(true)
Вы уже выполнили этот шаг ранее с теми же свойствами, поэтому он не начнется снова.