diff --git a/.github/actions/build-sample-app/action.yml b/.github/actions/build-sample-app/action.yml index 7ecafd5..ccb7e89 100644 --- a/.github/actions/build-sample-app/action.yml +++ b/.github/actions/build-sample-app/action.yml @@ -38,6 +38,10 @@ inputs: docker-images-override: description: 'csv of docker image tags to use when pushing (parallel array to docker-images)' required: false + java-version: + description: 'Java Version. Default is 8' + required: false + default: '8' runs: using: "composite" steps: @@ -49,8 +53,7 @@ runs: - uses: actions/setup-java@v2 with: - distribution: adopt - java-version: 8 + java-version: ${{ inputs.java-version }} cache: maven - name: Maven build diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 48e6bad..a5cd683 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -321,8 +321,8 @@ jobs: docker-push: ${{ inputs.maven-build-only != true }} docker-username: ${{ secrets.DOCKERHUB_USERNAME }} docker-password: ${{ secrets.DOCKERHUB_TOKEN }} - docker-images: >- - springcloudtask/timestamp-task:2.0.2 + java-version: '17' + docker-images: 'springcloudtask/timestamp-task:3.0.0' timestamp-batch: runs-on: ubuntu-latest @@ -337,5 +337,5 @@ jobs: docker-push: ${{ inputs.maven-build-only != true }} docker-username: ${{ secrets.DOCKERHUB_USERNAME }} docker-password: ${{ secrets.DOCKERHUB_TOKEN }} - docker-images: >- - springcloudtask/timestamp-batch-task:2.0.2 + java-version: '17' + docker-images: 'springcloudtask/timestamp-batch-task:3.0.0' diff --git a/timestamp-batch/build-timestamp-batch-image.sh b/timestamp-batch/build-timestamp-batch-image.sh index b6fbd43..06a3360 100755 --- a/timestamp-batch/build-timestamp-batch-image.sh +++ b/timestamp-batch/build-timestamp-batch-image.sh @@ -1,6 +1,6 @@ #!/bin/bash if [ "$TIMESTAMP_BATCH_TASK_VERSION" = "" ]; then - TIMESTAMP_BATCH_TASK_VERSION=2.0.2 + TIMESTAMP_BATCH_TASK_VERSION=3.0.0 fi ./mvnw -o clean install -DskipTests ./mvnw -o spring-boot:build-image -DskipTests -Dspring-boot.build-image.imageName=springcloud/timestamp-batch-task:$TIMESTAMP_BATCH_TASK_VERSION diff --git a/timestamp-batch/pom.xml b/timestamp-batch/pom.xml index 29769ec..9e09069 100644 --- a/timestamp-batch/pom.xml +++ b/timestamp-batch/pom.xml @@ -5,18 +5,18 @@ org.springframework.boot spring-boot-starter-parent - 2.7.5 + 3.0.5 io.spring timestamp-batch-task - 2.0.2 - timestamp-task + 3.0.0 + timestamp-batch-task Simple Timestamp sample. 8 - 2021.0.5 + 2022.0.2 diff --git a/timestamp-batch/src/main/java/io/spring/BatchJobApplication.java b/timestamp-batch/src/main/java/io/spring/BatchJobApplication.java index 9c164b6..ff7fe10 100644 --- a/timestamp-batch/src/main/java/io/spring/BatchJobApplication.java +++ b/timestamp-batch/src/main/java/io/spring/BatchJobApplication.java @@ -16,17 +16,43 @@ package io.spring; -import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; +import org.springframework.batch.core.Job; +import org.springframework.batch.core.JobParameters; +import org.springframework.batch.core.launch.JobLauncher; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.task.configuration.EnableTask; +import org.springframework.context.annotation.Bean; @EnableTask @SpringBootApplication -@EnableBatchProcessing public class BatchJobApplication { - public static void main(String[] args) { - SpringApplication.run(BatchJobApplication.class, args); - } + public static void main(String[] args) { + SpringApplication.run(BatchJobApplication.class, args); + } + + @Bean + public TimestampTask timestampTask(JobLauncher jobLauncher, Job job1, Job job2) { + return new TimestampTask(jobLauncher, job1, job2); + } + + public static class TimestampTask implements CommandLineRunner { + private final JobLauncher launcher; + private final Job job1; + private final Job job2; + + public TimestampTask(JobLauncher launcher, Job job1, Job job2) { + this.launcher = launcher; + this.job1 = job1; + this.job2 = job2; + } + + @Override + public void run(String... strings) throws Exception { + launcher.run(job1, new JobParameters()); + launcher.run(job2, new JobParameters()); + } + } } diff --git a/timestamp-batch/src/main/java/io/spring/configuration/TimestampBatchTaskConfiguration.java b/timestamp-batch/src/main/java/io/spring/configuration/TimestampBatchTaskConfiguration.java index be1b5e2..66418f1 100644 --- a/timestamp-batch/src/main/java/io/spring/configuration/TimestampBatchTaskConfiguration.java +++ b/timestamp-batch/src/main/java/io/spring/configuration/TimestampBatchTaskConfiguration.java @@ -16,103 +16,83 @@ package io.spring.configuration; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.Date; - -import javax.sql.DataSource; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; - import org.springframework.batch.core.Job; -import org.springframework.batch.core.configuration.annotation.BatchConfigurer; -import org.springframework.batch.core.configuration.annotation.DefaultBatchConfigurer; -import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; -import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; +import org.springframework.batch.core.Step; +import org.springframework.batch.core.configuration.support.DefaultBatchConfiguration; +import org.springframework.batch.core.job.builder.JobBuilder; import org.springframework.batch.core.repository.JobRepository; -import org.springframework.batch.core.repository.support.JobRepositoryFactoryBean; +import org.springframework.batch.core.step.builder.StepBuilder; +import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.repeat.RepeatStatus; -import org.springframework.beans.factory.BeanCreationException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; -import org.springframework.jdbc.datasource.DataSourceTransactionManager; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; import org.springframework.transaction.PlatformTransactionManager; +import javax.sql.DataSource; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + @Configuration @EnableConfigurationProperties({ TimestampBatchTaskProperties.class }) -public class TimestampBatchTaskConfiguration { +public class TimestampBatchTaskConfiguration extends DefaultBatchConfiguration { private static final Log logger = LogFactory.getLog(TimestampBatchTaskProperties.class); - @Autowired - public JobBuilderFactory jobBuilderFactory; - - @Autowired - public StepBuilderFactory stepBuilderFactory; @Autowired private TimestampBatchTaskProperties config; + @Bean + @ConditionalOnProperty(name = "spring.datasource.driver-class-name", matchIfMissing = true) + public DataSource dataSource() { + return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2) + .addScript("/org/springframework/batch/core/schema-h2.sql") + .generateUniqueName(true).build(); + } /** * Override default transaction isolation level 'ISOLATION_REPEATABLE_READ' which Oracle does not * support. */ - @Configuration - @ConditionalOnProperty(value = "spring.datasource.driver", havingValue = "oracle.jdbc.OracleDriver") - static class OracleBatchConfig { - @Bean - BatchConfigurer oracleBatchConfigurer(DataSource dataSource) { - return new DefaultBatchConfigurer() { - @Override - public JobRepository getJobRepository() { - JobRepositoryFactoryBean factoryBean = new JobRepositoryFactoryBean(); - factoryBean.setDatabaseType("ORACLE"); - factoryBean.setDataSource(dataSource); - factoryBean.setTransactionManager(getTransactionManager()); - factoryBean.setIsolationLevelForCreate("ISOLATION_READ_COMMITTED"); - try { - return factoryBean.getObject(); - } - catch (Exception e) { - throw new BeanCreationException(e.getMessage(), e); - } - } - @Override - public DataSourceTransactionManager getTransactionManager() { - return new DataSourceTransactionManager(dataSource); - } - }; - } + @Bean + public Step job1step1(JobRepository jobRepository, PlatformTransactionManager springCloudTaskTransactionManager) { + return new StepBuilder("job1step1", jobRepository) + .tasklet(getTasklet("Job1 was run with date %s"), springCloudTaskTransactionManager).build(); + } + + private Tasklet getTasklet(String format) { + return (contribution, chunkContext) -> { + DateFormat dateFormat = new SimpleDateFormat(config.getFormat()); + logger.info(String.format(format, dateFormat.format(new Date()))); + return RepeatStatus.FINISHED; + }; } @Bean - public Job job1() { - return jobBuilderFactory.get("job1") - .start(stepBuilderFactory.get("job1step1") - .tasklet((contribution, chunkContext) -> { - DateFormat dateFormat = new SimpleDateFormat(config.getFormat()); - logger.info(String.format("Job1 was run with date %s", dateFormat.format(new Date()))); - return RepeatStatus.FINISHED; - }) - .build()) + public Job job1(JobRepository jobRepository, Step job1step1) { + return new JobBuilder("job1", jobRepository) + .start(job1step1) .build(); } - @Bean - public Job job2() { - return jobBuilderFactory.get("job2") - .start(stepBuilderFactory.get("job2step1") - .tasklet((contribution, chunkContext) -> { - DateFormat dateFormat = new SimpleDateFormat(config.getFormat()); - logger.info(String.format("Job2 was run with date %s", dateFormat.format(new Date()))); - return RepeatStatus.FINISHED; - }) - .build()) + public Step job2step1(JobRepository jobRepository, + PlatformTransactionManager springCloudTaskTransactionManager + ) { + return new StepBuilder("job2step1", jobRepository) + .tasklet(getTasklet("Job2 was run with date %s"), springCloudTaskTransactionManager) + .build(); + } + @Bean + public Job job2(JobRepository jobRepository, Step job2step1) { + return new JobBuilder("job2", jobRepository) + .start(job2step1) .build(); } diff --git a/timestamp-batch/src/main/resources/application.properties b/timestamp-batch/src/main/resources/application.properties index 398a1dc..cd507fc 100644 --- a/timestamp-batch/src/main/resources/application.properties +++ b/timestamp-batch/src/main/resources/application.properties @@ -1 +1 @@ -logging.level.org.springframework.cloud.task=debug +logging.level.org.springframework.cloud.task=debug \ No newline at end of file diff --git a/timestamp-batch/src/test/java/io/spring/TimestampBatchTaskTests.java b/timestamp-batch/src/test/java/io/spring/TimestampBatchTaskTests.java index fa18d41..cc41519 100644 --- a/timestamp-batch/src/test/java/io/spring/TimestampBatchTaskTests.java +++ b/timestamp-batch/src/test/java/io/spring/TimestampBatchTaskTests.java @@ -21,6 +21,7 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.system.CapturedOutput; import org.springframework.boot.test.system.OutputCaptureExtension; @@ -32,6 +33,7 @@ import static org.assertj.core.api.Assertions.assertThat; * @author Glenn Renfro */ @ExtendWith(OutputCaptureExtension.class) +@SpringBootTest public class TimestampBatchTaskTests { @Test diff --git a/timestamp-task/pom.xml b/timestamp-task/pom.xml index 9c20437..038cfec 100644 --- a/timestamp-task/pom.xml +++ b/timestamp-task/pom.xml @@ -5,18 +5,18 @@ org.springframework.boot spring-boot-starter-parent - 2.7.5 + 3.0.5 io.spring timestamp-task - 2.0.2 + 3.0.0 timestamp-task Simple Timestamp sample. 8 - 2021.0.5 + 2022.0.2