1
votes

Comment arrêter correctement l'application grand public Spring-Kafka

J'ai implémenté l'application grand public spring-kafka .

Je souhaite un arrêt progressif des applications grand public.

l'application consommateur actuelle se termine par la commande Linux kill -9 pid

J'utilise l'annotation @KafkaListener maintenant.

Si je quitte l'application Spring Boot, je souhaite fermer le consommateur de manière fiable, que dois-je faire?


J'utilise @Predestory pour quitter de manière fiable l'application Spring Boot, mais je ne sais pas si cela a quelque chose à voir avec cela.


0 commentaires

3 Réponses :


2
votes

Si vous souhaitez arrêter un seul consommateur, appelez simplement stop () sur le conteneur d'écoute.


Notez que lorsque vous appelez stop () , le conteneur traitera tous les enregistrements qui ont été extraits de poll () jusqu'à ce point, avant que le conteneur ne s'arrête.


0 commentaires

2
votes

kill -9 est comme l'étoile de la mort

     Some of the more commonly used signals:

     1       HUP (hang up)
     2       INT (interrupt)
     3       QUIT (quit)
     6       ABRT (abort)
     9       KILL (non-catchable, non-ignorable kill)
     14      ALRM (alarm clock)
     15      TERM (software termination signal)

Le signal de destruction par défaut SIGTERM (15)

kill

Le démarrage arrêtera tout gracieusement; il enregistre un hook d'arrêt, qui ne peut pas intercepter un kill -9 .


0 commentaires

0
votes

Ok, je vais mettre ici mes pensées à ce sujet. Soit kill provoquera une interruption du thread. Ce n'est pas grave, lorsque le consommateur de message est monothread. Mais dans le cas où le traitement des messages utilise des threads à l'intérieur (ou des exécuteurs, tout ce qui fonctionne dans différents threads), ceux-ci intercepteront également l'interruption. Et aucun moyen de l'empêcher.

Dans le cas du mode batch, il est même difficile de suivre le décalage correct, car certains messages ont été traités, et certains - non. Il existe donc une autre approche: dites au consommateur d'arrêter d'écouter mais de terminer le traitement ou les éléments interrogés à cette étape. Nous ne devons donc utiliser aucune des interruptions, mais l'arrêt doit être une commande programmatique de l'application.


0 commentaires