<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>The Kumuluz Blog</title>
    <description>The Kumuluz range of products offers a wide variety of technological innovations, spanning from integration platforms all the way to developer frameworks.
</description>
    <link>https://blog.kumuluz.com/</link>
    <atom:link href="https://blog.kumuluz.com/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Fri, 10 Apr 2026 12:01:28 +0000</pubDate>
    <lastBuildDate>Fri, 10 Apr 2026 12:01:28 +0000</lastBuildDate>
    
      <item>
        <title>KumuluzEE Security 1.3.0 released</title>
        <description>&lt;p&gt;We are excited to announce a new minor version of KumuluzEE Security - 1.3.0.&lt;/p&gt;

&lt;p&gt;This release adds support for new authentication provider - Firebase Authentication.&lt;/p&gt;

&lt;!--more--&gt;
&lt;h4 id=&quot;features&quot;&gt;Features&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Validate ID tokens generated by Firebase.&lt;/li&gt;
  &lt;li&gt;Check roles provided in custom claims and deny access if user lacks required roles.&lt;/li&gt;
  &lt;li&gt;Validate session cookie instead of ID token.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check out the release on GitHub: &lt;a href=&quot;https://github.com/kumuluz/kumuluzee-security/releases/tag/v1.3.0&quot;&gt;KumuluzEE Security v1.3.0&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Fri, 09 Jun 2023 00:00:00 +0000</pubDate>
        <link>https://blog.kumuluz.com/product/announcement/developers/2023/06/09/KumuluzEE-Security-1-3-0-released.html</link>
        <guid isPermaLink="true">https://blog.kumuluz.com/product/announcement/developers/2023/06/09/KumuluzEE-Security-1-3-0-released.html</guid>
        
        <category>KumuluzEE</category>
        
        <category>Java EE</category>
        
        <category>Microservices</category>
        
        
        <category>Product</category>
        
        <category>Announcement</category>
        
        <category>Developers</category>
        
      </item>
    
      <item>
        <title>KumuluzEE REST 2.0.1 released</title>
        <description>&lt;p&gt;We are excited to announce a new major version of KumuluzEE REST - 2.0.1.&lt;/p&gt;

&lt;p&gt;This release brings support for Java 17, along with the support for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LocalDateTime&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LocalDate&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LocalTime&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;OffsetTime&lt;/code&gt; temporal fields and a couple of new filters - the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BETWEEN&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NBETWEEN&lt;/code&gt; filters.&lt;/p&gt;

&lt;p&gt;The minimum supported Java version is now Java 11. &lt;strong&gt;If you are still using older versions of Java, please use the 1.x.x version of KumuluzEE REST instead.&lt;/strong&gt;&lt;/p&gt;

&lt;!--more--&gt;

&lt;h4 id=&quot;features&quot;&gt;Features:&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Support for Java 17.&lt;/li&gt;
  &lt;li&gt;Added &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BETWEEN&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NBETWEEN&lt;/code&gt; filters&lt;/li&gt;
  &lt;li&gt;Added support for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LocalDateTime&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LocalDate&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LocalTime&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;OffsetTime&lt;/code&gt; fields&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;enhancements&quot;&gt;Enhancements:&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Upped dependency versions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check out the release on GitHub: &lt;a href=&quot;https://github.com/kumuluz/kumuluzee-rest/releases/tag/v2.0.1&quot;&gt;KumuluzEE REST v2.0.1&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Tue, 28 Mar 2023 00:00:00 +0000</pubDate>
        <link>https://blog.kumuluz.com/product/announcement/developers/2023/03/28/KumuluzEE-REST-2-0-1-released.html</link>
        <guid isPermaLink="true">https://blog.kumuluz.com/product/announcement/developers/2023/03/28/KumuluzEE-REST-2-0-1-released.html</guid>
        
        <category>KumuluzEE</category>
        
        <category>Java EE</category>
        
        <category>Microservices</category>
        
        
        <category>Product</category>
        
        <category>Announcement</category>
        
        <category>Developers</category>
        
      </item>
    
      <item>
        <title>KumuluzEE JCache 2.0.0 released</title>
        <description>&lt;p&gt;We are excited to announce the next major version of KumuluzEE JCache - 2.0.0. This release adds support for the newest KumuluzEE version 4 and adds support for Java 17 LTS and Java 18.&lt;/p&gt;

&lt;p&gt;This release also uses the new configuration prefix &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kumuluzee.jcache.caffeine.caches&lt;/code&gt; instead of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kumuluzee.jcache.caffeine.caffeine.jcache&lt;/code&gt; and adds support for the entire configuration framework instead only yaml files, including overriding properties from ENV variables.&lt;/p&gt;

&lt;!--more--&gt;

&lt;h5 id=&quot;an-example-of-migration-to-the-new-configuration-prefix&quot;&gt;An example of migration to the new configuration prefix:&lt;/h5&gt;

&lt;p&gt;Old:&lt;/p&gt;

&lt;pre&gt;
kumuluzee:
  jcache:
    caffeine:
      &lt;b&gt;caffeine.jcache:&lt;/b&gt;
        default:
          policy:
            maximum:
              size: 10000
        exampleCache:
          policy:
            eager-expiration:
              after-write: &quot;1s&quot;
&lt;/pre&gt;

&lt;p&gt;New:&lt;/p&gt;

&lt;pre&gt;
kumuluzee:
  jcache:
    caffeine:
      &lt;b&gt;caches:&lt;/b&gt;
        default:
          policy:
            maximum:
              size: 10000
        exampleCache:
          policy:
            eager-expiration:
              after-write: &quot;1s&quot;
&lt;/pre&gt;

&lt;p&gt;Since the support for Java 1.8 is dropped by KumuluzEE 4.0.0, the KumuluzEE JCache 2.0.0 also drops support for Java 1.8.&lt;/p&gt;

&lt;h4 id=&quot;features&quot;&gt;Features&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Added support for KumuluzEE 4.0.0 and above&lt;/li&gt;
  &lt;li&gt;Added support for Java 17 LTS and Java 18&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;bugs&quot;&gt;Bugs&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Fixed initialization from configuration - do not rely on a bug in core, instead use getMapKeys/getListSize&lt;/li&gt;
  &lt;li&gt;Fixed initialization from configuration - use the whole configuration framework instead of only yaml files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Note: This release of KumuluzEE Config MP requires the KumuluzEE 4.0 or higher in order to work correctly.
Consequently, Java 11 or higher is also required.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Check out the release on GitHub: &lt;a href=&quot;https://github.com/kumuluz/kumuluzee-jcache/releases/tag/v2.0.0&quot;&gt;KumuluzEE JCache v2.0.0&lt;/a&gt;&lt;/p&gt;

</description>
        <pubDate>Sat, 03 Dec 2022 00:00:00 +0000</pubDate>
        <link>https://blog.kumuluz.com/product/announcement/developers/2022/12/03/KumuluzEE-JCache-2-0-0-released.html</link>
        <guid isPermaLink="true">https://blog.kumuluz.com/product/announcement/developers/2022/12/03/KumuluzEE-JCache-2-0-0-released.html</guid>
        
        <category>KumuluzEE</category>
        
        <category>Java EE</category>
        
        <category>Microservices</category>
        
        
        <category>Product</category>
        
        <category>Announcement</category>
        
        <category>Developers</category>
        
      </item>
    
      <item>
        <title>KumuluzEE CORS 2.0.0 released</title>
        <description>&lt;p&gt;We are excited to announce the next major version of KumuluzEE CORS - 2.0.0. This release adds support for the newest KumuluzEE version 4 and adds support for Java 17 LTS and Java 18.
Since the support for Java 1.8 is dropped by KumuluzEE 4.x, the KumuluzEE CORS 2.0.0 also drops support for Java 1.8.&lt;/p&gt;

&lt;p&gt;Features&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Added support for KumuluzEE 4.0.0 and above&lt;/li&gt;
  &lt;li&gt;Added support for Java 17 LTS and Java 18&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Note: This release of KumuluzEE Config MP requires the KumuluzEE 4.0 or higher in order to work correctly.
Consequently, Java 11 or higher is also required.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Check out the release on GitHub: &lt;a href=&quot;https://github.com/kumuluz/kumuluzee-cors/releases/tag/v2.0.0&quot;&gt;KumuluzEE CORS v2.0.0&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Fri, 02 Dec 2022 00:00:00 +0000</pubDate>
        <link>https://blog.kumuluz.com/product/announcement/developers/2022/12/02/kumuluzEE-CORS-2-0-0-released.html</link>
        <guid isPermaLink="true">https://blog.kumuluz.com/product/announcement/developers/2022/12/02/kumuluzEE-CORS-2-0-0-released.html</guid>
        
        <category>KumuluzEE</category>
        
        <category>Java EE</category>
        
        <category>Microservices</category>
        
        
        <category>Product</category>
        
        <category>Announcement</category>
        
        <category>Developers</category>
        
      </item>
    
      <item>
        <title>KumuluzEE Rest Client 2.0.0 released</title>
        <description>&lt;p&gt;We are excited to announce the next major version of KumuluzEE REST Client - 2.0.0. 
This release adds support for the newest KumuluzEE version 4 and adds support for Java 17 LTS and Java 18.
Since the support for Java 1.8 is dropped by KumuluzEE 4.x, the KumuluzEE REST Client 2.0.0 also drops support for Java 1.8.&lt;/p&gt;

&lt;p&gt;Features&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Added support for KumuluzEE 4.0.0 and above&lt;/li&gt;
  &lt;li&gt;Added support for Java 17 LTS and Java 18&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bugs&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Fixed issue with @FormParam processing and content-type header&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Note: This release of KumuluzEE Config MP requires the KumuluzEE 4.0 or higher in order to work correctly.
Consequently, Java 11 or higher is also required.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Check out the release on GitHub: &lt;a href=&quot;https://github.com/kumuluz/kumuluzee-rest-client/releases/tag/v2.0.0&quot;&gt;KumuluzEE Rest Client v2.0.0&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Thu, 01 Dec 2022 00:00:00 +0000</pubDate>
        <link>https://blog.kumuluz.com/product/announcement/developers/2022/12/01/kumuluzEE-Rest-Client-2-0-0-released.html</link>
        <guid isPermaLink="true">https://blog.kumuluz.com/product/announcement/developers/2022/12/01/kumuluzEE-Rest-Client-2-0-0-released.html</guid>
        
        <category>KumuluzEE</category>
        
        <category>Java EE</category>
        
        <category>Microservices</category>
        
        
        <category>Product</category>
        
        <category>Announcement</category>
        
        <category>Developers</category>
        
      </item>
    
      <item>
        <title>KumuluzEE Health 2.4.4 released</title>
        <description>&lt;p&gt;We have released a minor release of KumuluzEE Health 2.4.4 with the following:
This patch release fixes a initialization bug, where built-in health checks were not initialized from configuration.
Bugs:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Fixed built-in health check configuration detection - use getMapKeys and getListSize instead of yaml-specific Map/List detection, that was removed in KumuluzEE 4.1.0&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Note: This release of KumuluzEE Config MP requires the KumuluzEE 4.1.0 or higher in order to work correctly.
Consequently, Java 11 or higher is also required.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Check out the release on GitHub: &lt;a href=&quot;https://github.com/kumuluz/kumuluzee-health/releases/tag/v2.4.4&quot;&gt;KumuluzEE Health v2.4.4&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Wed, 30 Nov 2022 00:00:00 +0000</pubDate>
        <link>https://blog.kumuluz.com/product/announcement/developers/2022/11/30/kumuluzee-health-release.html</link>
        <guid isPermaLink="true">https://blog.kumuluz.com/product/announcement/developers/2022/11/30/kumuluzee-health-release.html</guid>
        
        <category>KumuluzEE</category>
        
        <category>Java EE</category>
        
        <category>Microservices</category>
        
        
        <category>Product</category>
        
        <category>Announcement</category>
        
        <category>Developers</category>
        
      </item>
    
      <item>
        <title>KumuluzEE MicroProfile Config 2.0.0 released</title>
        <description>&lt;p&gt;We are excited to announce the next major release of KumuluzEE Config MP. KumuluzeEE Config MP 2.0.0 implements the
MicroProfile Config 2.0 specification, which includes many improvements, among others the support for the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@ConfigProperties&lt;/code&gt; annotation which extracts bulk config properties into a POJO, the API which allows developers to
determine the winning source for a configuration value, and more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note: This release of KumuluzEE Config MP requires the KumuluzEE 4.1.0 or higher in order to work correctly.
Consequently, Java 11 or higher is also required.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Some of the bigger changes in the MicroProfile Config 2.0 specification like property expressions
(configuration value interpolation) and configuration profiles were added to the core KumuluzEE and can be used with
or without KumuluzEE Config MP extension. To read more about these changes see the
&lt;a href=&quot;https://github.com/kumuluz/kumuluzee/releases/tag/v4.1.0&quot;&gt;KumuluzEE 4.1.0 release notes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@ConfigProperties&lt;/code&gt; annotation allows bulk extraction of config properties into a CDI bean and works similarly to
the KumuluzEE native &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@ConfigBundle&lt;/code&gt; annotation. It works in the MicroProfile Config’s environment and supports its
features (e.g. converters, custom &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ConfigSource&lt;/code&gt; implementations, …). For example, take a look at the following class:&lt;/p&gt;

&lt;!--more--&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nd&quot;&gt;@ConfigProperties&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prefix&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;integrations.customer-service&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;CustomerServiceConfig&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nd&quot;&gt;@ConfigProperty&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;host&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;defaultValue&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;example.com&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hostname&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;port&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;8080&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 8080 is the default value&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Optional&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;authorization&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// getters&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Config&lt;/code&gt; API has also received some improvements. It includes a method to acquire a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ConfigValue&lt;/code&gt; instance,
exposing metadata about the configuration value such as the configuration source that provided the value, its ordinal
and the raw value before property expression evaluation. Additionally, the converter mechanism has been exposed,
allowing manual conversion of arbitrary values through the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Config&lt;/code&gt; API.&lt;/p&gt;

&lt;p&gt;For all changes included in this release, see the
&lt;a href=&quot;https://github.com/eclipse/microprofile-config/releases/tag/2.0&quot;&gt;MicroProfile Config 2.0 specification&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id=&quot;features&quot;&gt;Features:&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Implemented MicroProfile Config 2.0 specification&lt;/li&gt;
  &lt;li&gt;Migrated to KumuluzEE 4.x.x and dropped support for Java 1.8&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;bugs&quot;&gt;Bugs:&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Fixed default value not being used when injecting &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Optional&lt;/code&gt; with the default value supplied by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@ConfigProperty&lt;/code&gt; annotation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check out the release on GitHub: &lt;a href=&quot;https://github.com/kumuluz/kumuluzee-config-mp/releases/tag/v2.0.0&quot;&gt;KumuluzEE Config MicroProfile v2.0.0&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Thu, 14 Jul 2022 00:00:00 +0000</pubDate>
        <link>https://blog.kumuluz.com/product/announcement/developers/2022/07/14/kumuluzee-config-mp-2.0.0-release.html</link>
        <guid isPermaLink="true">https://blog.kumuluz.com/product/announcement/developers/2022/07/14/kumuluzee-config-mp-2.0.0-release.html</guid>
        
        <category>KumuluzEE</category>
        
        <category>Java EE</category>
        
        <category>Microservices</category>
        
        
        <category>Product</category>
        
        <category>Announcement</category>
        
        <category>Developers</category>
        
      </item>
    
      <item>
        <title>Announcing KumuluzEE Database Schema Migrations 1.0.0 release</title>
        <description>&lt;p&gt;We are pleased to announce the first stable release of the KumuluzEE Database Schema Migration extension for the KumuluzEE microservice framework.&lt;/p&gt;

&lt;p&gt;The extension provides an easy way to migrate database schemas with Liquibase.
It allows migrations at application startup or, if necessary, when the application is already running.
Therefore, the extension can speed up the development process by ensuring that database schemas are up to date when the application starts.&lt;/p&gt;

&lt;p&gt;The extension can be configured in the common KumuluzEE configuration file.
The only requirement is a configured data source where the schema migrations can be performed.
Since the extension is based on the Liquibase, all data sources supported by the Liquibase can be used in conjunction with this extension.&lt;/p&gt;

&lt;p&gt;The main advantages of the extension are:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Ensures that the database schema is up to date&lt;/li&gt;
  &lt;li&gt;Eliminates the need to perform migrations manually&lt;/li&gt;
  &lt;li&gt;Allows database schema migrations to be managed in the runtime&lt;/li&gt;
  &lt;li&gt;Enables database schema migrations for multiple databases&lt;/li&gt;
  &lt;li&gt;Manages database schema migrations on a per-application basis&lt;/li&gt;
  &lt;li&gt;Optionally starts each application run with fresh database state&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To get started quickly, configure the desired data source and link the migration to it.&lt;/p&gt;
&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;kumuluzee&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;datasources&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;jndi-name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;jdbc/ExampleDS&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;connection-url&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;jdbc:postgresql://localhost:5432/postgres&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;postgres&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;password&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;postgres&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;pool&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;max-size&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;20&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;database-schema-migrations&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;liquibase&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;changelogs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;jndi-name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;jdbc/ExampleDS&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;startup&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;na&quot;&gt;drop-all&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;false&lt;/span&gt;
            &lt;span class=&quot;na&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For step-by-step guide (example) see &lt;a href=&quot;https://github.com/kumuluz/kumuluzee-samples/tree/master/kumuluzee-database-schema-migrations-liquibase&quot;&gt;KumuluzEE migrations with Liquibase&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Mon, 04 Jul 2022 00:00:00 +0000</pubDate>
        <link>https://blog.kumuluz.com/product/announcement/developers/2022/07/04/kumuluzee-database-schema-migrations-1.0.0-release.html</link>
        <guid isPermaLink="true">https://blog.kumuluz.com/product/announcement/developers/2022/07/04/kumuluzee-database-schema-migrations-1.0.0-release.html</guid>
        
        <category>KumuluzEE</category>
        
        <category>Microservices</category>
        
        <category>Migrations</category>
        
        <category>KumuluzEE Database Schema Migrations</category>
        
        <category>Liquibase</category>
        
        
        <category>Product</category>
        
        <category>Announcement</category>
        
        <category>Developers</category>
        
      </item>
    
      <item>
        <title>Announcing KumuluzEE 4.1.0 release - with improvements to the configuration framework!</title>
        <description>&lt;p&gt;We are announcing the availability of KumuluzEE version 4.1.0.&lt;/p&gt;

&lt;p&gt;This release brings improvements to the configuration framework, such as configuration profiles, improved variable
interpolation, and more!&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Configuration profiles can be used to define plug-in configuration fragments, that can be turned on or off at the
deployment time. The fragments can define new configuration values or override existing ones in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;config.yml&lt;/code&gt; file.
Let’s look at an example defining the profile &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;live&lt;/code&gt;. Start by defining the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;config.yml&lt;/code&gt; file as usual:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;config.yml&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;integrations&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;customer-service&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http://localhost:8081&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now let’s define the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;live&lt;/code&gt; profile fragment:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;config-live.yml&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;integrations&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;customer-service&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http://customer-service.example.com:8081&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;When deploying the service, the profile can be activated by setting the configuration value &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kumuluzee.config.profile&lt;/code&gt;
to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;live&lt;/code&gt;, for example add the environment variable:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;KUMULUZEE_CONFIG_PROFILE=live
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Multiple configuration profiles can be activated by setting the configuration value &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kumuluzee.config.profile&lt;/code&gt; as CSV.
When overriding values, the last defined profile has the largest priority. For example: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;KUMULUZEE_CONFIG_PROFILE=docker,live&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The configuration profiles mechanism is generic and can be used to alter the behavior of your custom
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ConfigurationSource&lt;/code&gt; implementations by implementing the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;initProfile(String profileName)&lt;/code&gt; function of the interface.
The interface now also defines the default implementations of converter functions, which makes implementing custom
configuration sources easier and avoids duplication of implementations when the backing configuration source returns
only &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;String&lt;/code&gt; values.&lt;/p&gt;

&lt;p&gt;Another improvement added in this release is the support for nested value interpolation and support for default values
when using value interpolation. To understand these changes better, take a look at the next configuration:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;integrations&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;active-tenant&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;t2&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;tenant-t1&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;t1.example.com&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;tenant-t2&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;t2.example.com&lt;/span&gt;
  
  &lt;span class=&quot;na&quot;&gt;customer-service&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;${integrations.tenant-${integrations.active-tenant:t1}.url}/customer-service&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In this case the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;integrations.customer-service.url&lt;/code&gt; configuration would be &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;t2.example.com&lt;/code&gt;, since
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;integrations.active-tenant&lt;/code&gt; is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;t2&lt;/code&gt;. If active tenant configuration key would not be defined, the default value
(&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;t1&lt;/code&gt;, defined after the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:&lt;/code&gt;) would be used instead.&lt;/p&gt;

&lt;p&gt;See the full changelog below.&lt;/p&gt;

&lt;h4 id=&quot;features&quot;&gt;Features:&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Added support for configuration profiles&lt;/li&gt;
  &lt;li&gt;FileConfigurationSource loads additional files when configuration profile is activated&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;enhancements&quot;&gt;Enhancements:&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Improved configuration value interpolation by adding nested interpolation and default value support&lt;/li&gt;
  &lt;li&gt;Implemented ConfigurationSource converter functions as default interface functions&lt;/li&gt;
  &lt;li&gt;Upped jandex version&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;bugs&quot;&gt;Bugs:&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Fixed return value of yaml configuration source: return Optional.empty() if found config value is a Map or a List&lt;/li&gt;
  &lt;li&gt;Defined default implementation for the deprecated getConfigurationSource() method in order to be able to remove it in the next major version&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check out the release on GitHub: &lt;a href=&quot;https://github.com/kumuluz/kumuluzee/releases/tag/v4.1.0&quot;&gt;KumuluzEE v4.1.0&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Tue, 21 Jun 2022 00:00:00 +0000</pubDate>
        <link>https://blog.kumuluz.com/product/announcement/developers/2022/06/21/kumuluzee-4.1.0-release.html</link>
        <guid isPermaLink="true">https://blog.kumuluz.com/product/announcement/developers/2022/06/21/kumuluzee-4.1.0-release.html</guid>
        
        <category>KumuluzEE</category>
        
        <category>Java EE</category>
        
        <category>Microservices</category>
        
        
        <category>Product</category>
        
        <category>Announcement</category>
        
        <category>Developers</category>
        
      </item>
    
      <item>
        <title>KumuluzEE 4.0.0 released, with Java 17 LTS support, Jetty 10 and more!</title>
        <description>&lt;p&gt;We are happy to announce the next major release of KumuluzEE 4.0.0. This release includes a major Jetty upgrade, support
for the latest released versions of Java, including the Java 17 LTS version and the use of JakartaEE 8 artifacts
replacing the JavaEE 8 artifacts.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;One of the major changes of this release is definitely the added support for the Java version 17. Java 17 is the latest
LTS version, which are the most suitable versions for production use. Compared to the previous LST version (Java 11),
Java 17 brings exciting new features such as records, text blocks, enhanced switch expressions, pattern matching of
the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;instanceof&lt;/code&gt; operator, teeing collector for the Stream API and more.&lt;/p&gt;

&lt;p&gt;Another exciting change in the new release of KumuluzEE is the transition from Jetty 9 to Jetty 10. The updated
version of Jetty brings many important bugfixes and improvements. The Servlet API 4.0 is now fully implemented allowing
better HTTP/2 support within internal components and general Servlet 4.0 usage according to the specification. The
WebSocket implementation has been refactored, also allowing HTTP/2 usage. The Jetty HTTP client (used by internal
components and our extensions, e.g. JAX-RS HTTP client, kumuluzee-rest-client’s backing HTTP client) has also been
improved, with the major feature being the support for dynamic protocol upgrade to HTTP/2.&lt;/p&gt;

&lt;p&gt;Another change in relation to Java versions is the end of support for the Java 1.8 runtime. The support for Java 1.8
was dropped in Jetty 10 and in turn we are also dropping support in KumuluzEE 4. If you are still running on Java 1.8,
this is the perfect opportunity to upgrade, as the newer Java versions bring many exciting features.&lt;/p&gt;

&lt;p&gt;Another transition we have made (also related to the Jetty 10 upgrade) is the transition from JavaEE 8 to JakartaEE 8
artifacts. This transition should not affect the actual code, only the locations and names of Maven artifacts.
If you are referencing any JavaEE artifacts in your code, make sure to update the references there too.&lt;/p&gt;

&lt;p&gt;The full list of breaking changes in this release:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;KumuluzEE no longer supports Java 1.8 runtime, since the support for Java 1.8 has been dropped in Jetty 10.&lt;/li&gt;
  &lt;li&gt;Replaced JavaEE 8 artifacts with the JakartaEE 8 artifacts. If you are using JavaEE artifacts in your code, you should be able to find equivalent artifacts in the JakartaEE namespace.&lt;/li&gt;
  &lt;li&gt;Removed excludedAgentPatterns from gzip configuration since it was removed from Jetty.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See the full changelog below.&lt;/p&gt;

&lt;h4 id=&quot;features&quot;&gt;Features:&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Upgraded from Jetty 9 to Jetty 10&lt;/li&gt;
  &lt;li&gt;Added support for Java 16, 17 and 18 and dropped support for Java 1.8&lt;/li&gt;
  &lt;li&gt;Use JakartaEE artifacts instead of JavaEE&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;enhancements&quot;&gt;Enhancements:&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Upped dependency versions&lt;/li&gt;
  &lt;li&gt;Removed excludedAgentPatterns from gzip configuration since it was removed from Jetty&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;bugs&quot;&gt;Bugs:&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Updated jar loading to add support for multi-release jars when running in UberJar&lt;/li&gt;
  &lt;li&gt;Added missing spaces in dependency validation log messages&lt;/li&gt;
  &lt;li&gt;More robust exception handling when loading configuration file&lt;/li&gt;
  &lt;li&gt;Updated JAX-WS annotation processor in order to support some edge cases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check out the release on GitHub: &lt;a href=&quot;https://github.com/kumuluz/kumuluzee/releases/tag/v4.0.0&quot;&gt;KumuluzEE v4.0.0&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Fri, 27 May 2022 00:00:00 +0000</pubDate>
        <link>https://blog.kumuluz.com/product/announcement/developers/2022/05/27/kumuluzee-4.0.0-release.html</link>
        <guid isPermaLink="true">https://blog.kumuluz.com/product/announcement/developers/2022/05/27/kumuluzee-4.0.0-release.html</guid>
        
        <category>KumuluzEE</category>
        
        <category>Java EE</category>
        
        <category>Microservices</category>
        
        
        <category>Product</category>
        
        <category>Announcement</category>
        
        <category>Developers</category>
        
      </item>
    
      <item>
        <title>Announcing the first prerelease of KumuluzEE 4.0.0</title>
        <description>&lt;p&gt;We are happy to announce the first Beta of KumuluzEE 4.0.0. This is the first prerelease of the major release, which
brings a major Jetty upgrade, support for the latest released versions of Java, including the Java 17 LTS version and
the use of JakartaEE 8 artifacts replacing the JavaEE 8 artifacts.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;The breaking changes in this release are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;KumuluzEE no longer supports Java 1.8 runtime, since the support for Java 1.8 has been dropped in Jetty 10.&lt;/li&gt;
  &lt;li&gt;Replaced JavaEE 8 artifacts with the JakartaEE 8 artifacts. If you are using JavaEE artifacts in your code, you should be able to find equivalent artifacts in the JakartaEE namespace.&lt;/li&gt;
  &lt;li&gt;Removed excludedAgentPatterns from gzip configuration since it was removed from Jetty.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See the full changelog below.&lt;/p&gt;

&lt;h4 id=&quot;features&quot;&gt;Features:&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Upgraded from Jetty 9 to Jetty 10&lt;/li&gt;
  &lt;li&gt;Added support for Java 16, 17 and 18 and dropped support for Java 1.8&lt;/li&gt;
  &lt;li&gt;Use JakartaEE artifacts instead of JavaEE&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;enhancements&quot;&gt;Enhancements:&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Upped dependency versions&lt;/li&gt;
  &lt;li&gt;Removed excludedAgentPatterns from gzip configuration since it was removed from Jetty&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;bugs&quot;&gt;Bugs:&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Updated jar loading to add support for multi-release jars when running in UberJar&lt;/li&gt;
  &lt;li&gt;Added missing spaces in dependency validation log messages&lt;/li&gt;
  &lt;li&gt;More robust exception handling when loading configuration file&lt;/li&gt;
  &lt;li&gt;Updated JAX-WS annotation procesor in order to support some edge cases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check out the release on GitHub: &lt;a href=&quot;https://github.com/kumuluz/kumuluzee/releases/tag/v4.0.0-beta.1&quot;&gt;KumuluzEE v4.0.0.beta.1&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Mon, 11 Apr 2022 00:00:00 +0000</pubDate>
        <link>https://blog.kumuluz.com/product/announcement/developers/2022/04/11/kumuluzee-4.0.0.beta.1-release.html</link>
        <guid isPermaLink="true">https://blog.kumuluz.com/product/announcement/developers/2022/04/11/kumuluzee-4.0.0.beta.1-release.html</guid>
        
        <category>KumuluzEE</category>
        
        <category>Java EE</category>
        
        <category>Microservices</category>
        
        
        <category>Product</category>
        
        <category>Announcement</category>
        
        <category>Developers</category>
        
      </item>
    
      <item>
        <title>KumuluzEE Database Schema Migrations - Liquibase extension</title>
        <description>&lt;p&gt;In the rapidly growing world of automation, there is a constant need for application updates.
Every change made to the application is nowadays version controlled, making it easy to automate deployment and, if necessary, roll back changes.
Today, it is not uncommon to have multiple versions of an application deployed on the same day.
Following this pattern, it quickly becomes clear that database schemas need to be managed in the same way.&lt;/p&gt;

&lt;p&gt;KumuluzEE is pleased to announce the Liquibase extension for database schema migration.
It allows you to migrate your schemas right at the application startup, so that you get the desired database state every time you run the application.
Moreover, it also offers a possibility to drop the database before migration, making it a perfect choice for development and testing purposes.
Not to be confused, Liquibase migrations via the Maven plugin are still infallible, especially in environments where we want to have full control.&lt;/p&gt;

&lt;p&gt;To get started with the Liquibase extension, 
all you need to do is add the Liquibase database schema migration extension to your existing pom file.&lt;/p&gt;
&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.kumuluz.ee.database-schema-migrations&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;kumuluzee-database-schema-migrations-liquibase&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;${kumuluzee-database-schema-migrations.version}&lt;span class=&quot;nt&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Furthermore, the known KumuluzEE configuration file has to be adjusted.&lt;/p&gt;
&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;kumuluzee&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;...&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;database-schema-migrations&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;liquibase&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;changelogs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;jndi-name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;jdbc/example-db&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;db/changelog-master.xml&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;startup&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;na&quot;&gt;drop-all&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;false&lt;/span&gt;           &lt;span class=&quot;c1&quot;&gt;# default: false  &lt;/span&gt;
            &lt;span class=&quot;na&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;true&lt;/span&gt;              &lt;span class=&quot;c1&quot;&gt;# default: false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The above configuration instructs the Liquibase extension to update the current database schemas.
The update is performed when the application is started.
This involves making changes to a pre-configured data source with the appropriate JNDI name, which in our case is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jdbc/example-db&lt;/code&gt;.
What changes will take place is defined in a Liquibase changelog file (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;db/changelog-master.xml&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;After we have everything set up, we can launch our application and see how it manages the migrations for us.&lt;/p&gt;

&lt;p&gt;For more information and detailed walkthrough, we recommend you take a look at the
&lt;a href=&quot;https://github.com/kumuluz/kumuluzee-database-schema-migrations#kumuluzee-database-schema-migrations&quot;&gt;KumuluzEE database schema migrations&lt;/a&gt; documentation on GitHub.&lt;/p&gt;

&lt;p&gt;If you are not yet familiar with &lt;a href=&quot;https://liquibase.org/&quot;&gt;Liquibase&lt;/a&gt;, we also recommend you to give it a try.&lt;/p&gt;
</description>
        <pubDate>Sat, 26 Feb 2022 00:00:00 +0000</pubDate>
        <link>https://blog.kumuluz.com/product/developers/2022/02/26/kumuluzee-liquibase-gh.html</link>
        <guid isPermaLink="true">https://blog.kumuluz.com/product/developers/2022/02/26/kumuluzee-liquibase-gh.html</guid>
        
        <category>KumuluzEE Database Schema Migrations</category>
        
        <category>Liquibase</category>
        
        
        <category>Product</category>
        
        <category>Developers</category>
        
      </item>
    
      <item>
        <title>KumuluzEE GraphQL 1.1.0 released!</title>
        <description>&lt;p&gt;We are excited to announce a new minor release - KumuluzEE GraphQL 1.1.0. This release includes a new MicroProfile
compatible implementation, we have updated the Graph&lt;em&gt;i&lt;/em&gt;QL (GraphQL UI) to support better schema exploration and fixed
some bugs in our existing implementation.&lt;/p&gt;

&lt;p&gt;To use the new MP-compatible implementation use the following dependency:&lt;/p&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.kumuluz.ee.graphql&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;kumuluzee-graphql-mp&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;${graphql.version}&lt;span class=&quot;nt&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note that the existing implementation (artifact &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kumuluzee-graphql&lt;/code&gt;) is still being updated. However, we advise new
users to start with the MP implementation since this implementation is more likely to receive new features in the future.&lt;/p&gt;

&lt;p&gt;Graph&lt;em&gt;i&lt;/em&gt;QL now includes the &lt;a href=&quot;https://github.com/OneGraph/graphiql-explorer&quot;&gt;explorer plugin&lt;/a&gt;,
which enables you to interactively construct a query or mutation. This makes schema exploration and API usage
even easier.&lt;/p&gt;

&lt;p&gt;Integration with KumuluzEE REST has also been revamped to be more intuitive and future-proof.
Sort and filter arguments are now string-based and limit/offset are now top level arguments.
This makes queries more readable and easier to process. The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;QueryParameters&lt;/code&gt; object can be constructed and used
with any KumuluzEE REST implementation (currently &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StreamUtils&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;JPAUtils&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;The samples for MP-compatible implementation are already available:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/kumuluz/kumuluzee-samples/tree/master/kumuluzee-graphql-jpa-simple&quot;&gt;kumuluzee-graphql-jpa-simple&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/kumuluz/kumuluzee-samples/tree/master/kumuluzee-graphql-jpa-security&quot;&gt;kumuluzee-graphql-jpa-security&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/kumuluz/kumuluzee-samples/tree/master/kumuluzee-graphql-advanced&quot;&gt;kumuluzee-graphql-advanced&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;features&quot;&gt;Features:&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Added MP-compatible implementation by SmallRye&lt;/li&gt;
  &lt;li&gt;Added Graph&lt;em&gt;i&lt;/em&gt;QL Explorer plugin&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;enhancements&quot;&gt;Enhancements:&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Converted GraphQL manual kumuluzee-rest processing to StreamUtils&lt;/li&gt;
  &lt;li&gt;Upped dependency versions&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;bugs&quot;&gt;Bugs:&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Fixed Graph&lt;em&gt;i&lt;/em&gt;QL servlet mapping&lt;/li&gt;
  &lt;li&gt;Fixed pagination limit bug&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check out the release on GitHub: &lt;a href=&quot;https://github.com/kumuluz/kumuluzee-graphql/releases/tag/v1.1.0&quot;&gt;KumuluzEE GraphQL v1.1.0&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Tue, 09 Feb 2021 00:00:00 +0000</pubDate>
        <link>https://blog.kumuluz.com/product/announcement/developers/2021/02/09/kumuluzee-graphql-1.1.0-release.html</link>
        <guid isPermaLink="true">https://blog.kumuluz.com/product/announcement/developers/2021/02/09/kumuluzee-graphql-1.1.0-release.html</guid>
        
        <category>KumuluzEE</category>
        
        <category>Java EE</category>
        
        <category>Microservices</category>
        
        <category>GraphQL</category>
        
        
        <category>Product</category>
        
        <category>Announcement</category>
        
        <category>Developers</category>
        
      </item>
    
      <item>
        <title>Announcing a new minor release - KumuluzEE 3.12.0!</title>
        <description>&lt;p&gt;We are excited to announce a new KumuluzEE minor version - KumuluzEE 3.12.0! The most significant feature in this
release is the support for Java 15. Dependencies have been updated to their latest minor versions, and a collection of
tough bugs have been cracked. Check out the full changelog below:&lt;/p&gt;

&lt;!--more--&gt;

&lt;h4 id=&quot;features&quot;&gt;Features:&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Support for Java 15&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;enhancements&quot;&gt;Enhancements:&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Use the new API for Jetty SSL configuration&lt;/li&gt;
  &lt;li&gt;Added GraphQL as an extension group&lt;/li&gt;
  &lt;li&gt;Upped dependency versions&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;bugs&quot;&gt;Bugs:&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Fixed integration between Agroal and Narayana for XA transactions&lt;/li&gt;
  &lt;li&gt;Fixed incorrect parsing of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;transaction-isolation&lt;/code&gt; configuration value&lt;/li&gt;
  &lt;li&gt;Fixed incorrect jUnit scope&lt;/li&gt;
  &lt;li&gt;Resolved dependency conflict in MP 3.3&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check out the release on GitHub: &lt;a href=&quot;https://github.com/kumuluz/kumuluzee/releases/tag/v3.12.0&quot;&gt;KumuluzEE v3.12.0&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Wed, 13 Jan 2021 00:00:00 +0000</pubDate>
        <link>https://blog.kumuluz.com/product/announcement/developers/2021/01/13/kumuluzee-3.12.0-release.html</link>
        <guid isPermaLink="true">https://blog.kumuluz.com/product/announcement/developers/2021/01/13/kumuluzee-3.12.0-release.html</guid>
        
        <category>KumuluzEE</category>
        
        <category>Java EE</category>
        
        <category>Microservices</category>
        
        
        <category>Product</category>
        
        <category>Announcement</category>
        
        <category>Developers</category>
        
      </item>
    
      <item>
        <title>KumuluzEE OpenAPI MP and KumuluzEE Health new versions released</title>
        <description>&lt;p&gt;New versions of &lt;a href=&quot;https://github.com/kumuluz/kumuluzee-openapi-mp&quot;&gt;&lt;em&gt;KumuluzEE OpenAPI MP&lt;/em&gt;&lt;/a&gt; and &lt;a href=&quot;https://github.com/kumuluz/kumuluzee-health&quot;&gt;&lt;em&gt;KumuluzEE Health&lt;/em&gt;&lt;/a&gt; were released today.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;em&gt;Kumuluz OpenAPI MP&lt;/em&gt; received an update to the Maven plugin which now works much faster and includes better integration with other KumuluzEE extensions.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;KumuluzEE Health&lt;/em&gt; received update of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;KafkaHealthCheck&lt;/code&gt; and now allows you to define any Kafka client configuration property in the KumuluzEE configuration framework. This allows you to fully control how the health check communicates with the cluster. Integration with the &lt;em&gt;KumuluzEE OpenAPI MP&lt;/em&gt; has also been updated and now allows integration with OpenAPI Maven Plugin.&lt;/p&gt;

&lt;p&gt;Check out the release notes for more information:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/kumuluz/kumuluzee-openapi-mp/releases/tag/v1.4.0&quot;&gt;&lt;em&gt;Kumuluz OpenAPI MP&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/kumuluz/kumuluzee-health/releases/tag/v2.4.0&quot;&gt;&lt;em&gt;Kumuluz Health&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Fri, 13 Nov 2020 00:00:00 +0000</pubDate>
        <link>https://blog.kumuluz.com/product/developers/2020/11/13/kumuluzee-openapi-health-release.html</link>
        <guid isPermaLink="true">https://blog.kumuluz.com/product/developers/2020/11/13/kumuluzee-openapi-health-release.html</guid>
        
        <category>KumuluzEE OpenAPI</category>
        
        <category>KumuluzEE Health</category>
        
        <category>Microprofile</category>
        
        <category>JavaEE</category>
        
        
        <category>Product</category>
        
        <category>Developers</category>
        
      </item>
    
      <item>
        <title>New releases of KumuluzEE OpenAPI MP and Health</title>
        <description>&lt;p&gt;We have just released new versions of &lt;a href=&quot;https://github.com/kumuluz/kumuluzee-openapi-mp&quot;&gt;KumuluzEE OpenAPI MP&lt;/a&gt; and &lt;a href=&quot;https://github.com/kumuluz/kumuluzee-health&quot;&gt;KumuluzEE Health&lt;/a&gt;. New features include a Maven plugin which generates OpenAPI schema at compile-time, a new health check for Kafka clusters and integration between the two extensions.&lt;/p&gt;

&lt;!--more--&gt;

&lt;h2 id=&quot;kumuluzee-openapi-microprofile-130&quot;&gt;&lt;a href=&quot;https://github.com/kumuluz/kumuluzee-openapi-mp/releases/tag/v1.3.0&quot;&gt;KumuluzEE OpenAPI MicroProfile 1.3.0&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;This version of &lt;em&gt;KumuluzEE OpenAPI MicroProfile&lt;/em&gt; brings a new Maven plugin which generates OpenAPI schema at compile-time and a new SPI interface which can be used to extend the generated schema.&lt;/p&gt;

&lt;p&gt;To use the new Maven plugin add it to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pom.xml&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;kumuluzee-openapi-mp-maven-plugin&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.kumuluz.ee.openapi&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;${kumuluzee-openapi-mp.version}&lt;span class=&quot;nt&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;executions&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;execution&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;goals&amp;gt;&lt;/span&gt;
                &lt;span class=&quot;nt&quot;&gt;&amp;lt;goal&amp;gt;&lt;/span&gt;generate&lt;span class=&quot;nt&quot;&gt;&amp;lt;/goal&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;/goals&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;/execution&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/executions&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;On next build the schema will be available in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;target/generated/openapi.yaml&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;target/generated/openapi.json&lt;/code&gt;. For more information about the maven plugin, see &lt;a href=&quot;https://github.com/kumuluz/kumuluzee-openapi-mp#openapi-maven-plugin&quot;&gt;README&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The new SPI interface allows extension developers to extend the generated schema. To use it implement the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;com.kumuluz.ee.openapi.mp.spi.OasFilterProvider&lt;/code&gt; interface and register it with a service file.&lt;/p&gt;

&lt;h2 id=&quot;kumuluzee-health-230&quot;&gt;&lt;a href=&quot;https://github.com/kumuluz/kumuluzee-health/releases/tag/v2.3.0&quot;&gt;KumuluzEE Health 2.3.0&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;This release of &lt;em&gt;KumuluzEE Health&lt;/em&gt; brings a new health check for Kafka clusters, integration with KumuluzEE OpenAPI MP and a minor bugfix.&lt;/p&gt;

&lt;p&gt;The new health check allows you to monitor the health status of your Kafka cluster. To use it add the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kafka-clients&lt;/code&gt; dependency (already included in &lt;a href=&quot;https://github.com/kumuluz/kumuluzee-streaming&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kumuluzee-streaming&lt;/code&gt;&lt;/a&gt;) and activate it in the configuration framework. For example in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;config.yml&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;kumuluzee&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;health&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;checks&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;kafka-health-check&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;bootstrap-servers&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;localhost:9095,localhost:9096,localhost:9097&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;minimum-available-nodes&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;request-timeout-ms&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For more information see &lt;a href=&quot;https://github.com/kumuluz/kumuluzee-health#kafkahealthcheck&quot;&gt;README&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We have integrated KumuluzEE Health with &lt;a href=&quot;https://github.com/kumuluz/kumuluzee-openapi-mp&quot;&gt;KumuluzEE OpenAPI MP&lt;/a&gt; extension. You can now add &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/health&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/health/ready&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/health/live&lt;/code&gt; endpoints to OpenAPI schema by activating the integration in the configuration framework. For example in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;config.yml&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;kumuluzee&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;health&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;openapi-mp&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;enabled&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We are excited to bring these two new releases into your hands!&lt;/p&gt;
</description>
        <pubDate>Mon, 02 Nov 2020 00:00:00 +0000</pubDate>
        <link>https://blog.kumuluz.com/product/developers/2020/11/02/kumuluzee-openapi-health-release.html</link>
        <guid isPermaLink="true">https://blog.kumuluz.com/product/developers/2020/11/02/kumuluzee-openapi-health-release.html</guid>
        
        <category>KumuluzEE OpenAPI</category>
        
        <category>KumuluzEE Health</category>
        
        <category>Microprofile</category>
        
        <category>JavaEE</category>
        
        
        <category>Product</category>
        
        <category>Developers</category>
        
      </item>
    
      <item>
        <title>KumuluzEE Kafka Streaming with Schema Registry</title>
        <description>&lt;p&gt;Apache Kafka is an excellent tool enabling asynchronous architecture in the modern microservice world. While Kafka offers very high-level abstractions in the form of Producer/Consumer APIs, Streams API, and Processor APIs, there is no out of the box support for managing the schema of records. &lt;a href=&quot;https://github.com/confluentinc/schema-registry&quot;&gt;Confluent Schema Registry&lt;/a&gt; is a tool solving this problem. This guide will show how you can use Schema Registry with &lt;a href=&quot;https://github.com/kumuluz/kumuluzee-streaming&quot;&gt;kumuluzee-streaming&lt;/a&gt; and suggest a typical development flow for this setup.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;In a way, the problem of defining and evolving a schema of your Kafka records is very similar to REST API and JSON schema evolution. Once you deploy a REST API to production, the clients have a basic expectation of JSON payloads not changing between minor API versions. Adding optional fields is usually considered a non-breaking change while renaming or removing required fields can break the clients and requires a major API version release (which implies a completely new API URL with eventual client migration).&lt;/p&gt;

&lt;p&gt;In REST, you would usually use OpenAPI specification and diff tools to maintain compatibility between updates and use it as a contract between client and server. Similarly, if Kafka producer starts inserting incompatible records, these can break existing consumers which are not yet updated to use the new schema. One way to keep the record schemas compatible is by relying on developers to stick to a predefined set of rules of what changes are allowed in minor updates but since everyone makes mistakes, this might not be the most reliable option in the long term. The better way is using a Schema Registry, a tool that stores all our record schemas and does compatibility checks automatically every time we update a schema. This way we can always be sure that our schema changes are compatible. 
run
This post assumes you are already familiar with regular Kafka tooling. For regular Kafka usage with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kumuluzee-streaming&lt;/code&gt; extension, check out &lt;a href=&quot;https://github.com/kumuluz/kumuluzee-samples/tree/master/kumuluzee-streaming-kafka&quot;&gt;kumuluzee-streaming-kafka&lt;/a&gt; sample on GitHub.
Full code sample used in this blog post can be found at &lt;a href=&quot;https://github.com/kumuluz/kumuluzee-samples/tree/master/kumuluzee-streaming-kafka-registry&quot;&gt;kumuluzee-streaming-kafka-registry&lt;/a&gt;.&lt;/p&gt;

&lt;h1 id=&quot;additional-tooling-and-dependencies&quot;&gt;Additional tooling and dependencies&lt;/h1&gt;

&lt;p&gt;In order to use Schema Registry, we need additional maven dependencies and Docker containers in our projects.&lt;/p&gt;

&lt;h2 id=&quot;docker&quot;&gt;Docker&lt;/h2&gt;

&lt;p&gt;You can find a sample &lt;a href=&quot;https://github.com/kumuluz/kumuluzee-samples/blob/master/kumuluzee-streaming-kafka-registry/docker-compose.yaml&quot;&gt;docker-compose.yaml&lt;/a&gt; in the repository. It uses:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;confluentinc/cp-zookeeper&lt;/code&gt; Official Confluent Zookeeper container.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;confluentinc/cp-kafka&lt;/code&gt; Official Confluent Kafka container.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;confluentinc/cp-schema-registry&lt;/code&gt; Official Confluent Schema Registry container for managing our schemas.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;landoop/schema-registry-ui&lt;/code&gt; 3rd party UI to view (and potentially manage) the Schema Registry.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;obsidiandynamics/kafdrop&lt;/code&gt; Kafdrop is one of the best Kafka UI tools and one of the only ones allowing us to view actual records in the UI.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The #4 and #5 are optional but good for visualization of this tutorial.&lt;/p&gt;

&lt;p&gt;To start all the containers, simply run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker-compose up -d&lt;/code&gt; in the root folder.&lt;/p&gt;

&lt;h2 id=&quot;maven-dependencies&quot;&gt;Maven Dependencies&lt;/h2&gt;

&lt;p&gt;In addition to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kumuluzee-streaming&lt;/code&gt; extension dependency, we need to include Avro for the handling of serialization and deserialization from POJO to Avro data format. Avro is the primary format used by Schema Registry to define schemas, other available formats are protobufs and JSON Schema.&lt;/p&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apache.avro&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;avro&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We also need Kafka Avro Serializers/Deserializers to plug into Kafka Producers/Consumers:&lt;/p&gt;
&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;io.confluent&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;kafka-avro-serializer&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;For Streams, we need Avro Serde dependency:&lt;/p&gt;
&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;io.confluent&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;kafka-streams-avro-serde&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To generate Java POJOs from our Avro schema files, we need &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;avro-maven-plugin&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apache.avro&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;avro-maven-plugin&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;executions&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;execution&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;phase&amp;gt;&lt;/span&gt;generate-sources&lt;span class=&quot;nt&quot;&gt;&amp;lt;/phase&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;goals&amp;gt;&lt;/span&gt;
                &lt;span class=&quot;nt&quot;&gt;&amp;lt;goal&amp;gt;&lt;/span&gt;schema&lt;span class=&quot;nt&quot;&gt;&amp;lt;/goal&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;/goals&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
                &lt;span class=&quot;nt&quot;&gt;&amp;lt;sourceDirectory&amp;gt;&lt;/span&gt;...&lt;span class=&quot;nt&quot;&gt;&amp;lt;/sourceDirectory&amp;gt;&lt;/span&gt;
                &lt;span class=&quot;nt&quot;&gt;&amp;lt;outputDirectory&amp;gt;&lt;/span&gt;...&lt;span class=&quot;nt&quot;&gt;&amp;lt;/outputDirectory&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;/execution&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/executions&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Finally, to register and update local schemas from and to registry, we need &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;confluent-schema-registry-maven-plugin&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;io.confluent&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;kafka-schema-registry-maven-plugin&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;schemaTypes&amp;gt;&lt;/span&gt;

        &lt;span class=&quot;nt&quot;&gt;&amp;lt;/schemaTypes&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;subjects&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;/subjects&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;outputDirectory&amp;gt;&lt;/span&gt;...&lt;span class=&quot;nt&quot;&gt;&amp;lt;/outputDirectory&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;goals&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;goal&amp;gt;&lt;/span&gt;test-compatibility&lt;span class=&quot;nt&quot;&gt;&amp;lt;/goal&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/goals&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;additional-maven-repositories&quot;&gt;Additional Maven Repositories&lt;/h2&gt;

&lt;p&gt;Confluent artefacts are only available from their own repository so we need to add it either in m2 configuration or root &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pom.xml&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;pluginRepositories&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;pluginRepository&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;id&amp;gt;&lt;/span&gt;confluent&lt;span class=&quot;nt&quot;&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;name&amp;gt;&lt;/span&gt;Confluent&lt;span class=&quot;nt&quot;&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;url&amp;gt;&lt;/span&gt;http://packages.confluent.io/maven/&lt;span class=&quot;nt&quot;&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/pluginRepository&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/pluginRepositories&amp;gt;&lt;/span&gt;

&lt;span class=&quot;nt&quot;&gt;&amp;lt;repositories&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;repository&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;id&amp;gt;&lt;/span&gt;confluent&lt;span class=&quot;nt&quot;&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;name&amp;gt;&lt;/span&gt;Confluent&lt;span class=&quot;nt&quot;&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;url&amp;gt;&lt;/span&gt;http://packages.confluent.io/maven/&lt;span class=&quot;nt&quot;&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/repository&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/repositories&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h1 id=&quot;producers&quot;&gt;Producers&lt;/h1&gt;

&lt;p&gt;Producers are the services inserting records into the topics so we start with them. Typical Producer development cycle consists of:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Adding the required maven dependencies to our project.&lt;/li&gt;
  &lt;li&gt;Writing a schema for our producing record in a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.avsc&lt;/code&gt; file using the Avro Schema syntax.&lt;/li&gt;
  &lt;li&gt;Generating a Java POJO from the schema using the Avro Maven Plugin. This is done at compile-time with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mvn compile&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Uploading the schema to the schema registry with Confluent Schema Registry Maven Plugin.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;writing-our-record-schema&quot;&gt;Writing our record schema&lt;/h2&gt;

&lt;p&gt;First we create a new schema file in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;src/main/resources/schemas/avro/v1.0.0/pricing.avsc&lt;/code&gt;. The exact path you decide to store your schemas is up to your personal preferences. We recommend using versioning in the file path to preserve the full history of schema evolution when new versions are added. You should configure your Avro and Confluent Schema Registry plugin paths accordingly.&lt;/p&gt;

&lt;p&gt;An example of schema definition:&lt;/p&gt;
&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;namespace&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;com.kumuluz.ee.samples.kafka.registry.avro.lib&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;record&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Pricing&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;fields&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;price&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;priceExTax&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;basePrice&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;taxAmount&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now that we have our schema, a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mvn compile&lt;/code&gt; will generate the Java class in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;src/generated/java&lt;/code&gt; using the namespace from the schema as package name. Since these classes are generated at compile time, we use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;src/generated&lt;/code&gt; output folder as opposed to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;src/main&lt;/code&gt; for hand-written code. The sample project has properly configured &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;maven-compiler-plugin&lt;/code&gt; so IDEs such as IntelliJ properly mark the folder as generated sources folder.&lt;/p&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apache.maven.plugins&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;maven-compiler-plugin&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;generatedSourcesDirectory&amp;gt;&lt;/span&gt;src/generated/java&lt;span class=&quot;nt&quot;&gt;&amp;lt;/generatedSourcesDirectory&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Another option would be to generate the classes in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;target/generated-sources&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;producer-code&quot;&gt;Producer code&lt;/h2&gt;

&lt;p&gt;We can use the generated &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Pricing&lt;/code&gt; class in our Kafka producer interface. For this example, we’ve put the producer in a JAX-RS resource to produce a record with an API call.&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nd&quot;&gt;@Consumes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;MediaType&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;APPLICATION_JSON&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nd&quot;&gt;@Produces&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;MediaType&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;APPLICATION_JSON&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nd&quot;&gt;@Path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/produce&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nd&quot;&gt;@RequestScoped&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ProducerResource&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;

  &lt;span class=&quot;nd&quot;&gt;@Inject&lt;/span&gt;
  &lt;span class=&quot;nd&quot;&gt;@StreamProducer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;producer-avro&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Producer&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;producerAvro&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;nd&quot;&gt;@POST&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Response&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;produceMessage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Input&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;

      &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Pricing&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pricing&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Pricing&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getPrice&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getPriceExTax&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getPrice&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(),&lt;/span&gt;
          &lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getTaxAmount&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getDescription&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;());&lt;/span&gt;
      &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ProducerRecord&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Pricing&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;record&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;
          &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ProducerRecord&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;pricing-avro&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;UUID&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;randomUUID&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pricing&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

      &lt;span class=&quot;n&quot;&gt;producerAvro&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;send&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;record&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

      &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Response&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;ok&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The code is essentially the same as if we did not use Schema Registry at all. The difference is in Producer configuration where we specify the Avro serializer and URL to the Schema Registry:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;kumuluzee&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;streaming&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;kafka&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;producer-avro&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;bootstrap-servers&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;localhost:29092&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;key-serializer&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;org.apache.kafka.common.serialization.StringSerializer&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;value-serializer&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;io.confluent.kafka.serializers.KafkaAvroSerializer&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;schema-registry-url&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http://localhost:8081&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;auto-register-schemas&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We also set the property &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;auto-register-schemas&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;false&lt;/code&gt;, so the schemas are not published automatically with code deployment. Instead, we register schemas manually with the maven plugin. In the producer module run:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;mvn schema-registry:register
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We can verify that schema is registered by opening the Schema Registry UI at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://localhost:8000&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;producing-a-record&quot;&gt;Producing a record&lt;/h2&gt;

&lt;p&gt;Run the producer service and produce a record with a POST request:&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;curl --header &quot;Content-Type: application/json&quot; \
  --request POST \
  --data &apos;{&quot;price&quot;:&quot;0.00&quot;,&quot;priceExTax&quot;:&quot;0.00&quot;,&quot;taxAmount&quot;:&quot;0.00&quot;,&quot;basePrice&quot;:&quot;0.00&quot;,&quot;priceAmount&quot;:&quot;0.00&quot;,&quot;description&quot;:&quot;Desc&quot;}&apos; \
  http://localhost:8080/produce
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We can verify that a record was produced according to our schema by checking the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pricing-avro&lt;/code&gt; topic in Kafdrop UI at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://localhost:9000&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Kafdrop has Schema Registry support so it is capable of showing us human-readable record data even though the actual data exists in Avro binary format. Regular Kafka CLI tooling does not have this capability, we would need to use the extended &lt;a href=&quot;https://github.com/confluentinc/schema-registry/tree/master/bin&quot;&gt;Confluent CLI tools&lt;/a&gt; to view human-readable record data from the CLI.&lt;/p&gt;

&lt;h2 id=&quot;evolving-a-schema&quot;&gt;Evolving a schema&lt;/h2&gt;

&lt;p&gt;There are different types of compatibilities we can set in the Schema Registry depending on our needs. By default, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BACKWARDS&lt;/code&gt; rule is used. You can see all the available types &lt;a href=&quot;https://docs.confluent.io/current/schema-registry/avro.html&quot;&gt;in this compatibility documentation&lt;/a&gt;. After we write an evolved schema and try to register it, Schema Registry will automatically reject the update if the changes do not satisfy the compatibility rule. We also have a dedicated command to check the compatibility without registration:&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;mvn schema-registry:test-compatibility
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h1 id=&quot;consumer&quot;&gt;Consumer&lt;/h1&gt;

&lt;p&gt;Typical developer flow for the consumer is:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Download the schema from Schema Registry to a local &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.avsc&lt;/code&gt; file.&lt;/li&gt;
  &lt;li&gt;Generate the Java POJO.&lt;/li&gt;
  &lt;li&gt;Use the class in the consumer interface.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By downloading the schema from the registry, we can use the registry as a source of truth and a central repository of our schemas.&lt;/p&gt;

&lt;h2 id=&quot;consumer-code&quot;&gt;Consumer code&lt;/h2&gt;

&lt;p&gt;Download the schema with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mvn schema-registry:download&lt;/code&gt; followed by POJO generation with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mvn compile&lt;/code&gt; inside the consumer module. Now we can use the generated class in our consumer interface:&lt;/p&gt;
&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nd&quot;&gt;@StreamListener&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;topics&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;pricing-avro&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;consumer-avro&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;onMessage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;ConsumerRecord&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Pricing&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;record&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Consumed message: offset = %d, key = %s, value = %s%n&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;record&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;offset&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;record&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
            &lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;record&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()));&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;messages&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;record&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;());&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Again, the code is essentially the same as if we didn’t use Schema Registry, the difference is in configuration:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;kumuluzee&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;streaming&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;kafka&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;consumer-avro&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;bootstrap-servers&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;localhost:29092&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;group-id&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;group1&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;enable-auto-commit&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;true&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;auto-commit-interval-ms&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1000&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;auto-offset-reset&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;latest&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;key-deserializer&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;org.apache.kafka.common.serialization.StringDeserializer&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;value-deserializer&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;io.confluent.kafka.serializers.KafkaAvroDeserializer&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;schema-registry-url&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http://localhost:8081&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;specific-avro-reader&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We must specify the Avro deserializer, Schema Registry URL and set &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;specific-avro-reader&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;true&lt;/code&gt;. The default behaviour of Avro deserializer is to deserialize to generic records instead of the specified class which is not what we want.&lt;/p&gt;

&lt;h2 id=&quot;consuming-the-record&quot;&gt;Consuming the record&lt;/h2&gt;

&lt;p&gt;Run the consumer service (on a different port than producer) and produce another record with the producer service. You should see the record being received and logged on the consumer side.&lt;/p&gt;

&lt;h2 id=&quot;evolving-the-schema&quot;&gt;Evolving the schema&lt;/h2&gt;

&lt;p&gt;Let’s assume we use a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;FORWARD&lt;/code&gt; strategy to evolve our schemas. Typical evolved deployment would then look like this:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Update the schema on the producer side and deploy it to production.&lt;/li&gt;
  &lt;li&gt;Pull down the new schema on the consumer side and rebuild the consumer, optionally develop new features that use the added fields.&lt;/li&gt;
  &lt;li&gt;Deploy consumer to production.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For a period of time, we have new producer(s) and old consumer(s) deployed at the same time. Other than consumers not taking advantage of the new schema, consumers run normally and don’t break when reading new records.&lt;/p&gt;

&lt;p&gt;En example of adding a “v2.0.0” schema is shown in the full example.&lt;/p&gt;

&lt;h1 id=&quot;streams&quot;&gt;Streams&lt;/h1&gt;

&lt;p&gt;Streams API allows us to consume, transform, and produce a record at the same time, perform aggregations, and much more.&lt;/p&gt;

&lt;p&gt;In the following example, we will calculate the sum of all records in our &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pricing-avro&lt;/code&gt; queue. While it does not make any sense from logical perspective, just imagine these are order amounts and we are calculating a total of all orders instead. The total is sent into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sum-avro&lt;/code&gt; topic each time it is recalculated.&lt;/p&gt;

&lt;h2 id=&quot;streams-schema&quot;&gt;Streams schema&lt;/h2&gt;

&lt;p&gt;Since our streams application consumes from one topic and produces to another topic, we need to download and compile the schema for the consumer side and write the schema for the producer side (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sum-avro&lt;/code&gt; topic).&lt;/p&gt;

&lt;p&gt;Getting the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Pricing.java&lt;/code&gt; class:&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;mvn schema-registry:download
mvn compile
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Our &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Sum&lt;/code&gt; schema has a single field:&lt;/p&gt;
&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;namespace&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;com.kumuluz.ee.samples.kafka.registry.avro.lib&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;record&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Sum&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;fields&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;sum&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;streams-code&quot;&gt;Streams code&lt;/h2&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nd&quot;&gt;@Inject&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;GenericConfig&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;nd&quot;&gt;@StreamProcessor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;price-sum&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;autoStart&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;streams-avro&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;StreamsBuilder&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;nc&quot;&gt;StreamsBuilder&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;builder&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;StreamsBuilder&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;

    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Serde&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;keySerde&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Serdes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;//string Serde for our UUID record key&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Serde&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;BigDecimal&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bigDecimalSerde&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;BigDecimalSerde&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;//BigDecimal Serde for price sum, custom implementation since it is not provided by Kafka out of the box&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Serde&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Pricing&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;consumeValueSerde&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SpecificAvroSerde&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;gt;();&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;//consumer of Avro format&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Serde&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Sum&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;produceValueSerde&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SpecificAvroSerde&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;gt;();&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;//producer of Avro format&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// config.yml only configures the default SerDes. All non-default SerDes need to be&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// configured explicitely here.&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Map&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;serdeConfig&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Collections&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;singletonMap&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;schema.registry.url&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getSchemaRegistryUrl&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;());&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;consumeValueSerde&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;configure&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;serdeConfig&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;produceValueSerde&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;configure&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;serdeConfig&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;inputTopic&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;pricing-avro&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;outputTopic&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;sum-avro&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;builder&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;stream&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;inputTopic&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Consumed&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;keySerde&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;consumeValueSerde&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;//consume with Avro Serde&amp;lt;Pricing&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;k&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;KeyValue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;total-sum&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;BigDecimal&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getPrice&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;())))&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;//map Pricing object to single BigDecimal value&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;groupByKey&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Grouped&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;keySerde&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bigDecimalSerde&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;//group by static key and reduce&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;reduce&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;BigDecimal:&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;toStream&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;k&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;KeyValue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;k&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Sum&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;toPlainString&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;())))&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;//map to our Sum schema&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;outputTopic&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Produced&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;keySerde&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;produceValueSerde&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;));&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;//produce to sum-avro&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;builder&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Streams configuration:&lt;/p&gt;
&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;kumuluzee&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;streaming&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;kafka&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;streams-avro&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;bootstrap-servers&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;localhost:29092&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;application-id&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;sample-price-sum&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;default-key-serde&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;org.apache.kafka.common.serialization.Serdes$StringSerde&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;default-value-serde&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;org.apache.kafka.common.serialization.Serdes$StringSerde&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;commit-interval-ms&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;500&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;schema-registry-url&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http://localhost:8081&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;specific-avro-reader&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;true&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;auto-register-schemas&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Since Serde for streams is dynamically configured in code, we can leave the defaults as StringSerde. Other properties have already been explained in the Consumer and Producer chapters.&lt;/p&gt;

&lt;h2 id=&quot;testing-the-streams-application&quot;&gt;Testing the Streams application&lt;/h2&gt;

&lt;p&gt;After running the Streams application, produce a value with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;price&lt;/code&gt; attribute &amp;gt; 0. For example:&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;curl --header &quot;Content-Type: application/json&quot; \
  --request POST \
  --data &apos;{&quot;price&quot;:&quot;15.00&quot;,&quot;priceExTax&quot;:&quot;0.00&quot;,&quot;taxAmount&quot;:&quot;0.00&quot;,&quot;basePrice&quot;:&quot;0.00&quot;,&quot;priceAmount&quot;:&quot;0.00&quot;,&quot;description&quot;:&quot;Desc&quot;}&apos; \
  http://localhost:8080/produce
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In Kafdrop, you should see a new total sum being produced in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sum-avro&lt;/code&gt; topic each time a new record is created in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pricing-avro&lt;/code&gt;.&lt;/p&gt;

&lt;h1 id=&quot;future-work---json-schema&quot;&gt;Future work - JSON Schema&lt;/h1&gt;

&lt;p&gt;Confluent has added support for JSON Schema as an alternative to Avro format in early 2020. Performance considerations aside, we see some benefits of using JSON Schema over Avro:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;A lot of developers are already familiar with writing schemas for OpenAPI. JSON Schema 2019-09 and OpenAPI have converged and now have a very similar syntax and set of features so the developer only needs to learn one syntax for both REST and Kafka worlds.&lt;/li&gt;
  &lt;li&gt;The data format is JSON, no need for custom consumer tools for readable records.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When testing JSON Schema support, we determined that the feature is not quite ready yet. There is no support for draft 2019-09 yet. Generated POJOs need additional annotations to link the class with the source schema. This fix is not yet released at the time of writing. There is also no support for writing JSON Schema in yaml format (which is an often-used approach in OpenAPI world). While not a deal breaker, it needs some extra tooling in order to do the conversions on the fly.&lt;/p&gt;

&lt;p&gt;We are eagerly monitoring new releases of Schema Registry to present this guide using JSON Schema in the future.&lt;/p&gt;

&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h1&gt;

&lt;p&gt;Schema Registry brings a lot of new, relatively complex tooling and new workflow in developing Kafka applications for the benefits of better schema management and a compatibility safety net.&lt;/p&gt;
</description>
        <pubDate>Mon, 15 Jun 2020 00:00:00 +0000</pubDate>
        <link>https://blog.kumuluz.com/product/developers/2020/06/15/kumuluzee-streaming-kafka-schema-registry-avro.html</link>
        <guid isPermaLink="true">https://blog.kumuluz.com/product/developers/2020/06/15/kumuluzee-streaming-kafka-schema-registry-avro.html</guid>
        
        <category>KumuluzEE</category>
        
        <category>Streaming</category>
        
        <category>Kafka</category>
        
        <category>Schema Registry</category>
        
        
        <category>Product</category>
        
        <category>Developers</category>
        
      </item>
    
      <item>
        <title>Introducing new KumuluzEE releases</title>
        <description>&lt;p&gt;We are announcing new releases in the KumuluzEE family. The new release of the core microservice framework KumuluzEE 3.10.0 brings support for Java 14 and a set of new features and enhancements. Supporting projects, including Config, Security, Rest Client, CORS, REST and JWT Auth, have also been updated.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;The details about each individual release can be found in the corresponding release notes:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/kumuluz/kumuluzee/releases/tag/v3.10.0&quot;&gt;KumuluzEE 3.10.0&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/kumuluz/kumuluzee-config/releases/tag/v1.3.0&quot;&gt;KumuluzEE Config 1.3.0&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/kumuluz/kumuluzee-security/releases/tag/v1.2.0&quot;&gt;KumuluzEE Security 1.2.0&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/kumuluz/kumuluzee-rest-client/releases/tag/v1.4.1.1&quot;&gt;KumuluzEE Rest Client 1.4.1.1&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/kumuluz/kumuluzee-cors/releases/tag/v1.0.6&quot;&gt;KumuluzEE CORS 1.0.6&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/kumuluz/kumuluzee-rest/releases/tag/v1.3.0&quot;&gt;KumuluzEE REST 1.3.0&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/kumuluz/kumuluzee-jwt-auth/releases/tag/v1.1.3&quot;&gt;KumuluzEE JWT Auth 1.1.3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Thu, 11 Jun 2020 00:00:00 +0000</pubDate>
        <link>https://blog.kumuluz.com/product/announcement/developers/2020/06/11/kumuluzee-3.10.0-release.html</link>
        <guid isPermaLink="true">https://blog.kumuluz.com/product/announcement/developers/2020/06/11/kumuluzee-3.10.0-release.html</guid>
        
        <category>KumuluzEE</category>
        
        <category>Java EE</category>
        
        <category>Microservices</category>
        
        
        <category>Product</category>
        
        <category>Announcement</category>
        
        <category>Developers</category>
        
      </item>
    
      <item>
        <title>Introducing KumuluzEE 3.9.0 with MicroProfile 3.3</title>
        <description>&lt;p&gt;We are happy to announce the release of &lt;a href=&quot;https://github.com/kumuluz/kumuluzee/releases/tag/v3.9.0&quot;&gt;KumuluzEE 3.9.0&lt;/a&gt;, which brings support for MicroProfile 3.3.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;The new MicroProfile version brings updates to the following modules:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/kumuluz/kumuluzee-config-mp/releases/tag/v1.4.0&quot;&gt;KumuluzEE Config&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/kumuluz/kumuluzee-fault-tolerance/releases/tag/v2.1.0&quot;&gt;KumuluzEE Fault Tolerance&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/kumuluz/kumuluzee-health/releases/tag/v2.2.0&quot;&gt;KumuluzEE Health&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/kumuluz/kumuluzee-metrics/releases/tag/v2.3.0&quot;&gt;KumuluzEE Metrics&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/kumuluz/kumuluzee-rest-client/releases/tag/v1.4.1&quot;&gt;KumuluzEE Rest Client&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check out the release notes of individual modules for the description of new features.&lt;/p&gt;
</description>
        <pubDate>Wed, 08 Apr 2020 00:00:00 +0000</pubDate>
        <link>https://blog.kumuluz.com/product/announcement/developers/2020/04/08/kumuluzee-3.9.0-release.html</link>
        <guid isPermaLink="true">https://blog.kumuluz.com/product/announcement/developers/2020/04/08/kumuluzee-3.9.0-release.html</guid>
        
        <category>KumuluzEE</category>
        
        <category>Java EE</category>
        
        <category>Microservices</category>
        
        
        <category>Product</category>
        
        <category>Announcement</category>
        
        <category>Developers</category>
        
      </item>
    
      <item>
        <title>KumuluzEE Logs 1.4.0 released</title>
        <description>&lt;p&gt;We’re announcing the availability of KumuluzEE Logs 1.4.0, which introduces two big features; support for Fluentd logging provider and an audit logging module.&lt;/p&gt;

&lt;!--more--&gt;

&lt;h4 id=&quot;features&quot;&gt;Features&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Fluentd is now supported as a logging provider.&lt;/li&gt;
  &lt;li&gt;An audit logging module provides features for logging the audit trail using the supported logging frameworks.&lt;/li&gt;
  &lt;li&gt;Logging context can now be added to logs by implementing the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;RequestContext&lt;/code&gt; interface.&lt;/li&gt;
&lt;/ul&gt;

</description>
        <pubDate>Tue, 31 Mar 2020 00:00:00 +0000</pubDate>
        <link>https://blog.kumuluz.com/product/developers/2020/03/31/kumuluzee-logs-release-1.4.0.html</link>
        <guid isPermaLink="true">https://blog.kumuluz.com/product/developers/2020/03/31/kumuluzee-logs-release-1.4.0.html</guid>
        
        <category>KumuluzEE Logs</category>
        
        
        <category>Product</category>
        
        <category>Developers</category>
        
      </item>
    
  </channel>
</rss>
