Uma introdução à tarefa do Spring Cloud
1. Visão geral
The goal of Spring Cloud Task is to provide the functionality of creating short-lived microservices for Spring Boot application.
No Spring Cloud Task, temos a flexibilidade de executar qualquer tarefa dinamicamente, alocando recursos sob demanda e recuperando os resultados após a conclusão da tarefa.
Tasks is a new primitive within Spring Cloud Data Flow allowing users to execute virtually any Spring Boot application as a short-lived task.
2. Desenvolvendo um aplicativo de tarefa simples
2.1. Adicionando Dependências Relevantes
Para começar, podemos adicionar a seção de gerenciamento de dependência comspring-cloud-task-dependencies:
org.springframework.cloud
spring-cloud-task-dependencies
1.2.2.RELEASE
pom
import
Esse gerenciamento de dependências gerencia versões de dependências por meio do escopo de importação.
Precisamos adicionar as seguintes dependências:
org.springframework.cloud
spring-cloud-starter-task
org.springframework.cloud
spring-cloud-task-core
This é o link para a Central Maven despring-cloud-task-core.
Agora, para iniciar nosso aplicativo Spring Boot, precisamos despring-boot-starter com o pai relevante.
Usaremos Spring Data JPA como uma ferramenta ORM, então precisamos adicionar a dependência para isso também:
org.springframework.boot
spring-boot-starter-data-jpa
1.5.10
Os detalhes de inicialização de um aplicativo Spring Boot simples com Spring Data JPA estão disponíveishere.
Podemos verificar a versão mais recente dospring-boot-starter-parent onMaven Central.
2.2. A anotação@EnableTask
Para inicializar a funcionalidade do Spring Cloud Task, precisamos adicionar a anotação@EnableTask:
@SpringBootApplication
@EnableTask
public class TaskDemo {
// ...
}
The annotation brings SimpleTaskConfiguration class in the picture which in turns registers the TaskRepository and its infrastructure. Por padrão, um mapa na memória é usado para armazenar o status deTaskRepository.
A informação primária deTaskRepository é modelada na classeTaskExecution. Os campos observados desta classe sãotaskName,startTime,endTime,exitMessage. OexitMessage armazena as informações disponíveis no momento de saída.
Se uma saída for causada por uma falha em qualquer evento do aplicativo, o rastreamento completo da pilha de exceções será armazenado aqui.
Spring Boot provides an interface ExitCodeExceptionMapper which maps uncaught exceptions to exit codes allowing scrutinized debug. A Tarefa em nuvem armazena as informações na fonte de dados para análise futura.
2.3. Configurando umDataSource paraTaskRepository
O mapa na memória para armazenar oTaskRepository desaparecerá assim que a tarefa terminar e perderemos dados relacionados aos eventos da Tarefa. Para armazenar em um armazenamento permanente, vamos usar o MySQL como uma fonte de dados com Spring Data JPA.
A fonte de dados é configurada no arquivoapplication.yml. Para configurar o Spring Cloud Task para usar a fonte de dados fornecida como um armazenamento deTaskRepository, precisamos criar uma classe que estendaDefaultTaskConfigurer.
Agora, podemos enviarDatasource configurado como um argumento do construtor para o construtor da superclasse:
@Autowired
private DataSource dataSource;
public class HelloWorldTaskConfigurer extends DefaultTaskConfigurer{
public HelloWorldTaskConfigurer(DataSource dataSource){
super(dataSource);
}
}
Para ter a configuração acima em ação, precisamos anotar uma instância deDataSource com a anotação@Autowired e injetar a instância como argumento-construtor de um beanHelloWorldTaskConfigurer definido acima:
@Bean
public HelloWorldTaskConfigurer getTaskConfigurer() {
return new HelloWorldTaskConfigurer(dataSource);
}
Isso completa a configuração para armazenarTaskRepository no banco de dados MySQL.
2.4. Implementação
No Spring Boot,we can execute any Task just before application finishes its startup. podemos usar as interfacesApplicationRunner ouCommandLineRunner para criar uma tarefa simples.
Precisamos implementar o métodorun dessas interfaces e declarar a classe de implementação como um bean:
@Component
public static class HelloWorldApplicationRunner
implements ApplicationRunner {
@Override
public void run(ApplicationArguments arg0) throws Exception {
System.out.println("Hello World from Spring Cloud Task!");
}
}
Agora, se executarmos nosso aplicativo, deveremos obter nossa tarefa produzindo a saída necessária com as tabelas necessárias criadas em nosso banco de dados MySQL, registrando os dados do evento da Tarefa.
3. Ciclo de vida de uma tarefa Spring Cloud
No início, criamos uma entrada noTaskRepository. Esta é a indicação de que todos os beans estão prontos para serem usados no aplicativo e o métodorun da interface do Runner está pronto para ser executado.
Após a conclusão da execução do métodorun ou em qualquer falha do eventoApplicationContext,TaskRepository será atualizado com outra entrada.
During the task life-cycle, we can register listeners available from TaskExecutionListener interface. Precisamos de uma classe implementando a interface com três métodos -onTaskEnd,onTaksFailedeonTaskStartup acionados nos respectivos eventos da Tarefa.
Precisamos declarar o bean da classe de implementação em nossa classeTaskDemo:
@Bean
public TaskListener taskListener() {
return new TaskListener();
}
4. Integração com Spring Batch
Podemos executar o Trabalho em lote do Spring como uma tarefa e registrar eventos da execução do trabalho usando o Spring Cloud Task. Para habilitar esse recurso, precisamos adicionar dependências em lote pertencentes ao Boot e Cloud:
org.springframework.boot
spring-boot-starter-batch
org.springframework.cloud
spring-cloud-task-batch
Here é o link para a Central Maven despring-cloud-task-batch.
Para configurar um trabalho como Tarefa, precisamos ter o bean Job registrado na classeJobConfiguration:
@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 example");
return RepeatStatus.FINISHED;
}
}).build()).build();
}
We need to decorate the TaskDemo class with @EnableBatchProcessing annotation:
//..Other Annotation..
@EnableBatchProcessing
public class TaskDemo {
// ...
}
A anotação@EnableBatchProcessing ativa os recursos do Spring Batch com uma configuração básica necessária para definir trabalhos em lote.
Agora, se executarmos o aplicativo, a anotação@EnableBatchProcessing acionará a execução do Spring Batch Job e o Spring Cloud Task registrará os eventos das execuções de todos os jobs batch com a outra tarefa executada no banco de dadosspringcloud .
5. Lançando uma Tarefa do Stream
Podemos acionar tarefas do Spring Cloud Stream. Para atender a esse propósito, temos a anotação@EnableTaskLaucnher. Depois de adicionar a anotação ao aplicativo Spring Boot, um TaskSink estará disponível:
@SpringBootApplication
@EnableTaskLauncher
public class StreamTaskSinkApplication {
public static void main(String[] args) {
SpringApplication.run(TaskSinkApplication.class, args);
}
}
OTaskSink recebe a mensagem de um fluxo que contémGenericMessage contendoTaskLaunchRequest como carga útil. Em seguida, ele dispara uma coordenada baseada em tarefas fornecida na solicitação de inicialização da tarefa.
To have TaskSink functional, we require a bean configured that implements TaskLauncher interface. Para fins de teste, estamos simulando a implementação aqui:
@Bean
public TaskLauncher taskLauncher() {
return mock(TaskLauncher.class);
}
Precisamos observar aqui que a interfaceTaskLauncher só está disponível após adicionar a dependênciaspring-cloud-deployer-local:
org.springframework.cloud
spring-cloud-deployer-local
1.3.1.RELEASE
Podemos testar se a tarefa foi iniciada invocandoinput da interfaceSink:
public class StreamTaskSinkApplicationTests {
@Autowired
private Sink sink;
//
}
Agora, criamos uma instância deTaskLaunchRequeste enviamos como uma carga útil do objetoGenericMessage<TaskLaunchRequest>. Então podemos invocar o canalinput deSink mantendo o objetoGenericMessage no canal.
6. Conclusão
Neste tutorial, exploramos o desempenho do Spring Cloud Task e como configurá-lo para registrar seus eventos em um banco de dados. Também observamos como a tarefa do Spring Batch é definida e armazenada emTaskRepository. Por fim, explicamos como podemos acionar a Tarefa no Spring Cloud Stream.
Como sempre, o código está disponívelover on GitHub.