1. Gambaran keseluruhan
Matlamat Spring Cloud Task adalah untuk menyediakan fungsi membuat perkhidmatan mikro jangka pendek untuk aplikasi Spring Boot .
Dalam Spring Cloud Task, kami mendapat fleksibiliti menjalankan tugas apa pun secara dinamis, memperuntukkan sumber berdasarkan permintaan dan mendapatkan hasilnya setelah Task selesai.
Tasks adalah primitif baru dalam Spring Cloud Data Flow yang membolehkan pengguna melaksanakan hampir semua aplikasi Spring Boot sebagai tugas jangka pendek .
2. Membangunkan Aplikasi Tugas Ringkas
2.1. Menambah Ketergantungan yang Berkaitan
Untuk memulakan, kita boleh menambah bahagian pengurusan kebergantungan dengan spring-cloud-task-dependencies:
org.springframework.cloud spring-cloud-task-dependencies 2.2.3.RELEASE pom import
Pengurusan kebergantungan ini menguruskan versi kebergantungan melalui skop import.
Kita perlu menambahkan kebergantungan berikut:
org.springframework.cloud spring-cloud-starter-task org.springframework.cloud spring-cloud-task-core
Ini adalah pautan ke Maven Central of spring-cloud-task-core .
Sekarang, untuk memulakan aplikasi Spring Boot kami, kami memerlukan spring-boot-starter dengan ibu bapa yang berkenaan.
Kami akan menggunakan Spring Data JPA sebagai alat ORM, jadi kami juga perlu menambahkan kebergantungan untuk itu:
org.springframework.boot spring-boot-starter-data-jpa 2.2.6.RELEASE
Perincian bootstrap aplikasi Spring Boot sederhana dengan Spring Data JPA boleh didapati di sini.
Kami boleh menyemak versi terbaru spring-boot-starter-parent o n Maven Central.
2.2. The @EnableTask Anotasi
Untuk memacu fungsi Spring Cloud Task, kita perlu menambahkan anotasi @EnableTask :
@SpringBootApplication @EnableTask public class TaskDemo { // ... }
Anotasi membawa kelas SimpleTaskConfiguration dalam gambar yang seterusnya mendaftarkan TaskRepository dan infrastrukturnya . Secara lalai, peta dalam memori digunakan untuk menyimpan status TaskRepository .
Maklumat utama TaskRepository dimodelkan di kelas TaskExecution . Medan yang diperhatikan dalam kelas ini adalah taskName , startTime , endTime , exitMessage . The exitMessage menyimpan maklumat yang ada pada masa keluar.
Sekiranya jalan keluar disebabkan oleh kegagalan dalam sebarang keadaan aplikasi, jejak pengecualian lengkap akan disimpan di sini.
Spring Boot menyediakan antara muka ExitCodeExceptionMapper yang memetakan pengecualian yang tidak tertangkap untuk keluar dari kod yang membolehkan meneliti debug . Cloud Task menyimpan maklumat dalam sumber data untuk analisis masa depan.
2.3. Mengkonfigurasi Sumber Data untuk TaskRepository
Peta dalam memori untuk menyimpan TaskRepository akan hilang setelah tugas berakhir dan kami akan kehilangan data yang berkaitan dengan peristiwa Tugas. Untuk menyimpan di simpanan tetap, kami akan menggunakan MySQL sebagai sumber data dengan Spring Data JPA.
Sumber data dikonfigurasikan dalam file application.yml . Untuk mengkonfigurasi Spring Cloud Task untuk menggunakan sumber data yang disediakan sebagai penyimpanan TaskRepository , kita perlu membuat kelas yang memperluas DefaultTaskConfigurer .
Sekarang, kita boleh menghantar Sumber Data yang dikonfigurasi sebagai argumen konstruktor kepada pembina superclass:
@Autowired private DataSource dataSource; public class HelloWorldTaskConfigurer extends DefaultTaskConfigurer{ public HelloWorldTaskConfigurer(DataSource dataSource){ super(dataSource); } }
Untuk mempunyai konfigurasi di atas dalam tindakan, kita perlu memberi anotasi pada contoh DataSource dengan anotasi @Autowired dan menyuntikkan instance sebagai argumen konstruktor kacang HelloWorldTaskConfigurer yang ditentukan di atas:
@Bean public HelloWorldTaskConfigurer getTaskConfigurer() { return new HelloWorldTaskConfigurer(dataSource); }
Ini menyelesaikan konfigurasi untuk menyimpan TaskRepository ke pangkalan data MySQL.
2.4. Pelaksanaan
Dalam Spring Boot, kami dapat melaksanakan Tugas apa saja sebelum aplikasi selesai dimulakan. Kita boleh menggunakan antara muka ApplicationRunner atau CommandLineRunner untuk membuat Tugas yang mudah.
Kita perlu menerapkan kaedah menjalankan antara muka ini dan menyatakan kelas pelaksana sebagai kacang:
@Component public static class HelloWorldApplicationRunner implements ApplicationRunner { @Override public void run(ApplicationArguments arg0) throws Exception { System.out.println("Hello World from Spring Cloud Task!"); } }
Sekarang, jika kita menjalankan aplikasi kita, kita harus membuat tugas kita menghasilkan output yang diperlukan dengan jadual yang diperlukan dibuat dalam pangkalan data MySQL kami mencatat data peristiwa dari Tugas tersebut.
3. Kitaran hidup Tugas Awan Musim Semi
Pada mulanya, kami membuat entri di TaskRepository . Ini adalah petunjuk bahawa semua kacang siap digunakan dalam Aplikasi dan kaedah menjalankan antara muka Runner siap untuk dilaksanakan.
Setelah selesai pelaksanaan jangka kaedah atau dalam apa-apa kegagalan ApplicationContext acara, TaskRepository akan dikemas kini dengan entri yang lain.
Semasa kitaran hidup tugas, kita dapat mendaftarkan pendengar yang tersedia dari antara muka TaskExecutionListener . Kami memerlukan kelas yang melaksanakan antara muka yang mempunyai tiga kaedah - onTaskEnd , onTaksFailed dan onTaskStartup yang dicetuskan dalam setiap peristiwa Tugasan.
Kita perlu menyatakan biji kelas pelaksana di kelas TaskDemo kami :
@Bean public TaskListener taskListener() { return new TaskListener(); }
4. Integrasi Dengan Spring Batch
We can execute Spring Batch Job as a Task and log events of the Job execution using Spring Cloud Task. To enable this feature we need to add Batch dependencies pertaining to Boot and Cloud:
org.springframework.boot spring-boot-starter-batch org.springframework.cloud spring-cloud-task-batch
Here is the link to the Maven Central of spring-cloud-task-batch.
To configure a job as a Task we need to have the Job bean registered in the JobConfiguration class:
@Bean public Job job2() { return jobBuilderFactory.get("job2") .start(stepBuilderFactory.get("job2step1") .tasklet(new Tasklet(){ @Override public RepeatStatus execute( StepContribution contribution, ChunkContext chunkContext) throws Exception { System.out.println("This job is from Baeldung"); return RepeatStatus.FINISHED; } }).build()).build(); }
We need to decorate the TaskDemo class with @EnableBatchProcessing annotation:
//..Other Annotation.. @EnableBatchProcessing public class TaskDemo { // ... }
The @EnableBatchProcessing annotation enables Spring Batch features with a base configuration required to set up batch jobs.
Now, if we run the application, the @EnableBatchProcessing annotation will trigger the Spring Batch Job execution and Spring Cloud Task will log the events of the executions of all batch jobs with the other Task executed in the springcloud database.
5. Launching a Task from Stream
We can trigger Tasks from Spring Cloud Stream. To serve this purpose, we have the @EnableTaskLaucnher annotation. Once, we add the annotation with Spring Boot app, a TaskSink will be available:
@SpringBootApplication @EnableTaskLauncher public class StreamTaskSinkApplication { public static void main(String[] args) { SpringApplication.run(TaskSinkApplication.class, args); } }
The TaskSink receives the message from a stream that contains a GenericMessage containing TaskLaunchRequest as a payload. Then it triggers a Task-based on co-ordinate provided in the Task launch request.
To have TaskSink functional, we require a bean configured that implements TaskLauncher interface. For testing purpose, we're mocking the implementation here:
@Bean public TaskLauncher taskLauncher() { return mock(TaskLauncher.class); }
We need to note here that the TaskLauncher interface is only available after adding the spring-cloud-deployer-local dependency:
org.springframework.cloud spring-cloud-deployer-local 2.3.1.RELEASE
We can test whether the Task launched by invoking input of the Sink interface:
public class StreamTaskSinkApplicationTests { @Autowired private Sink sink; // }
Sekarang, kami membuat contoh TaskLaunchRequest dan menghantarnya sebagai muatan objek GenericMessage . Kemudian kita boleh meminta saluran input dari Sink menyimpan objek GenericMessage dalam saluran.
6. Kesimpulannya
Dalam tutorial ini, kami telah meneroka bagaimana prestasi Spring Cloud Task dan bagaimana mengkonfigurasinya untuk mencatat peristiwa dalam pangkalan data. Kami juga memerhatikan bagaimana tugas Spring Batch ditakrifkan dan disimpan di TaskRepository . Terakhir, kami menerangkan bagaimana kami dapat mencetuskan Task dari dalam Spring Cloud Stream.
Seperti biasa, kodnya tersedia di GitHub.