demos/kafka/training
20 months agoAnzahl der Fehler für die Test-Logik verfügbar gemacht deserialization
Kai Moritz [Sun, 11 Sep 2022 11:42:57 +0000 (13:42 +0200)]
Anzahl der Fehler für die Test-Logik verfügbar gemacht

* Conflicts:
** src/test/java/de/juplo/kafka/ApplicationTests.java

20 months agoDer Test verwendet die `@Bean` von `EndlessConsumer`
Kai Moritz [Fri, 9 Sep 2022 10:44:54 +0000 (12:44 +0200)]
Der Test verwendet die `@Bean` von `EndlessConsumer`

20 months agoBackport von Verbesserungen / Erweiterungen der Tests:
Kai Moritz [Fri, 9 Sep 2022 09:46:25 +0000 (11:46 +0200)]
Backport von Verbesserungen / Erweiterungen der Tests:

* Integration-Test `ApplicationIT`, der prüft, ob die Spring-Boot
  Anwendung ohne Fehler startet und dies über den Endpoint auch meldet.
* Inzwischen hinzugefügte `.editorconfig` übernommen.
* Fachspezifisches Interface `RecordHandler` statt `java.util.Consumer`.
* Kleinere Korrekturen / Verbesserungen an `GenericApplicationTests`
  übernommen.

20 months agoGRÜN: Fehler in der Test-Logik korrigiert
Kai Moritz [Thu, 18 Aug 2022 21:36:22 +0000 (23:36 +0200)]
GRÜN: Fehler in der Test-Logik korrigiert

* Die Assertion, dass nach einem wiederholten Versuch, den Logik-Fehler
  zu konsumieren nicht mehr Nachrichten konsumiert wurden, als für den
  Test generiert wurden ist nicht gültig, da bei einem Logik-Fehler ja
  gerade _kein_ Commit der zuletzt gelesenen Nachrichten erfolgt, da
  dies dazu führt, dass der Offset für Partitionen erhöht wird, für die
  vor dem Eintreten des Fehlers noch nicht alle Nachrichten gelesen
  wurden, wenn nicht explizti Seek's für diese Partitionen durchgeführt
  werden.
* Die Assertion, dass die Offset-Position nach einem Fehler der Offset-
  Position _vor_ der Ausführung der Fachlogik entspricht ist falsch, da
  durchaus Commits durchgeführt werden können, bevor der Fehler auftritt.
  Daher wird jetzt explizit geprüft, dass
** Die Offset-Position für keine Partition größer ist, als der Offset
   der dort zuletzt gesehenen Nachricht.
** UND mindestens eine Partition existiert, deren Offset _kleiner_ ist,
   als der Offset der zuletzt gesehenen Nachricht.

20 months agoROT: Fehler in Test-Logik aufgedeckt
Kai Moritz [Fri, 19 Aug 2022 09:10:52 +0000 (11:10 +0200)]
ROT: Fehler in Test-Logik aufgedeckt

* Einige Assertions in dem Test für die Offset-Position nach einem
  Logik-Fehler waren fehlerhaft.
* Dies ist bisher nicht aufgefallen, weil der Test nicht scharf genug
  war: Er hat so wenig Nachrichten gesendet, dass die fehlerhaften
  Assertions nicht aufgefallen sind, weil es nie zu einem Commit gekommen
  ist, bevor der Fehler ausgelöst wurde.
* TODO: Der Test ist wahrscheinlich immer noch in hohem Maße abhängig
  von der Ausführungsgeschwindigkeit auf dem Test-System. Besser wäre
  es, wenn die Verarbeitung künstlich gedrosselt würde, so dass die
  Timing-Annahmen zu den asynchron ablaufenden Operationen nicht auf
  das Testsystem abgestimmt werden müssen.

21 months agoMethode zu prüfen der Fachlogik in `RecordGenerator` ergänzt und angebunden
Kai Moritz [Sun, 14 Aug 2022 13:40:39 +0000 (15:40 +0200)]
Methode zu prüfen der Fachlogik in `RecordGenerator` ergänzt und angebunden

21 months agoSignatur und Handling des `RecordGenerator` vereinfacht/überarbeitet
Kai Moritz [Sun, 14 Aug 2022 13:35:28 +0000 (15:35 +0200)]
Signatur und Handling des `RecordGenerator` vereinfacht/überarbeitet

* Der `RecordGenerator` darf jetzt selbst bestimmen, wie viele Nachrichten
  er erzeugt und wo wieviele Poison-Pills oder Logik-Fehler erzeugt
  werden, wenn der Test dies anfordert.
* Dafür git der `RecordGenerator` jetzt die Anzahl der tatsächlich
  erzeugten Nachrichten zurück, damit die Tests richtig reagieren können.

21 months agoAnzahl der erzeugten Test-Nachrichten wird vom `RecordGenerator` bestimmt
Kai Moritz [Sun, 14 Aug 2022 13:26:26 +0000 (15:26 +0200)]
Anzahl der erzeugten Test-Nachrichten wird vom `RecordGenerator` bestimmt

21 months agoNamen der Test-Klassen korrigiert
Kai Moritz [Sun, 14 Aug 2022 11:26:08 +0000 (13:26 +0200)]
Namen der Test-Klassen korrigiert

21 months ago`GenericApplicationTest` überspring Tests, wenn Fehler nicht verfügbar
Kai Moritz [Sun, 14 Aug 2022 10:59:20 +0000 (12:59 +0200)]
`GenericApplicationTest` überspring Tests, wenn Fehler nicht verfügbar

* Über eine Annotation wird für Tests, die einen bestimmten Fehler-Typ
  benötigen bei dem `RecordGenerator` nachgefragt, ob der Fehler-Typ
  erzeugt werden kann.
* Wenn der Fehler-Typ nicht zur Verfügung steht, wird der Test
  übersprungen.

21 months agoTests aus gemerged springified-consumer--serialization -> deserialization
Kai Moritz [Sun, 14 Aug 2022 10:06:01 +0000 (12:06 +0200)]
Tests aus gemerged springified-consumer--serialization -> deserialization

* Es wurde nur der hinzugefügte Test übernommen.
* Der hinzugefügte Test wurde an das von Spring-Kafka abweichende
  Verhalten bei einem Logik-Fehler angepasst: Kafka führt nicht automatisch
  Seeks oder einene Commit durch. Da `EndlessConsumer` bei einem
  Logik-Fehler explizit ein `unsubscribe()` durchführt, wird kein
  Offset-Commit durchgefürt, so dass die alten Offset-Positionen gültig
  bleiben.
* Der Test wurde entsprechend umbenannt.
* `RecordGenerator` wurde um einen weiteren Integer-Set erweitert, über
  den die Indizes der zu erzeugenden Logik-Fehler gesetzt werden können.
* Der hinzugefügte Test wurde auf die überarbeitete Methode zur Erzeugung
  der Test-Nachrichten umgestellt.
* `ApplicationTest` wurde so ergänzt, dass der für den hinzugefügten Test
  benötigte Logik-Fehler erzeugt wird.

21 months agoTypisierung in `GenericApplicationTest` nur noch, wo wirklich nötig
Kai Moritz [Sun, 14 Aug 2022 09:32:10 +0000 (11:32 +0200)]
Typisierung in `GenericApplicationTest` nur noch, wo wirklich nötig

* Es wird nur noch dort mit Typisierung gearbeitet, wo dies unumgänglich
  ist, weil die typisierte Implementierung angesprochen wird.
* Das Versenden der Test-Nachrichten erfolgt als `Bytes` für Schlüssel
  und Nachricht.
* Dadurch muss der `RecordGenerator` nicht mehr typisiert werden.
* Dafür muss die typisierte Implementierung des Testfalls dann Schlüssel
  und Nachricht mit einem passenden Serializer in eine `Bytes`-Payload
  umwandeln.

21 months ago`ApplicationTest` auf basis der typisierbaren Basis neu implementiert
Kai Moritz [Sun, 14 Aug 2022 08:54:27 +0000 (10:54 +0200)]
`ApplicationTest` auf basis der typisierbaren Basis neu implementiert

21 months agoTypisierbare Basis-Klasse `GenericApplicationTests` eingeführt
Kai Moritz [Sun, 14 Aug 2022 07:54:45 +0000 (09:54 +0200)]
Typisierbare Basis-Klasse `GenericApplicationTests` eingeführt

21 months agoDemonstration in README.sh gepimped
Kai Moritz [Sat, 13 Aug 2022 10:37:27 +0000 (12:37 +0200)]
Demonstration in README.sh gepimped

21 months agoCompose-Setup und README.sh für dieses Beispiel repariert
Kai Moritz [Fri, 12 Aug 2022 20:31:24 +0000 (22:31 +0200)]
Compose-Setup und README.sh für dieses Beispiel repariert

* Zuvor war in dem Setup noch ein Producer konfiguriert, der Nachrichten
  vom Typ `String` geschrieben hat, so dass der Consumer _sofort_ das
  zeitliche gesegnet hat.
* Im README-Skript wurde nicht darauf gewartet, dass der Consumer
  gemeldet hat, dass er ordentlich gestartet ist, bevor er nach der
  vermeintlichen Konsumption der Poison-Pill wieder neu gestartet wurde.

21 months agoTest prüft ungültige und unbekannte Nachrichten springified-consumer--serialization
Kai Moritz [Tue, 26 Jul 2022 14:21:17 +0000 (16:21 +0200)]
Test prüft ungültige und unbekannte Nachrichten

21 months agoVerbesserungen des Testfalls gemerged (Branch 'deserialization')
Kai Moritz [Tue, 26 Jul 2022 14:11:45 +0000 (16:11 +0200)]
Verbesserungen des Testfalls gemerged (Branch 'deserialization')

21 months agoVerhalten des Testfalls kontrollierbarer gemacht
Kai Moritz [Tue, 26 Jul 2022 14:03:10 +0000 (16:03 +0200)]
Verhalten des Testfalls kontrollierbarer gemacht

* Die Awaitility-Aufrufe pollen den zu prüfenden Zustand wenn nicht anders
  angegeben so häufig, wie es die CPU zulässt - also ohne Verzögerung
  zwischen den Überprüfungen.
* Das kann den Rechner temporär so überlasten, dass der erwartete Zustand
  in der abgewarteten Zeit gar nicht eintritt!
* Z.B. aufgetreten, wenn wie hier das Commit-Interval auf 1 Sekunde
  gesetzt ist, das Polling von Awaitility aber noch ungebremst durchgeführt
  wird.
* Um diese Quelle für falsche Fehler auszuschließen, wurde jetzt
  durchgängig ein Poll-Intervall von 1 Sekunde für Awaitility gesetzt.

21 months agoTestfall überarbeitet
Kai Moritz [Tue, 26 Jul 2022 13:37:43 +0000 (15:37 +0200)]
Testfall überarbeitet

* Abhängigkeit der Testergebnisse von Ausführreihenfolge beseitigt.
* Die Abhängigkeit bestand, da die Offset-Positionen als Zustand die
  Testausführung überdauert haben.
* Daher konnte kein weiterer Test mehr ausgeführt werden, nachdem einmal
  eine Poison-Pill in das Topic geschrieben wurde, über die der
  implementierte Consumer stolpert.
* Um das zu umgehen, werden die Offset-Positionen jetzt nach jedem Test
  auf das Ende der Partitionen verschoben. D.h., wenn in dem Test eine
  Poision-Pill geschrieben wird, über die der implementierte Consumer
  nicht hinweglesen kann, werden die Offests vor der Ausführung des
  nächsten Tests über diese Poision-Pill hinweg gesetzt.
* Dadurch ist wurde ein Fehler / eine Schwäche in der Testlogik aufgedeckt:
  In dem Test für das erfolgreiche Schreiben wurde nur deswegen ein Commit
  ausgeführt, weil zuvor noch kein Commit durchgeführt wurde, so dass der
  Default-Wert für das Commit-Interval immer überschritten war.
* Um das zu umgehen, wurde eine Konfigurations-Option für das Setzen des
  Parameters `auto.commit.interval` eingeführt, so dass im Test
  sichergestellt werden kann, dass auf jeden Fall in dem beobachteten
  Zeitraum ein automatischer Commit ausgelöst wird.
* Außerdem: Weniger verwirrende Ausgabe des Offset-Fortschritts.

21 months agoDeserialisierung von Nachrichten unterschiedlichen Typs
Kai Moritz [Tue, 26 Jul 2022 09:38:54 +0000 (11:38 +0200)]
Deserialisierung von Nachrichten unterschiedlichen Typs

21 months agoRefaktorisierungen des Testfalls gemerged (Branch 'deserialization')
Kai Moritz [Tue, 26 Jul 2022 10:52:23 +0000 (12:52 +0200)]
Refaktorisierungen des Testfalls gemerged (Branch 'deserialization')

21 months agoVerwendung eines weniger verwirrenden Key in Tests (fachlich irrelevant)
Kai Moritz [Tue, 26 Jul 2022 10:42:45 +0000 (12:42 +0200)]
Verwendung eines weniger verwirrenden Key in Tests (fachlich irrelevant)

21 months agoErzeugung von ProducerRecord in Test refaktorisiert
Kai Moritz [Tue, 26 Jul 2022 10:40:45 +0000 (12:40 +0200)]
Erzeugung von ProducerRecord in Test refaktorisiert

21 months agoMerge der überarbeiteten Compose-Konfiguration ('deserialization')
Kai Moritz [Sat, 23 Jul 2022 14:17:42 +0000 (16:17 +0200)]
Merge der überarbeiteten Compose-Konfiguration ('deserialization')

21 months agoMerge der überarbeiteten Compose-Konfiguration ('rebalance-listener')
Kai Moritz [Sat, 23 Jul 2022 14:15:29 +0000 (16:15 +0200)]
Merge der überarbeiteten Compose-Konfiguration ('rebalance-listener')

21 months agoMerge der überarbeiteten Compose-Konfiguration ('counting-consumer')
Kai Moritz [Sat, 23 Jul 2022 13:35:01 +0000 (15:35 +0200)]
Merge der überarbeiteten Compose-Konfiguration ('counting-consumer')

21 months agoMerge der überarbeiteten Compose-Konfiguration ('endless-stream-consumer')
Kai Moritz [Sat, 23 Jul 2022 11:49:23 +0000 (13:49 +0200)]
Merge der überarbeiteten Compose-Konfiguration ('endless-stream-consumer')

* Die letzten Änderungen an 'endless-stream-consumer' sind länger nicht
  mehr gemerged worden.

21 months agoCompose-Konfiguration unabhängig von Default-Konfiguration gemacht
Kai Moritz [Sat, 23 Jul 2022 11:26:29 +0000 (13:26 +0200)]
Compose-Konfiguration unabhängig von Default-Konfiguration gemacht

* Damit Instanzen parallel über die IDE (mit voreingestelltem Default-Port)
  und Compose gestartet werden können, wurden den einzelnen Komponenten
  (Producer, Consumer etc.) jeweils unterschiedliche explizite
  Default-Ports zugewiesen.
* Dies führt leicht zu fehlern, in den Compose-Setups, da dort i.d.R.
  Port-Mappings für die gestarteten Instanzen definiert werden.
* Daher werden die Compose-Setups jetzt so umgestellt, dass sie den
  einkompilierten Default-Port der Komponenten explizit mit dem Port `8080`
  überschreiben, so dass alle Komponenten _innerhalb_ von Compose
  einheitlich (und so wie bei Spring-Boot standard) über `8080` ansprechbar
  sind.

21 months agoMerge der Upgrades für Confluent/Spring-Boot (Branch 'first-contact')
Kai Moritz [Sat, 23 Jul 2022 08:37:24 +0000 (10:37 +0200)]
Merge der Upgrades für Confluent/Spring-Boot (Branch 'first-contact')

21 months agoUpgrade von Spring Boot und den Confluent-Kafka-Images
Kai Moritz [Fri, 22 Jul 2022 18:04:07 +0000 (20:04 +0200)]
Upgrade von Spring Boot und den Confluent-Kafka-Images

* Upgrade der Kafk-Images von Confluent 7.0.2 auf 7.1.3
** Unterstützt Kafka 3.1.x (siehe https://docs.confluent.io/platform/current/installation/versions-interoperability.html[Versions-Matrix])
* Upgrade für Spring Boot von 2.6.5 auf 2.7.2
** Enthält Kafka: 3.1.1
** Enthält Spring Kafka: 2.8.8

2 years agoMerge branch 'deserialization' into springified-consumer--serialization
Kai Moritz [Sat, 30 Apr 2022 09:38:26 +0000 (11:38 +0200)]
Merge branch 'deserialization' into springified-consumer--serialization

2 years agoFehler in Shutdown-Logik für den `ExecutorService` korrigiert
Kai Moritz [Sat, 30 Apr 2022 09:36:13 +0000 (11:36 +0200)]
Fehler in Shutdown-Logik für den `ExecutorService` korrigiert

2 years agoMerge branch 'rebalance-listener' into deserialization
Kai Moritz [Sat, 30 Apr 2022 09:34:38 +0000 (11:34 +0200)]
Merge branch 'rebalance-listener' into deserialization

2 years agoMerge branch 'endless-stream-consumer' into rebalance-listener
Kai Moritz [Sat, 30 Apr 2022 09:24:34 +0000 (11:24 +0200)]
Merge branch 'endless-stream-consumer' into rebalance-listener

2 years agoHealthIndicator implementiert: Implementierung selbst vergessen :/
Kai Moritz [Sat, 30 Apr 2022 09:22:41 +0000 (11:22 +0200)]
HealthIndicator implementiert: Implementierung selbst vergessen :/

2 years agoRefactor: `EndlessConsumer` ist selbst ein `ConsumerRebalanceListener`
Kai Moritz [Fri, 22 Apr 2022 15:53:41 +0000 (17:53 +0200)]
Refactor: `EndlessConsumer` ist selbst ein `ConsumerRebalanceListener`

* Vorbereitung für die Übernahme der Funktionalität in der springifizierten
  Version.

2 years agoSpringify: Nachrichten-Typ wird über den Type-Info-Header bestimmt
Kai Moritz [Sun, 17 Apr 2022 11:44:49 +0000 (13:44 +0200)]
Springify: Nachrichten-Typ wird über den Type-Info-Header bestimmt

2 years agoSpringify: Der Payload ist eine als JSON gerenderte Klasse
Kai Moritz [Sun, 17 Apr 2022 11:33:40 +0000 (13:33 +0200)]
Springify: Der Payload ist eine als JSON gerenderte Klasse

* Als Nachricht wird eine Instanz der Klasse `ClientMessage` erwartet
* Die Instanz wird mit Hilfe des `JsonDeserializer` von Spring Kafka
  deserialisiert.

2 years agoTests: Refaktorisiert - Durcheinander bei Assertions aufgeräumt
Kai Moritz [Mon, 18 Apr 2022 10:41:47 +0000 (12:41 +0200)]
Tests: Refaktorisiert - Durcheinander bei Assertions aufgeräumt

* Zuvor wurden die Assertions von JUnit Jupiter und AssertJ durcheinander
  gewürfelt verwendet.
* Jetzt werden stringent nur noch die Assertions von AssertJ verwendet.

2 years agoTests: Refaktorisiert - Serialisierung des Payloads konfigurierbar gemacht
Kai Moritz [Sun, 17 Apr 2022 11:15:07 +0000 (13:15 +0200)]
Tests: Refaktorisiert - Serialisierung des Payloads konfigurierbar gemacht

2 years agoTests: Tests prüfen den Status des Consumers
Kai Moritz [Fri, 15 Apr 2022 11:14:19 +0000 (13:14 +0200)]
Tests: Tests prüfen den Status des Consumers

2 years agoTests: Refaktorisiert - Nachrichten werden für alle Tests aufgezeichnet
Kai Moritz [Fri, 15 Apr 2022 10:22:57 +0000 (12:22 +0200)]
Tests: Refaktorisiert - Nachrichten werden für alle Tests aufgezeichnet

2 years agoTests: Fehlerfall-Test prüft, dass nicht alle Nachrichten gelesen wurden
Kai Moritz [Fri, 15 Apr 2022 10:17:23 +0000 (12:17 +0200)]
Tests: Fehlerfall-Test prüft, dass nicht alle Nachrichten gelesen wurden

2 years agoTests: Assert-Beschreibungen korrigiert/ergänzt
Kai Moritz [Fri, 15 Apr 2022 10:08:50 +0000 (12:08 +0200)]
Tests: Assert-Beschreibungen korrigiert/ergänzt

2 years agoTests: Geprüft, dass der Fehler nach einem Neustart neu vorliegt
Kai Moritz [Mon, 11 Apr 2022 14:19:44 +0000 (16:19 +0200)]
Tests: Geprüft, dass der Fehler nach einem Neustart neu vorliegt

2 years agoTests: Umbau für einen Commit im Fehlerfall und Anpassung des Tests
Kai Moritz [Sun, 10 Apr 2022 12:50:50 +0000 (14:50 +0200)]
Tests: Umbau für einen Commit im Fehlerfall und Anpassung des Tests

2 years agoTests: Refaktorisiert - Methoden-Reihenfolge aufgeräumt und kommentiert
Kai Moritz [Mon, 11 Apr 2022 08:04:53 +0000 (10:04 +0200)]
Tests: Refaktorisiert - Methoden-Reihenfolge aufgeräumt und kommentiert

2 years agoTests: Der Test wartet, bis die Offsets regulär committed wurden
Kai Moritz [Mon, 11 Apr 2022 07:41:40 +0000 (09:41 +0200)]
Tests: Der Test wartet, bis die Offsets regulär committed wurden

* Zuvor wurde der Offset-Commit erzwungen, indem der EndlessConsumer
  über den Aufruf von `stop()` beendet wurde.
* Jetzt wird die Überprüfung der Erwartungen über awaitility aufgeschoben,
  bis die Erwartungen beobachtet werden können - oder eine Zeitschranke
  gerissen wird.

2 years agoTests: Der EndlessConsumer wird jetzt doch asynchron ausgeführt
Kai Moritz [Sun, 10 Apr 2022 20:50:44 +0000 (22:50 +0200)]
Tests: Der EndlessConsumer wird jetzt doch asynchron ausgeführt

* Der Test-Code wird verständlicher, wenn der Consumer asynchron läuft
* Für die Überprüfung der Erwartungen wird dann awaitility benötigt
** Da der Consumer in einem separaten Thread läuft, muss auf diesen
   gezielt gewartet werden
** Dafür wird es deutlicher/verständlicher, auf welche der auch aus dem
   regulären Betrieb des EndlessConsumer bekannten Zustandsänderungen
   der Test wartet
* Da die Offsets für die Controlle (ggf.) abgefragt werden, während der
  EndlessConsumer noch läuft, wird ein separater KafkaConsumer benötigt,
  um die Offsets abzurufen.
  BEACHTE: Um die Änderungen in dem Offsets-Topic zu greifen zu bekommen,
  muss dieser KafkaConsumer für jede Abfrage ein `assign()` durchführen,
  damit er gezwungen ist, die Offsets neu vom Broker zu erfragen.

2 years agoTests: Refaktorisiert - DRY für Test auf Offset-Fortschritt
Kai Moritz [Sun, 10 Apr 2022 13:54:26 +0000 (15:54 +0200)]
Tests: Refaktorisiert - DRY für Test auf Offset-Fortschritt

2 years agoTests: Überprüft, ob überhaupt ein Offset-Fortschritt vorliegt
Kai Moritz [Sun, 10 Apr 2022 13:25:58 +0000 (15:25 +0200)]
Tests: Überprüft, ob überhaupt ein Offset-Fortschritt vorliegt

2 years agoTests: Offsets werden unter TopicPartition abgelegt
Kai Moritz [Sun, 10 Apr 2022 13:25:57 +0000 (15:25 +0200)]
Tests: Offsets werden unter TopicPartition abgelegt

2 years agoTests: Test-Reihenfolge definiert, da das Topic nicht geleert wird
Kai Moritz [Sun, 10 Apr 2022 14:02:07 +0000 (16:02 +0200)]
Tests: Test-Reihenfolge definiert, da das Topic nicht geleert wird

2 years agoTests: Erste Version eines synchronen Integration-Test implementiert
Kai Moritz [Sat, 9 Apr 2022 14:14:47 +0000 (16:14 +0200)]
Tests: Erste Version eines synchronen Integration-Test implementiert

2 years agoDemonstration der RecordDeserializationException
Kai Moritz [Sat, 9 Apr 2022 16:30:22 +0000 (18:30 +0200)]
Demonstration der RecordDeserializationException

* EndlessConsumer wird mit dem Value-Type `Long` anstatt `String` erzeugt
* Setup für die Demonstration der DeserializationException überarbeitet

2 years agoRefaktorisierung für Tests - EndlessConsumer typisiert
Kai Moritz [Sat, 9 Apr 2022 14:04:02 +0000 (16:04 +0200)]
Refaktorisierung für Tests - EndlessConsumer typisiert

2 years agoRefaktorisierung für Tests - Record-Handler als Bean konfigurierbar
Kai Moritz [Sat, 9 Apr 2022 11:40:47 +0000 (13:40 +0200)]
Refaktorisierung für Tests - Record-Handler als Bean konfigurierbar

* Ein Handler für die Verarbeitung der einzelnen ConsumerRecord's kann
  jetzt ein `java.util.function.Consumer` als Bean definiert werden
* Die Nachricht wird erst nach dem Aufruf des Handlers als konsumiert
  gezählt, damit der Handler die Nachricht über eine Exception ablehnen
  kann.

2 years agoDie Spring-Boot App wird nun sauber herunter gefahren
Kai Moritz [Mon, 11 Apr 2022 08:51:01 +0000 (10:51 +0200)]
Die Spring-Boot App wird nun sauber herunter gefahren

* Zuvor wurde die App nicht richtig beendet, weil der ExecutorService nicht
  beendet wurde und sich die JVM deswegen nicht beenden konnte.
* Dies ist erst durch die Aktivierung des shutdown-Endpoints aufgefallen.
* Jetzt wurde in `Application` eine `@PreDestroy`-Methode ergänzt, die
  den ExecutorService nach allen Regeln der Kunst ordentlich beendet.

2 years agoRefaktorisierung für Tests - ExecutorService als separate Bean erzeugt
Kai Moritz [Sat, 9 Apr 2022 11:21:43 +0000 (13:21 +0200)]
Refaktorisierung für Tests - ExecutorService als separate Bean erzeugt

2 years agoRefaktorisierung für Tests - Start des EndlessConsumer in ApplicationRunner
Kai Moritz [Sat, 9 Apr 2022 09:36:29 +0000 (11:36 +0200)]
Refaktorisierung für Tests - Start des EndlessConsumer in ApplicationRunner

* Bisher wurde der EndlessConsumer beim erzeugen der Bean gestartet
* Dies ist für das Aufsetzen von Tests ungünstig, da die erzeugte Bean
  dort nicht unbedingt direkt gestartet werden soll
* Daher wurde der Start des EndlessConsumer in einen ApplicationRunner
  ausgelagert

2 years agoRefaktorisierung für Tests - Bean-Definition in Config-Klasse verschoben
Kai Moritz [Sat, 9 Apr 2022 09:46:51 +0000 (11:46 +0200)]
Refaktorisierung für Tests - Bean-Definition in Config-Klasse verschoben

2 years agoRefaktorisierung für Tests - KafkaConsumer als eigenständige Bean
Kai Moritz [Sat, 9 Apr 2022 09:21:43 +0000 (11:21 +0200)]
Refaktorisierung für Tests - KafkaConsumer als eigenständige Bean

* Der KafakConsumer wird als eigenständige Bean erzeugt
* Die Bean wird dem EndlessConsumer im Konstruktor übergeben
* Dafür muss der Lebenszyklus der KafkaConsumer-Bean von dem der
  EndlessConsumer-Bean getrennt werden:
** close() darf nicht mehr im finally-Block im EndlessConsumer aufgerufen
   werden
** Stattdessen muss close() als Destry-Methode der Bean definiert werden
** Für start/stop muss stattdessen unsubscribe() im finally-Block aufgerufen
   werden
** Da unsubscribe() die Offset-Position nicht commited, muss explizit
   ein Offsset-Commit beauftragt werden, wenn der Consumer regulär
   gestoppt wird (WakeupException)

2 years agoDie Offsets werden ausgegeben, wenn eine Partition zugeteilt/entzogen wird
Kai Moritz [Sat, 9 Apr 2022 16:29:44 +0000 (18:29 +0200)]
Die Offsets werden ausgegeben, wenn eine Partition zugeteilt/entzogen wird

2 years agoGesehene Schlüssel sollten als long gezählt werden
Kai Moritz [Sat, 9 Apr 2022 16:00:48 +0000 (18:00 +0200)]
Gesehene Schlüssel sollten als long gezählt werden

2 years agoMerge branch 'endless-stream-consumer' into rebalance-listener
Kai Moritz [Sun, 10 Apr 2022 20:15:34 +0000 (22:15 +0200)]
Merge branch 'endless-stream-consumer' into rebalance-listener

2 years agoHealthIndicator implementiert
Kai Moritz [Sun, 10 Apr 2022 19:56:37 +0000 (21:56 +0200)]
HealthIndicator implementiert

2 years agoshutdown-Endpoint aktiviert
Kai Moritz [Sun, 10 Apr 2022 18:55:56 +0000 (20:55 +0200)]
shutdown-Endpoint aktiviert

2 years agoInformationen zur Kafka-Konfiguration im info-Endpoint sichtbar gemacht
Kai Moritz [Sun, 10 Apr 2022 18:55:42 +0000 (20:55 +0200)]
Informationen zur Kafka-Konfiguration im info-Endpoint sichtbar gemacht

2 years agoInformationen zur Java-Umgebung im info-Endpoint aktiviert
Kai Moritz [Sun, 10 Apr 2022 18:55:13 +0000 (20:55 +0200)]
Informationen zur Java-Umgebung im info-Endpoint aktiviert

2 years agoDas Git-Commit-Id-Plugin generiert eine git.properties
Kai Moritz [Sun, 10 Apr 2022 18:27:49 +0000 (20:27 +0200)]
Das Git-Commit-Id-Plugin generiert eine git.properties

2 years agoDas Spring-Boot-Maven-Plugin generiert Build-Info
Kai Moritz [Sun, 10 Apr 2022 18:25:28 +0000 (20:25 +0200)]
Das Spring-Boot-Maven-Plugin generiert Build-Info

2 years agoDefault-Konfiguration überarbeitet
Kai Moritz [Sun, 10 Apr 2022 17:52:09 +0000 (19:52 +0200)]
Default-Konfiguration überarbeitet

* Eine über die IDE bzw. Maven gestartete Instanz soll klar als solche
  erkennbar sein (`client.id` = DEV), darf dafür aber im Compose-Setup
  mitspielen (`group.id` = my-group).
* Bisher gab es häufig Port-Konflikte, wenn über die IDE bzw. über Maven
  parallel zu einem Compose-Setup eine Instanz gestartet wurde. Daher wird
  jetzt hier explizit auf einen abweichenden Port (8881) ausgewichen.
* Im Compose-Setup auch den neuen Port für den Producer übernommen

2 years agoFalschen Status-Code bei start/stop-Fehler korrigiert
Kai Moritz [Sun, 10 Apr 2022 17:49:44 +0000 (19:49 +0200)]
Falschen Status-Code bei start/stop-Fehler korrigiert

2 years agoVerständliche Fehlermeldungen für DriverController
Kai Moritz [Fri, 25 Mar 2022 14:20:00 +0000 (15:20 +0100)]
Verständliche Fehlermeldungen für DriverController

2 years agoMerge branch 'endless-stream-consumer' into rebalance-listener
Kai Moritz [Sun, 10 Apr 2022 17:03:38 +0000 (19:03 +0200)]
Merge branch 'endless-stream-consumer' into rebalance-listener

2 years agoThread-Synchronisation bei start/stop überarbeitet
Kai Moritz [Sun, 10 Apr 2022 16:58:16 +0000 (18:58 +0200)]
Thread-Synchronisation bei start/stop überarbeitet

2 years agoFehlerbehandlung in EndlessConsumer.destroy() korrigiert
Kai Moritz [Sat, 9 Apr 2022 16:50:43 +0000 (18:50 +0200)]
Fehlerbehandlung in EndlessConsumer.destroy() korrigiert

2 years agoValidierung erfolgt über spring-boot-starter-validation
Kai Moritz [Sat, 9 Apr 2022 07:52:59 +0000 (09:52 +0200)]
Validierung erfolgt über spring-boot-starter-validation

2 years agoMerge branch rebalance-listener into counting-consumer
Kai Moritz [Fri, 8 Apr 2022 10:44:37 +0000 (12:44 +0200)]
Merge branch rebalance-listener into counting-consumer

* Nur wegen der Rück-Umbenennung des counting-consumer in endless-consumer
* Die anderen Änderungen aus dem Branch wurden entfernt

2 years agoRückbau auf verschachtelte Maps
Kai Moritz [Thu, 7 Apr 2022 07:25:41 +0000 (09:25 +0200)]
Rückbau auf verschachtelte Maps

* Die zuvor erfundenen fachlichen Klassen passen nicht zu dazu, dass man
  sie - wie gedacht - direkt in MongoDB stopfen könnte.
* Daher hier erst mal der Rückbau auf Maps, da das dan für die Übungen
  einfacher ist.

2 years agocounting-consumer ist eine Verbesserung von endless-consumer
Kai Moritz [Wed, 6 Apr 2022 17:51:35 +0000 (19:51 +0200)]
counting-consumer ist eine Verbesserung von endless-consumer

2 years agoBenennung der neuen fachlichen Klassen verbessert
Kai Moritz [Wed, 6 Apr 2022 06:45:57 +0000 (08:45 +0200)]
Benennung der neuen fachlichen Klassen verbessert

2 years agoVerschachtelte Map gegen fachliche Datenstruktur ausgetauscht
Kai Moritz [Wed, 6 Apr 2022 06:34:18 +0000 (08:34 +0200)]
Verschachtelte Map gegen fachliche Datenstruktur ausgetauscht

2 years agoReport über gesehene Schlüssel wiederbelebt
Kai Moritz [Tue, 5 Apr 2022 20:37:55 +0000 (22:37 +0200)]
Report über gesehene Schlüssel wiederbelebt

* An der alten Stelle war die Map ja jetzt nur noch leer, da dem Consumer
  zu dem Zeitpunkt, an dem die gesehen Schlüssel ausgegeben wurden, bereits
  alle Partitionen entzogen worden sind.
* Daher werden die gesehenen Schlüssel jetzt ausgegeben, wenn eine
  Partition entzogen wird.

2 years agoRebalance-Listener anstatt Wegwerfen der Map
Kai Moritz [Tue, 5 Apr 2022 20:25:47 +0000 (22:25 +0200)]
Rebalance-Listener anstatt Wegwerfen der Map

2 years agoHTTPie gibt nicht nur den Response, sondern auch den Request aus
Kai Moritz [Sun, 3 Apr 2022 10:19:47 +0000 (12:19 +0200)]
HTTPie gibt nicht nur den Response, sondern auch den Request aus

2 years agoMerge des Upgrades der Confluent-Images auf 7.0.2
Kai Moritz [Sun, 3 Apr 2022 06:19:26 +0000 (08:19 +0200)]
Merge des Upgrades der Confluent-Images auf 7.0.2

2 years agoMerge des Upgrades der Confluent-Images auf 7.0.2
Kai Moritz [Sun, 3 Apr 2022 06:18:08 +0000 (08:18 +0200)]
Merge des Upgrades der Confluent-Images auf 7.0.2

2 years agoUpgrade der Images von Confluent 6.2.0 auf 7.0.2
Kai Moritz [Sun, 3 Apr 2022 06:15:30 +0000 (08:15 +0200)]
Upgrade der Images von Confluent 6.2.0 auf 7.0.2

2 years agoDer Consumer erkennt die Änderung der Partitionierung schneller
Kai Moritz [Sat, 2 Apr 2022 15:18:06 +0000 (17:18 +0200)]
Der Consumer erkennt die Änderung der Partitionierung schneller

* `metadata.max.age.ms` auf 1000 heruntergesetzt (Default 5 min)
* Dadurch wird die Änderung der Anzahl an Partitionen zeitnah erkannt

2 years agoFür null-Keys wird der String NULL gezählt
Kai Moritz [Sat, 2 Apr 2022 13:11:40 +0000 (15:11 +0200)]
Für null-Keys wird der String NULL gezählt

2 years agoREADME.sh zeigt die Auswirkung einer geänderten Partitions-Anzahl
Kai Moritz [Sat, 2 Apr 2022 08:42:05 +0000 (10:42 +0200)]
README.sh zeigt die Auswirkung einer geänderten Partitions-Anzahl

2 years agoDer Consumer zählt jetzt die Nachrichten pro Key für jedes Topic
Kai Moritz [Fri, 1 Apr 2022 20:02:28 +0000 (22:02 +0200)]
Der Consumer zählt jetzt die Nachrichten pro Key für jedes Topic

* Die Ergebnisse werden beim Beenden des Consumer ausgegeben
* Wenn der Consumer neu gestartet wird, werden die Ergebnisse zurückgesetzt
* Über /seen können Zwischenstände abgefragt werden

2 years ago`auto.offset.reset` konfigurierbar gemacht
Kai Moritz [Fri, 1 Apr 2022 09:44:22 +0000 (11:44 +0200)]
`auto.offset.reset` konfigurierbar gemacht

2 years agoFehler bei der Erzeugung des KafkaConsumer werden nicht mehr verschluckt
Kai Moritz [Fri, 1 Apr 2022 09:40:14 +0000 (11:40 +0200)]
Fehler bei der Erzeugung des KafkaConsumer werden nicht mehr verschluckt

* Beim Erzeugen der Properties-Instanz können Exceptions fliegen
* Beim Erzeugen der KafkaConsumer-Instanz können Exception fliegen
* Daher wurden diese Schritte in den try/catch-Block verlegt
* Neben der Nachricht wird jetzt auch der ganze Stack-Trace gelogged
* Da die Erzeugung des KafkaConsumer jetzt im try/catch-Block geschieht,
  wird der EndlessConsumer im Fehlerfall korrekt als beendet markiert

2 years agoEndless Consumer: a simple consumer, implemented as Spring-Boot-App
Kai Moritz [Thu, 31 Mar 2022 17:49:28 +0000 (19:49 +0200)]
Endless Consumer: a simple consumer, implemented as Spring-Boot-App

2 years agoSimpleConsumer in EndlessConsumer umbenannt
Kai Moritz [Fri, 1 Apr 2022 08:10:42 +0000 (10:10 +0200)]
SimpleConsumer in EndlessConsumer umbenannt

* Ohne die Umbenennung _vor_ der Veränderung würde die Versions-Historie
  der Klasse verloren gehen!

2 years agoREADME.sh verwendet den cli-Service für Kommandos
Kai Moritz [Fri, 1 Apr 2022 09:56:34 +0000 (11:56 +0200)]
README.sh verwendet den cli-Service für Kommandos

2 years agoFälschlich hartkodiertes Topic gegen Variable getauscht
Kai Moritz [Fri, 25 Mar 2022 14:27:50 +0000 (15:27 +0100)]
Fälschlich hartkodiertes Topic gegen Variable getauscht