<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Forum du club des développeurs et IT Pro - Blogs - DimBo2</title>
		<link>https://www.developpez.net/forums/blogs/1773549-dimbo2/</link>
		<description>Developpez.com, le Club des Développeurs et IT Pro</description>
		<language>fr</language>
		<lastBuildDate>Tue, 08 Sep 2026 05:19:29 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>15</ttl>
		<image>
			<url>https://forum.developpez.be/images/misc/rss.jpg</url>
			<title>Forum du club des développeurs et IT Pro - Blogs - DimBo2</title>
			<link>https://www.developpez.net/forums/blogs/1773549-dimbo2/</link>
		</image>
		<item>
			<title><![CDATA[Tutoriel Kafka : De son installation à l'éxécution d'un premier programme en Java]]></title>
			<link>https://www.developpez.net/forums/blogs/1773549-dimbo2/b10097/tutoriel-kafka-installation-l-execution-d-premier-programme-java/</link>
			<pubDate>Tue, 13 Apr 2021 11:36:57 GMT</pubDate>
			<description>*Information* 
Le tutoriel...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><font size="4"><b><font color="#FF0000">Information</font></b></font><hr /><br />
Le tutoriel est également disponible au format developpez.com via le lien <a href="https://dimbo.developpez.com/tutoriels/java/kafka/installation-kafka-et-execution-premier-programme-java/" target="_blank">https://dimbo.developpez.com/tutorie...rogramme-java/</a><br />
<br />
<font size="4"><b>1. Pour commencer : qu’est-ce que Kafka ?</b></font><hr /><br />
<font size="2">Vous pouvez le découvrir sur le site officiel (<a href="https://kafka.apache.org/" target="_blank">https://kafka.apache.org/</a>) ou au travers de ce tutoriel <font color="#0563c1"><u><a href="https://soat.developpez.com/tutoriels/big-data/apprendre-kafka-concepts-fonctionnement/" target="_blank">https://soat.developpez.com/tutoriel...onctionnement/</a>.</u></font></font><br />
<br />
<br />
<font size="4"><b>2. Information et objectif</b></font><hr /><br />
<font size="2">J’ai rencontré plusieurs difficultés en voulant utiliser Kafka avec Java. Ainsi, j’ai souhaité réaliser ce tutoriel pour partager mon expérience avec d’autres personnes qui voudraient mettre en place Kafka.</font><br />
<br />
<font size="2">L’objectif est de pouvoir envoyer un message et le réceptionner à l’aide de la messagerie Kafka en utilisant la langage JAVA.</font><br />
<br />
<font size="2">Ce tutoriel expliquera comment installer Kafka à l'aide de Docker puis lancer un programme.</font><br />
<font size="2">Nous verrons étape par étape comment y arriver...</font><br />
<br />
<font size="2">Limite : Ce tutoriel n’a pas vocation à expliquer le fonctionnement de Kafka.</font><br />
<br />
<font size="4"><b>3. Environnement</b></font><hr /><br />
<font size="3"><b>3.1. Technique</b></font><hr /><br />
<ul><li style="">Système d’exploitation : Windows 10 (il est possible d’utiliser Linux).</li><li style="">Docker pour déployer Kafka.  <br />
  <ul><li style="">Dans ce tutoriel, Docker Desktop de Windows a été utilisé (<font color="#0563c1"><u><a href="https://docs.docker.com/docker-for-windows/install/" target="_blank">https://docs.docker.com/docker-for-windows/install/</a>)</u></font></li><li style="">A savoir : il est nécessaire d’activer la virtualisation dans le Bios et d’installer Linux pour Windows 10 (<font color="#0563c1"><u><a href="https://docs.microsoft.com/fr-fr/windows/wsl/install-win10" target="_blank">https://docs.microsoft.com/fr-fr/win.../install-win10</a></u></font>) </li></ul></li><li style="">Environnement de développement : Eclipse(<font color="#0563c1"><u><a href="https://www.eclipse.org/downloads/" target="_blank">https://www.eclipse.org/</a></u></font>)</li><li style="">Langage : Java avec le Framework Spring et Maven. </li></ul><br />
<br />
<font size="3"><b>3.2. Schéma</b></font><hr /><br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p595572d1618313437/c-cpp/c/calcul-variables-temporelles-millisecondes/tuto-schemaglobal.png/" border="0" alt="Nom : tuto-SchémaGlobal.png
Affichages : 392
Taille : 14,2 Ko"  style="float: CONFIG" /></div><br />
<font size="4"><b>4. Démarrage de l’image docker Kafka</b></font><hr /><br />
<font size="3"><b>4.1. Installation et lancement</b></font><hr /><br />
<ol class="decimal"><li style="">Démarrer Docker</li><li style="">Créer un fichier « docker-compose.yml » dans un répertoire</li><li style="">Copier le contenu ci-dessous dans le fichier <br />
        <div style="text-align: left;">Pour information : Les images utilisées de docker pour Kafka sont :</div><br />
<ul><li style=""><font color="#0563c1"><u><a href="https://hub.docker.com/r/wurstmeister/kafka" target="_blank">https://hub.docker.com/r/wurstmeister/kafka</a></u></font></li><li style=""><font color="#0563c1"><u><a href="https://hub.docker.com/r/kafkamanager/kafka-manager" target="_blank">https://hub.docker.com/_/zookeeper</a></u></font></li><li style=""><font color="#0563c1"><u><a href="https://hub.docker.com/r/kafkamanager/kafka-manager" target="_blank">https://hub.docker.com/r/kafkamanager/kafka-manager</a></u></font> </li></ul><br />
	<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br /></div></td><td valign="top"><pre style="margin: 0">
version: '3.5'

services:
  zookeeper:
	image: zookeeper
	ports: 
	  - &quot;2181:2181&quot;   
  kafka:
	image: wurstmeister/kafka 
	ports:
	  - &quot;9092:9092&quot;
	environment:
	 # HOSTNAME_COMMAND: &quot;route -n | awk '/UG[ \t]/{print $$2}'&quot;
	  KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
	  KAFKA_ADVERTISED_HOST_NAME: kafka
	  KAFKA_ADVERTISED_PORT: 9092
	  KAFKA_BROKER_ID: 1
	  KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
	  KAFKA_JMX_OPTS: &quot;-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=kafka -Dcom.sun.management.jmxremote.rmi.port=1099&quot;
	  JMX_PORT: 1099      
	volumes:
	  - /var/run/docker.sock:/var/run/docker.sock   
	depends_on:
	  - zookeeper      
  kafka-manager:
	image: kafkamanager/kafka-manager
	ports:
	  - &quot;9000:9000&quot;
	links:
	  - zookeeper
	  - kafka  
	environment:
	  ZK_HOSTS: zookeeper:2181</pre></td></tr></table></pre>
</div></li><li style="">En ligne de commande (CMD sous Windows), se positionner dans le répertoire et lancer la ligne de commande : «*docker-compose up*» ou* «*docker compose up*» (suivant la version).</li><li style="">Les images vont se télécharger et démarrer (la première exécution peut prendre un certain temps).</li><li style="">Avec une autre invite de commande, il est également possible de vérifier que les conteneurs sont démarrés en tapant «*docker ps*».<br />
        <div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p595442d1618208861/c-cpp/c/calcul-variables-temporelles-millisecondes/dockerps.png/" border="0" alt="Nom : dockerps.png
Affichages : 386
Taille : 14,6 Ko"  style="float: CONFIG" /></div> </li></ol><br />
<br />
<font size="3"><b>4.2. Administration par kafka-manager (CMAK)</b></font><hr /><br />
<ol class="decimal"><li style=""> Via un navigateur, lancer <a href="http://localhost:9000" target="_blank">http://localhost:9000</a></li><li style=""> Ajouter un cluster en renseignant les informations ci-après<br />
        <div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p595447d1618209477/c-cpp/c/calcul-variables-temporelles-millisecondes/kafkamanager-2.png/" border="0" alt="Nom : kafkamanager-2.png
Affichages : 387
Taille : 25,1 Ko"  style="float: CONFIG" /></div> </li></ol><br />
<br />
<font size="3"><b>5. Modélisation</b></font><hr /><br />
<b>Diagramme de classe</b><br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p595542d1618297020/c-cpp/c/calcul-variables-temporelles-millisecondes/tuto-diagclasse.png/" border="0" alt="Nom : Tuto-DiagClasse.png
Affichages : 433
Taille : 25,0 Ko"  style="float: CONFIG" /></div><b>Diagramme de séquence</b><br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p595544d1618297298/c-cpp/c/calcul-variables-temporelles-millisecondes/tuto-diagsequence.png/" border="0" alt="Nom : Tuto-DiagSequence.png
Affichages : 701
Taille : 22,3 Ko"  style="float: CONFIG" /></div><br />
<font size="4"><b>6. Initialisation du projet</b></font><hr /><br />
<ol class="decimal"><li style="">Aller sur le site <font color="#0563c1"><u><a href="https://start.spring.io/" target="_blank">https://start.spring.io/</a></u></font></li><li style="">Renseigner les champs et ajouter dans les « Dependencies » (Spring for Apache Kafka) et enfin « Generate »<br />
        <div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p595509d1618242970/c-cpp/c/calcul-variables-temporelles-millisecondes/6.1-springio.png/" border="0" alt="Nom : 6.1-Springio.png
Affichages : 370
Taille : 81,0 Ko"  style="float: CONFIG" /></div></li><li style="">Télécharger le fichier « zip » et l’extraire dans un répertoire<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p595510d1618243132/c-cpp/c/calcul-variables-temporelles-millisecondes/6.1-3-springzip.png/" border="0" alt="Nom : 6.1-3-SpringZip.png
Affichages : 435
Taille : 4,8 Ko"  style="float: CONFIG" /></div></li><li style="">Lancer Eclipse</li><li style="">Importer le dossier<br />
    <div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p595540d1618293932/c-cpp/c/calcul-variables-temporelles-millisecondes/6.1-5-importer.png/" border="0" alt="Nom : 6.1-5-Importer.png
Affichages : 373
Taille : 76,3 Ko"  style="float: CONFIG" /></div></li><li style="">Ouvrir l’arborescence du projet<br />
        <div style="text-align: center;"> <img src="https://www.developpez.net/forums/attachments/p595515d1618243463/c-cpp/c/calcul-variables-temporelles-millisecondes/6.1-6-arborescence.png/" border="0" alt="Nom : 6.1-6-Arborescence.png
Affichages : 372
Taille : 19,6 Ko"  style="float: CONFIG" /></div></li><li style="">Ouvrir et ajouter dans le fichier « pom.xml » <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:96px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0">
&lt;dependency&gt;
  &lt;groupId&gt;com.fasterxml.jackson.core&lt;/groupId&gt;
  &lt;artifactId&gt;jackson-databind&lt;/artifactId&gt;
&lt;/dependency&gt;</pre></td></tr></table></pre>
</div>        <div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p595516d1618243572/c-cpp/c/calcul-variables-temporelles-millisecondes/6.1-7-pom.png/" border="0" alt="Nom : 6.1-7-pom.png
Affichages : 375
Taille : 99,3 Ko"  style="float: CONFIG" /><br />
</div></li><li style="">Si vous lancez le programme en local, il faudra ajouter dans le fichier Host « 127.0.0.1 kafka » (C:\Windows\System32\drivers\etc\hosts) <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br /></div></td><td valign="top"><pre style="margin: 0">
# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
#      102.54.94.97     rhino.acme.com          # source server
#       38.25.63.10     x.acme.com              # x client host

# localhost name resolution is handled within DNS itself.
#    127.0.0.1       localhost
#    ::1             localhost
# Added by Docker Desktop
192.168.3.138 host.docker.internal
192.168.3.138 gateway.docker.internal
# To allow the same kube context to work on the host and the container:
127.0.0.1 kubernetes.docker.internal
127.0.0.1 kafka
# End of section</pre></td></tr></table></pre>
</div> </li></ol><br />
<br />
<font size="4"><b>7. Programme </b></font><hr /><br />
<font size="3"><b>7.1. Structure du programme</b></font><hr /><br />
Voici la structure du programme<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p595539d1618293906/c-cpp/c/calcul-variables-temporelles-millisecondes/7.1-1-structurefinale.png/" border="0" alt="Nom : 7.1-1-structurefinale.png
Affichages : 372
Taille : 9,5 Ko"  style="float: CONFIG" /></div><font size="3"><b>7.2 Data To Object (dto)</b></font><hr /><br />
<font size="2"><b>Person.java</b></font><br />
Utilisation d'un objet ex : &quot;Person&quot; qui sera transmis entre l'expediteur et le destinataire<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br /></div></td><td valign="top"><pre style="margin: 0">
package fr.tutoriel.kafka.dto;

/**
 * Exemple d'un objet 
 */
public class Person {
    private String firstName;
    private String lastName;
    private int age;    
    
    public Person() {

    }
    
    public Person(String firstName, String lastName, int age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }
    
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String msg) {
        this.firstName = msg;
    }
        
    public String getLastName() {
        return lastName;
    }
    
    public void setLastName(String name) {
        this.lastName = name;
    }

    public int getAge() {
        return age;
    }
    
    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return     &quot;{firstName:\&quot;&quot;+firstName+&quot;\&quot;, lastName:\&quot;&quot;+lastName+&quot;\&quot;, age:&quot;+String.valueOf(age)+&quot;}&quot;;        
    }
}</pre></td></tr></table></pre>
</div><font size="3"><b>7.3. receiver</b></font><hr /><br />
Développement de la partie Destinataire pour écouter et réceptionner les messages<br />
<br />
<font size="2"><b>IProcess.java</b></font><br />
Interface pour l'exécution d'un traitement<br />
(NB : facultatif : pour anticiper la séparation du programme)<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br /></div></td><td valign="top"><pre style="margin: 0">
package fr.tutoriel.kafka.receiver;

import fr.tutoriel.kafka.dto.Person;

/**
 * Interface pour gerer les traitements
 *  
 * */
public interface IProcess {

	/**
	 * Exécuter un traitement
	 * @param info
	 * @param person
	 */
	public void execute(String info, Person person);
}</pre></td></tr></table></pre>
</div><font size="2"><b>IReceiver.java</b></font><br />
Interface pour écouter la réception d'un message.<br />
Il serait possible d'utiliser la même interface pour écouter un message avec une autre messagerie que Kafka (ex : RabbitMQ)<br />
(NB : facultatif : pour anticiper la séparation du programme)<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:192px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br /></div></td><td valign="top"><pre style="margin: 0">
package fr.tutoriel.kafka.receiver;

import fr.tutoriel.kafka.dto.Person;

/**
 * Interface pour écouter la réception d'un message
 * 
 * Il serait possible d'utiliser la même interface pour écouter
 * un message avec une autre messagerie que Kafka (ex : RabbitMQ)
 * */
public interface IReceiver {
	public void listen(String topicName, Person person);
}</pre></td></tr></table></pre>
</div><font size="2"><b>KafkaReceiverConfig.java</b></font><br />
Configuration du destinataire avec l'adresse du serveur, le groupe, type de message en JSON.<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br /></div></td><td valign="top"><pre style="margin: 0">
package fr.tutoriel.kafka.receiver;

import java.util.HashMap;
import java.util.Map;

import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.common.serialization.StringDeserializer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.annotation.EnableKafka;
import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
import org.springframework.kafka.core.ConsumerFactory;
import org.springframework.kafka.core.DefaultKafkaConsumerFactory;
import org.springframework.kafka.support.serializer.JsonDeserializer;

import fr.tutoriel.kafka.dto.Person;

/**
 * Configuration du destinataire 
 */
@EnableKafka
@Configuration
public class KafkaReceiverConfig {

	@Value(value = &quot;${kafka.bootstrapAddress:kafka:9092}&quot;) // Adresse du serveur Kafka pour envoyer les messages (il est possible de le configurer via application.properties)
    private String bootstrapAddress;
	
    private static final String groupId = &quot;Tutorial&quot;; // Définition du groupe ex: Tutorial
    
    @Bean
    public ConsumerFactory&lt;String, Person&gt; receiverFactory() {
        Map&lt;String, Object&gt; props = new HashMap&lt;&gt;();
        props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,bootstrapAddress); // Configuration de l'adresse du serveur
        props.put(ConsumerConfig.GROUP_ID_CONFIG,groupId);// Configuration du groupe
        return new DefaultKafkaConsumerFactory&lt;&gt;(props,new StringDeserializer(),new JsonDeserializer&lt;&gt;(Person.class));
    }

    @Bean
    public ConcurrentKafkaListenerContainerFactory&lt;String, Person&gt; kafkaListenerContainerFactory() {   
        ConcurrentKafkaListenerContainerFactory&lt;String, Person&gt; factory =new ConcurrentKafkaListenerContainerFactory&lt;&gt;();
        factory.setConsumerFactory(receiverFactory());
        return factory;
    }
}</pre></td></tr></table></pre>
</div><font size="2"><b>KafkaReceiver.java</b></font><br />
Permet d'écouter la réception d'un message et d'exécuter un traitement (au travers de l'interface)<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br /></div></td><td valign="top"><pre style="margin: 0">
package fr.tutoriel.kafka.receiver;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Service;

import fr.tutoriel.kafka.dto.Person;


/**
 * Receveur Kafka
 *
 */
@Service
public class KafkaReceiver implements IReceiver {
	
	@Autowired 
	private IProcess process; // Affectation de l'instance pour la gestion des traitements
		
	/**
	 * Ecoute sur le topic &quot;Tuto1&quot;, s'il existe un message
	 * 
	 * @param person
	 * 		Objet reçu
	 */
	@KafkaListener(topics = &quot;Tuto1&quot;,containerFactory=&quot;kafkaListenerContainerFactory&quot;)
	public void listenTuto1(Person person) {
		listen(&quot;Tuto1&quot;,person);	
	}

	/**
	 * Ecoute sur le topic &quot;Tuto2&quot;, s'il existe un message

	 * @param person
	 * 		Objet reçu
	 */
	@KafkaListener(topics = &quot;Tuto2&quot;,containerFactory=&quot;kafkaListenerContainerFactory&quot;)
	public void listenTuto2(Person person) {
		listen(&quot;Tuto2&quot;,person);	
	}
	
	/**
	 * 	 
	 * Exécution d'un traitement
	 * @param topicName
	 * 		Nom du topic
	 * @param topicName
	 * 	    Objet reçu
	 * 
	 */
	@Override
	public void listen(String topicName, Person person) {
		process.execute(topicName+&quot;Info&quot;, person);	
	}
}</pre></td></tr></table></pre>
</div><font size="2"><b>ProcessExample.java</b></font><br />
Permet d'exécuter un traitement.<br />
Dans l'exemple, affichage d'un texte dans la console<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br /></div></td><td valign="top"><pre style="margin: 0">
package fr.tutoriel.kafka.receiver;

import org.springframework.stereotype.Service;

import fr.tutoriel.kafka.dto.Person;


/**
 * Traitement exemple
 */
@Service
public class ProcessExample implements IProcess {

	/**
	 * Exécuter le traitement : Dans notre exemple affichage du message dans la console
	 * @param topicName
	 * 		Nom du Topic
	 * @param person
	 * 		objet person
	 */
	@Override
	public void execute(String info, Person person) {
		System.out.println(&quot;Message reçu: info=&quot;+info +&quot;, person=&quot; + person);
	}
}</pre></td></tr></table></pre>
</div><font size="3"><b>7.4. Sender</b></font><hr /><br />
Développement de la partie Expéditeur pour envoyer les messages<br />
<br />
<font size="2"><b>ISender.java</b></font><br />
Interface pour envoyer un message.<br />
Il serait possible d'utiliser la même interface pour envoyer un message avec une autre messagerie que Kafka (ex : RabbitMQ)<br />
(NB : facultatif : pour anticiper la séparation du programme)<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br /></div></td><td valign="top"><pre style="margin: 0">
package fr.tutoriel.kafka.sender;

import fr.tutoriel.kafka.dto.Person;


/**
 * Interface pour envoyer un message
 * 
 * Il serait possible d'utiliser la même interface pour envoyer 
 * un message avec une autre messagerie que Kafka (ex : RabbitMQ)
 * */
public interface ISender {
	void send(String topicName, Person person); 
}</pre></td></tr></table></pre>
</div><font size="2"><b>KafkaSenderConfig.java</b></font><br />
Configuration de l'expéditeur avec l'adresse du serveur, type de message en JSON<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br /></div></td><td valign="top"><pre style="margin: 0">
package fr.tutoriel.kafka.sender;

import java.util.HashMap;
import java.util.Map;

import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.common.serialization.StringSerializer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.core.DefaultKafkaProducerFactory;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.core.ProducerFactory;
import org.springframework.kafka.support.serializer.JsonSerializer;

import fr.tutoriel.kafka.dto.Person;

/**
 *  Configuration de l'expéditeur
 */
@Configuration
public class KafkaSenderConfig {

	@Value(value = &quot;${kafka.bootstrapAddress:kafka:9092}&quot;) // Adresse du serveur Kafka (il est possible de le configurer via application.properties)
    private String bootstrapAddress;
    
    @Bean
    public ProducerFactory&lt;String, Person&gt; senderFactory() {
        Map&lt;String, Object&gt; configProps = new HashMap&lt;&gt;();
        configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,bootstrapAddress); // Adresse du serveur
        configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,StringSerializer.class);  
        configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,JsonSerializer.class);
        return new DefaultKafkaProducerFactory&lt;&gt;(configProps);
    }
    
    @Bean
    public KafkaTemplate&lt;String, Person&gt; kafkaTemplate() {
        return new KafkaTemplate&lt;&gt;(senderFactory());
    }    
}</pre></td></tr></table></pre>
</div><font size="2"><b>KafkaTopicConfig.java</b></font><br />
Configuration Topic avec l'adresse du serveur<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br /></div></td><td valign="top"><pre style="margin: 0">
package fr.tutoriel.kafka.sender;

import java.util.HashMap;
import java.util.Map;

import org.apache.kafka.clients.admin.AdminClientConfig;
//import org.apache.kafka.clients.admin.NewTopic;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.core.KafkaAdmin;

/**
 *  Configuration Topic
 */
@Configuration
public class KafkaTopicConfig {
    
    @Value(value = &quot;${kafka.bootstrapAddress:kafka:9092}&quot;) // Adresse du serveur Kafka (il est possible de le configurer via application.properties)
    private String bootstrapAddress;

    @Bean
    public KafkaAdmin kafkaAdmin() {
        Map&lt;String, Object&gt; configs = new HashMap&lt;&gt;();
        configs.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress);
        return new KafkaAdmin(configs);
    }
}</pre></td></tr></table></pre>
</div><font size="2"><b>KafkaSender.java</b></font><br />
Permet d'envoyer un message (Person) dans un topic.<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br /></div></td><td valign="top"><pre style="margin: 0">
package fr.tutoriel.kafka.sender;

import org.apache.kafka.clients.admin.NewTopic;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;

import fr.tutoriel.kafka.dto.Person;

/**
 * 
 * Expediteur Kafka
 */
@Service
public class KafkaSender implements ISender {

	
	@Autowired
	private KafkaTemplate&lt;String, Person&gt; kafkaTemplate;

	/**
	 * Permet d'envoyer un message (Person) dans un topic
	 *   
	 * @param topicName
	 * 			Nom du topic
	 * @param person
	 * 			Objet à envoyer 
	 */
	@Override
	public void send(String topicName, Person person) {
		System.out.println(&quot;Message à envoyer : topicName=&quot;+topicName +&quot;, person=&quot; + person);		
		new NewTopic(topicName, 1, (short) 1);
		kafkaTemplate.send(topicName, person);
	}
}</pre></td></tr></table></pre>
</div><font size="3"><b>7.5. Main</b></font><hr /><br />
Programme principal<br />
<br />
<font size="2"><b>KafkaApplication.java</b></font><br />
Spring boot permet de démarrer et configurer les parties &quot;réception&quot; et &quot;destinataire&quot;.<br />
La méthode &quot;run&quot; permet d'envoyer en boucle des messages vers une messagerie (Kafka ou autre).<br />
Au travers de la méthode &quot;send&quot;, un texte est affiché dans la console.<br />
En asynchrone, la réception d'un message est affiché dans la console.<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br /></div></td><td valign="top"><pre style="margin: 0">
package fr.tutoriel.kafka;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import fr.tutoriel.kafka.dto.Person;
import fr.tutoriel.kafka.sender.ISender;

/**
 * KafkaApplication 
 * Programme principal
 */
@SpringBootApplication
public class KafkaApplication implements CommandLineRunner {

	@Autowired
	private ISender sender; // Affectation de l'instance sender

	public static void main(String[] args) {
		SpringApplication.run(KafkaApplication.class, args);
	}

	/**
	 * Exécuter le programme
	 * Permet d'envoyer des messages vers une messagerie (Kafka ou autre)
	 * 
	 * La réception du message est asynchrone (en attente)
	 */
	@Override
	public void run(String... args) throws Exception {
		int ageTuto1 = 10; //
		int ageTuto2 = 20; //
		while (true) { // Boucle infinie			
			Person personTuto1 = new Person(&quot;Jean&quot;, &quot;DUPOND&quot;, ageTuto1); // Créer un objet pour Tuto1
			sender.send(&quot;Tuto1&quot;, personTuto1); // Envoyer l'objet sur le topic &quot;Tuto1&quot;
			Thread.sleep(3000); // Attendre 3s
			Person personTuto2 = new Person(&quot;Pierre&quot;,&quot;DURAND&quot;,ageTuto2); // Créer un objet pour Tuto2
			sender.send(&quot;Tuto2&quot;, personTuto2);  // Envoyer l'objet sur le topic &quot;Tuto2&quot;
			Thread.sleep(3000); // Attendre 3s
			ageTuto1++; // Incrémentation du texte
			ageTuto2++;	// Incrémentation du texte
		}

	}
}</pre></td></tr></table></pre>
</div><font size="4"><b>8. Exécution</b></font><hr /><br />
<font size="4"><b>8.1 Exécuter</b></font><hr /><br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p595541d1618293992/c-cpp/c/calcul-variables-temporelles-millisecondes/8-execution.png/" border="0" alt="Nom : 8-Execution.png
Affichages : 426
Taille : 68,9 Ko"  style="float: CONFIG" /></div><font size="4"><b>8.2. Résultat</b></font><hr /><br />
Après exécution, il est possible de visualiser dans la console les messages (envoi et réception).<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:120px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td valign="top"><pre style="margin: 0">
Message à envoyer : topicName=Tuto2, person={firstName:&quot;Pierre&quot;, lastName:&quot;DURAND&quot;, age:20}
Message reçu: info=Tuto2Info, person={firstName:&quot;Pierre&quot;, lastName:&quot;DURAND&quot;, age:20}
Message à envoyer : topicName=Tuto1, person={firstName:&quot;Jean&quot;, lastName:&quot;DUPOND&quot;, age:11}
Message reçu: info=Tuto1Info, person={firstName:&quot;Jean&quot;, lastName:&quot;DUPOND&quot;, age:11}
Message à envoyer : topicName=Tuto2, person={firstName:&quot;Pierre&quot;, lastName:&quot;DURAND&quot;, age:21}
Message reçu: info=Tuto2Info, person={firstName:&quot;Pierre&quot;, lastName:&quot;DURAND&quot;, age:21}</pre></td></tr></table></pre>
</div><font size="4"><b>9. Pour aller plus loin</b></font><hr /><br />
Il serait judicieux de séparer le programme au moins en 3 parties : <br />
<ul><li style="">Une bibliothèque partagée (pour mettre la classe &quot;Person&quot; et les interfaces)</li><li style="">Une partie &quot;Sender&quot;</li><li style="">Une partie &quot;Receiver&quot;</li></ul><br />
<br />
Il est possible en gardant cette strucuture de faire fonctionner le programme avec une autre messagerie comme RabbitMQ (<a href="https://www.rabbitmq.com/" target="_blank">https://www.rabbitmq.com/</a>)<br />
<br />
<font size="4"><b>10. Liens</b></font><hr /><br />
<ul><li style="">Kafka : <a href="https://kafka.apache.org/" target="_blank">https://kafka.apache.org/</a></li><li style="">Docker*: <a href="https://www.docker.com/" target="_blank">https://www.docker.com/</a></li><li style="">Code source inspiré du site : <a href="https://www.baeldung.com/spring-kafka" target="_blank">https://www.baeldung.com/spring-kafka</a> </li></ul></blockquote>

]]></content:encoded>
			<dc:creator>DimBo2</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/1773549-dimbo2/b10097/tutoriel-kafka-installation-l-execution-d-premier-programme-java/</guid>
		</item>
	</channel>
</rss>
