To finish our application, we need to create a single Java file. Maven will compile the
sources from src/main/java
by default so you need to create that folder structure. Then
add a file named src/main/java/com/example/SampleTask.java
:
package com.example; import org.springframework.boot.*; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.task.configuration.EnableTask; import org.springframework.context.annotation.Bean; @SpringBootApplication @EnableTask public class SampleTask { @Bean public CommandLineRunner commandLineRunner() { return new HelloWorldCommandLineRunner(); } public static void main(String[] args) { SpringApplication.run(SampleTask.class, args); } public static class HelloWorldCommandLineRunner implements CommandLineRunner { @Override public void run(String... strings) throws Exception { System.out.println("Hello World!"); } } }
While it may not look like much, quite a bit is going on. To read more about the Spring Boot specifics, take a look at their reference documentation here: http://docs.spring.io/spring-boot/docs/current/reference/html/
We’ll also need to create an application.properties
in src/main/resources
. We’ll
configure two properties in it: the application name (which is translated to the task name)
and we’ll set the logging for spring cloud task to DEBUG
so that we can see what’s going
on:
logging.level.org.springframework.cloud.task=DEBUG spring.application.name=helloWorld
The first non boot annotation in our example is the @EnableTask
annotation. This class
level annotation tells Spring Cloud Task to bootstrap it’s functionality. This occurs by
importing an additional configuration class, SimpleTaskConfiguration
by default. This
additional configuration registers the TaskRepository
and the infrastructure for its
use.
Out of the box, the TaskRepository
will use an in memory Map
to record the results
of a task. Obviously this isn’t a practical solution for a production environment since
the Map
goes away once the task ends. However, for a quick getting started
experience we use this as a default as well as echoing to the logs what is being updated
in that repository. Later in this documentation we’ll cover how to customize the
configuration of the pieces provided by Spring Cloud Task.
When our sample application is run, Spring Boot will launch our
HelloWorldCommandLineRunner
outputting our "Hello World!" message to standard out. The
TaskLifecyceListener
will record the start of the task and the end of the task in the
repository.
The main method serves as the entry point to any java application. Our main method
delegates to Spring Boot’s SpringApplication
class. You can read more about it in the
Spring Boot documentation.
In Spring, there are many ways to bootstrap an application’s logic. Spring Boot provides
a convenient method of doing so in an organized manner via their *Runner
interfaces
(CommandLineRunner
or ApplicationRunner
). A well behaved task will bootstrap any
logic via one of these two runners.
The lifecycle of a task is considered from before the *Runner#run
methods are executed
to once they are all complete. Spring Boot allows an application to use multiple
*Runner
implementation and Spring Cloud Task doesn’t attempt to impede on this convention.
Any processing bootstrapped from mechanisms other than a CommandLineRunner
or
ApplicationRunner
(using InitializingBean#afterPropertiesSet
for example) will not be
recorded by Spring Cloud Task.