Lot de printemps avec Rabbit MQ

De nos jours, le traitement par lots est une tâche très courante effectuée par les organisations pour traiter de gros volumes d'enregistrements pour des tâches telles que la journalisation/le traçage, la gestion des transactions, les statistiques de traitement des travaux, etc. Lorsque vous travaillez avec des données étendues, rien ne garantit que les entrées proviendront d'une autre application Java ou même d'une base de données. En fait, il est très probable qu'il doive fonctionner avec des bus de messages et des files d'attente pour le traitement par lots. Et voici que Spring Batch vient à la rescousse !!
Spring Batch fournit des lecteurs utiles lorsque vous travaillez avec des files d'attente de messagerie, à savoir JmsItemReader et AmqpItemReader.
Cet article va se concentrer sur le traitement par lots et une file d'attente de messagerie avec relativement peu d'effort en utilisant Spring Batch avec Rabbit MQ.
Qu'est-ce que RabbitMQ ?
RabbitMQ est un courtier de messages léger, fiable, évolutif et portable. Mais contrairement à de nombreux courtiers de messages familiers aux développeurs Java, il n'est pas basé sur JMS. Au lieu de cela, vos applications communiquent avec lui via un protocole de niveau filaire neutre sur la plate-forme : le protocole AMQP (Advanced Message Queuing Protocol).
Dans le cas du traitement par lots, cela est particulièrement utile – même si vous envoyez des messages à partir d'une autre application Java, vous pouvez éviter les maux de tête liés à l'envoi de POJO sur le fil, nécessitant un modèle cohérent entre plusieurs applications. C'est-à-dire que l'envoi et la réception de chaînes sont beaucoup plus flexibles.
Les prérequis
- RabbitMQ doivent être installés dans un endroit accessible à ce projet.
- Spring boot project using Spring Tool Suite.
Dependencies
Dans votre POM, veillez à inclure parmi vos dépendances les artefacts suivants :
... ... org.springframework.boot spring-boot-starter-batch ... org.springframework.boot spring-boot-starter-amqp
Configuration
Comme il s'agit de Spring Boot, vous aurez besoin d'un point d'entrée pour l'application. Assurez-vous donc d'inclure une classe telle que celle ci-dessous dans src/main/java :
@SpringBootApplication classe publique MyBatchApplication { public static void main(String[] args) { SpringApplication.run(MyBatchApplication.class, args); } }
nous devons mettre en place une configuration globale pour le projet
@Configuration @EnableBatchProcessing classe publique MyBatchAppConfig { }
Remarquez l'annotation @EnableBatchProcessing. Ceci est obligatoire pour informer Spring Boot de prendre en charge une grande partie du gros du travail lors de la configuration de Spring Batch.
Configurez une file d'attente de messages à l'aide de Spring AMQP, qui fournira également le modèle nécessaire pour aider à interagir avec la file d'attente.
import org.springframework.amqp.core.Queue ; importer org.springframework.amqp.rabbit.connection.ConnectionFactory; importer org.springframework.amqp.rabbit.core.RabbitTemplate ; importer org.springframework.beans.factory.annotation.Autowired ; importer org.springframework.context.annotation.Bean; ... public final static String queueName = "my-queue"; @Autowired private ConnectionFactory rabbitConnectionFactory; // cela créera une nouvelle file d'attente si elle n'existe pas ; sinon, il utilisera celui existant du même nom // ...le deuxième argument signifie rendre la file d'attente 'durable' @Haricot File d'attente publique myQueue() { return new Queue(fileName, true); } // ceci est nécessaire pour les opérations avec Spring AMQP @Haricot public RabbitTemplate getMyQueueTemplate() { Modèle RabbitTemplate = new RabbitTemplate(this.rabbitConnectionFactory); template.setQueue(fileName); modèle de retour ;
Configuration de l'étape d'un travail par lots, c'est-à-dire ce qui se passe pour chaque élément de données consommé, en supposant que nous utilisons traitement par blocs et pas une tâche.
import org.springframework.batch.core.Step ; importer org.springframework.batch.core.configuration.annotation.StepBuilderFactory ; importer org.springframework.batch.item.ItemProcessor; importer org.springframework.batch.item.ItemReader ; importer org.springframework.batch.item.ItemWriter; importer org.springframework.batch.item.amqp.AmqpItemReader ; ... @Autowired privé StepBuilderFactory stepBuilderFactory; ... @Haricot étape publique getMyJobStep() { retourner this.stepBuilderFactory.get("myJobStep") .morceau(1) .reader(this.getMyReader()) .processor(this.getMyProcessor()) .writer(this.getMyWriter()) .construire(); } @Haricot public ItemReader getMyReader() { renvoie un nouveau AmqpItemReader (this.getMyQueueTemplate()); } @Haricot public ItemProcessor getMyProcessor() { renvoyer un nouveau MessageProcessor(); } @Haricot public ItemWriter getMyWriter() { renvoie un nouveau MessageWriter(); }
Le AmqpItemReaderqui nous indique qu'il s'attend à ce qu'une chaîne représente chaque message de la file d'attente, prend le modèle de file d'attente que nous avons créé précédemment comme argument. Le AmqpItemReader est une classe fournie avec Spring Batch prêt à l'emploi – aucun autre travail n'est nécessaire pour le faire fonctionner ! C'est la magie de Spring Batch !
Conclusion
Nous avons examiné comment votre projet Spring Batch accepte les entrées d'une file d'attente de messages basée sur AMQP avec une configuration minimale.
Et oui, c'est tout. !! Nous sommes prêts à rouler.
Source link