J'utilise Spring-Kafka version 1.2.1 et, lorsque le serveur Kafka est en panne/inaccessible, le bloc asynchrone envoie des appels pendant un certain temps. Il semble que ce soit le timeout TCP. Le code est quelque chose comme ceci:Printemps Kafka envoyer asynchrone appels bloc
ListenableFuture<SendResult<K, V>> future = kafkaTemplate.send(topic, key, message);
future.addCallback(new ListenableFutureCallback<SendResult<K, V>>() {
@Override
public void onSuccess(SendResult<K, V> result) {
...
}
@Override
public void onFailure(Throwable ex) {
...
}
});
J'ai pris un coup d'oeil très rapide au Code printemps-Kafka et il semble juste passer la tâche le long de la bibliothèque client kafka, traduisant une interaction de rappel à un avenir interaction d'objet. En regardant la bibliothèque cliente de kafka, le code devient plus complexe et je n'ai pas pris le temps de tout comprendre, mais je suppose que cela peut être faire des appels à distance (métadonnées, au moins?) Dans le même thread.
En tant qu'utilisateur, je m'attendais à ce que les méthodes de Spring-Kafka qui retournent un futur reviennent immédiatement, même si le serveur kafka distant est inaccessible.
Toute confirmation si ma compréhension est erronée ou s'il s'agit d'un bug serait la bienvenue. J'ai fini par le rendre asynchrone de mon côté pour le moment.
Un autre problème est que la documentation de Spring-Kafka indique, au début, qu'elle fournit des méthodes d'envoi synchrones et asynchrones. Je n'ai pas trouvé de méthodes qui ne renvoient pas d'avenir, peut-être que la documentation doit être mise à jour.
Je suis heureux de fournir plus de détails si nécessaire. Merci.
Merci pour votre réponse. Non, je n'utilise pas cette annotation, il n'y avait rien dans la documentation. Je vais l'essayer et vous laisser savoir si cela résout le problème. –
L'utilisation de @EnableAsync n'a malheureusement rien changé =/ –