Kotlin is fully interoperable with Spring Boot which makes Spring and Kotlin a perfect companion to one another. Spring brings a high level platform that can be used for making just about any enterprise grade application, while Kotlin offers language features that make your code concise and readable. Both Kotlin and Spring do a great job of reducing boilerplate in your code so that you can write an application quickly and get to the point.
This tutorial is based on Scheduling Tasks found on the Spring website is an adapation of the tutorial for Kotlin. We will be using Kotlin, Spring Boot, and Gradle. You can find the code here.
Project Structure
You should setup your project to use this folder structure.
build.gradle
Here is the full code for your gradle.build file. Notice that will bring in both Kotlin and Spring libraries so that we can build the project.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | buildscript { ext.kotlin_version = '1.2.30' repositories { mavenCentral() } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.springframework.boot:spring-boot-gradle-plugin:2.0.1.RELEASE" } } group 'com.stonesoupprogramming' version '1.0-SNAPSHOT' apply plugin: 'kotlin' apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'idea' apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' repositories { mavenCentral() } bootJar { baseName = 'gs-scheduling-tasks' version = '0.1.0' } sourceCompatibility = 1.8 targetCompatibility = 1.8 dependencies { compile "org.springframework.boot:spring-boot-starter" compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" compile group: 'org.jetbrains.kotlin' , name: 'kotlin-reflect' , version: '1.2.30' testCompile "junit:junit" } compileKotlin { kotlinOptions.jvmTarget = "1.8" } compileTestKotlin { kotlinOptions.jvmTarget = "1.8" } |
SchedulingTasks.kt
Here is the Kotlin code followed by an explanation.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | package com.stonesoupprogramming.schedulingtasks import org.slf4j.LoggerFactory import org.springframework.boot.SpringApplication import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.scheduling.annotation.EnableScheduling import org.springframework.scheduling.annotation.Scheduled import org.springframework.stereotype.Component import java.time.LocalDateTime import java.time.format.DateTimeFormatter /** * Mark this class an injectable component so that the Spring environment will create * an instance of this class when it starts up. */ @Component class ScheduleTasks { private val logger = LoggerFactory.getLogger(ScheduleTasks:: class .java) /** * This @Schedule annotation run every 5 seconds in this case. It can also * take a cron like syntax. */ @Scheduled (fixedRate = 5000 ) fun reportTime(){ logger.info( "The time is now ${DateTimeFormatter.ISO_LOCAL_TIME.format(LocalDateTime.now())}" ) } } @SpringBootApplication //Required to tell Spring to run tasks marked with @Scheduled @EnableScheduling open class Application fun main(args : Array){ SpringApplication.run(Application:: class .java) } |
When run, you will get this output on your console every five seconds.
1 2 | 2018-04-06 18:51:21.868 INFO 20294 --- [pool-1-thread-1] c.s.schedulingtasks.ScheduleTasks : The time is now 18:51:21.865 2018-04-06 18:51:26.858 INFO 20294 --- [pool-1-thread-1] c.s.schedulingtasks.ScheduleTasks : The time is now 18:51:26.858 |
Explanation
So how does the code work? The ScheduleTasks class is annotaded with @Component, which the Spring environment scans for on start up and instantiates the class. At this point, an instance of ScheduleTasks lives in the ApplicationContent. You will notice that the ScheduleTasks::reportTime function is annotated with @Scheduled which defaults to a fix rate or can use a CRON like syntax.
You can’t annotate a method and expect it to run without turning on scheduling. That is why the Application class is annotated with @EnableScheduling. This will tell Spring to scan all container managed classes and look for the @Scheduled annotation. The Spring environment will do the job of making sure that the methods run at the proper time.
Code
You can get the code for this tutorial at my GitHub: https://github.com/archer920/scheduling-tasks
0 komentar: