This is an automated email from the ASF dual-hosted git repository.

arnold pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git


The following commit(s) were added to refs/heads/develop by this push:
     new c5aeae62d FINERACT-1824  - Documentation update for Kafka Support  - 
Adding docker-compose-postgresql-kafka-msk.yml  - application.properties ENV 
var fixed
c5aeae62d is described below

commit c5aeae62d8bfb8c44f81b12d7a927d339281c0d9
Author: Peter Bagrij <[email protected]>
AuthorDate: Mon Jul 24 11:41:43 2023 +0200

    FINERACT-1824
     - Documentation update for Kafka Support
     - Adding docker-compose-postgresql-kafka-msk.yml
     - application.properties ENV var fixed
---
 README.md                                          |  21 ++-
 docker-compose-postgresql-kafka-msk.yml            | 182 +++++++++++++++++++++
 .../en/chapters/appendix/properties-kafka.adoc     | 158 ++++++++++++++++++
 .../src/docs/en/chapters/appendix/properties.adoc  |   2 +
 .../docs/en/chapters/architecture/batch-jobs.adoc  |   1 +
 .../src/main/resources/application.properties      |   6 +-
 6 files changed, 366 insertions(+), 4 deletions(-)

diff --git a/README.md b/README.md
index 278b1bcd5..de0a0c216 100644
--- a/README.md
+++ b/README.md
@@ -305,8 +305,18 @@ INSTRUCTIONS: How to run Apache RAT (Release Audit Tool)
 2. Run `./gradlew rat`. A report will be generated under 
build/reports/rat/rat-report.txt
 
 
-INSTRUCTIONS: How to enable ActiveMQ
+INSTRUCTIONS: How to enable External Message Broker (ActiveMQ or Apache Kafka)
 ============
+
+There are two use-cases where external message broker is needed:
+ - External Business Events / Reliable Event Framework
+ - Executing Partitioned Spring Batch Jobs
+
+External Events are business events, e.g.: `ClientCreated`, which might be 
important for third party systems. Apache Fineract supports ActiveMQ (or other 
JMS compliant brokers) and Apache Kafka endpoints for sending out Business 
Events. By default, they are not emitted.
+
+In case of a large deployment with millions of accounts, the Close of Business 
Day Spring Batch job may run several hours. In order to speed up this task, 
remote partitioning of the job is supported. The Manager node partitions 
(breaks up) the COB job into smaller pieces (sub tasks) which then can be 
executed on multiple Worker nodes in parallel. The worker nodes are notified 
either by ActiveMQ or Kafka regarding their new sub tasks.
+### Active MQ
+
 JMS based messaging is disabled by default. In 
`docker-compose-postgresql-activemq.yml` an example is shown where ActiveMQ is 
enabled. In that configuration one Spring Batch Manager instance and two Spring 
Batch Worker instances are created.
 Spring based events should be disabled and jms based event handling should be 
enabled. Furthermore, proper broker JMS URL should be configured.
 
@@ -318,6 +328,15 @@ Spring based events should be disabled and jms based event 
handling should be en
 
 For additional ActiveMQ related configuration please take a look to the 
`application.properties` where the supported configuration parameters are 
listed with their default values.
 
+### Kafka
+
+Kafka support also disabled by default. In 
`docker-compose-postgresql-kafka.yml` an example is shown where self-hosted 
Kafka is enabled for both External Events and Spring Batch Remote Job execution.
+
+During the development Fineract was tested with PLAINTEXT Kafka brokers 
without authentication and with AWS MSK using IAM authentication. The extra 
[jar file](https://github.com/aws/aws-msk-iam-auth/releases) required for IAM 
authentication is already added to the classpath.
+An example MSK setup can be found in `docker-compose-postgresql-kafka-msk.yml`.
+
+The full list of supported Kafka related properties are documented here: 
https://fineract.apache.org/docs/current/
+
 Checkstyle and Spotless
 ============
 
diff --git a/docker-compose-postgresql-kafka-msk.yml 
b/docker-compose-postgresql-kafka-msk.yml
new file mode 100644
index 000000000..6e6cb5639
--- /dev/null
+++ b/docker-compose-postgresql-kafka-msk.yml
@@ -0,0 +1,182 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+# You can replace and test a more recent version of docker compose
+version: '3.7'
+services:
+  # Backend service
+  fineractpostgresql:
+    image: postgres:15.3
+    volumes:
+      - ./fineract-db/docker/postgresql:/docker-entrypoint-initdb.d/:Z,ro
+    environment:
+      POSTGRES_USER: root
+      POSTGRES_PASSWORD: skdcnwauicn2ucnaecasdsajdnizucawencascdca
+      FINERACT_DB_USER: postgres
+      FINERACT_DB_PASS: skdcnwauicn2ucnaecasdsajdnizucawencascdca
+      FINERACT_TENANTS_DB_NAME: fineract_tenants
+      FINERACT_TENANT_DEFAULT_DB_NAME: fineract_default
+    healthcheck:
+      test: [ "CMD", "pg_isready", "-q", "-d", "postgres", "-U", "root" ]
+      timeout: 10s
+      retries: 10
+    ports:
+      - "5432:5432"
+  fineract-manager:
+    image: fineract:latest
+    volumes:
+      - ./fineract-provider/build/data:/data
+    healthcheck:
+      test: ["CMD", 'sh', '-c', 'echo -e "Checking for the availability of 
Fineract server deployment"; while ! nc -z "fineract-server" 8443; do sleep 1; 
printf "-"; done; echo -e " >> Fineract server has started";' ]
+      timeout: 10s
+      retries: 10
+    ports:
+      - 8443:8443
+    depends_on:
+      fineractpostgresql:
+        condition: service_healthy
+    environment:
+      - AWS_ACCESS_KEY_ID=
+      - AWS_SECRET_ACCESS_KEY=
+      - FINERACT_NODE_ID=1
+      - FINERACT_HIKARI_DRIVER_SOURCE_CLASS_NAME=org.postgresql.Driver
+      - 
FINERACT_HIKARI_JDBC_URL=jdbc:postgresql://fineractpostgresql:5432/fineract_tenants
+      - FINERACT_HIKARI_USERNAME=postgres
+      - FINERACT_HIKARI_PASSWORD=skdcnwauicn2ucnaecasdsajdnizucawencascdca
+      - FINERACT_HIKARI_MINIMUM_IDLE=3
+      - FINERACT_HIKARI_MAXIMUM_POOL_SIZE=10
+      - FINERACT_HIKARI_IDLE_TIMEOUT=60000
+      - FINERACT_HIKARI_CONNECTION_TIMEOUT=20000
+      - FINERACT_HIKARI_TEST_QUERY=SELECT 1
+      - FINERACT_HIKARI_AUTO_COMMIT=true
+      - FINERACT_SERVER_SSL_ENABLED=true
+      - FINERACT_HIKARI_DS_PROPERTIES_CACHE_PREP_STMTS=true
+      - FINERACT_HIKARI_DS_PROPERTIES_PREP_STMT_CACHE_SIZE=250
+      - FINERACT_HIKARI_DS_PROPERTIES_PREP_STMT_CACHE_SQL_LIMIT=2048
+      - FINERACT_HIKARI_DS_PROPERTIES_USE_SERVER_PREP_STMTS=true
+      - FINERACT_HIKARI_DS_PROPERTIES_USE_LOCAL_SESSION_STATE=true
+      - FINERACT_HIKARI_DS_PROPERTIES_REWRITE_BATCHED_STATEMENTS=true
+      - FINERACT_HIKARI_DS_PROPERTIES_CACHE_RESULT_SET_METADATA=true
+      - FINERACT_HIKARI_DS_PROPERTIES_CACHE_SERVER_CONFIGURATION=true
+      - FINERACT_HIKARI_DS_PROPERTIES_ELIDE_SET_AUTO_COMMITS=true
+      - FINERACT_HIKARI_DS_PROPERTIES_MAINTAIN_TIME_STATS=false
+      - FINERACT_HIKARI_DS_PROPERTIES_LOG_SLOW_QUERIES=true
+      - FINERACT_HIKARI_DS_PROPERTIES_DUMP_QUERIES_IN_EXCEPTION=true
+      - FINERACT_DEFAULT_TENANTDB_HOSTNAME=fineractpostgresql
+      - FINERACT_DEFAULT_TENANTDB_PORT=5432
+      - FINERACT_DEFAULT_TENANTDB_UID=postgres
+      - FINERACT_DEFAULT_TENANTDB_PWD=skdcnwauicn2ucnaecasdsajdnizucawencascdca
+      - FINERACT_DEFAULT_TENANTDB_CONN_PARAMS=
+      - FINERACT_DEFAULT_TENANTDB_TIMEZONE=Asia/Kolkata
+      - FINERACT_DEFAULT_TENANTDB_IDENTIFIER=default
+      - FINERACT_DEFAULT_TENANTDB_NAME=fineract_default
+      - FINERACT_DEFAULT_TENANTDB_DESCRIPTION=Default Demo Tenant
+      - JAVA_TOOL_OPTIONS="-Xmx1G"
+      - FINERACT_REMOTE_JOB_MESSAGE_HANDLER_JMS_ENABLED=false
+      - FINERACT_REMOTE_JOB_MESSAGE_HANDLER_SPRING_EVENTS_ENABLED=false
+      - FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_ENABLED=true
+      - 
FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_BOOTSTRAP_SERVERS=b-3-public.democluster1.am2oyx.c4.kafka.eu-central-1.amazonaws.com:9198,b-2-public.democluster1.am2oyx.c4.kafka.eu-central-1.amazonaws.com:9198,b-1-public.democluster1.am2oyx.c4.kafka.eu-central-1.amazonaws.com:9198
+      - 
FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_ADMIN_EXTRA_PROPERTIES=security.protocol=SASL_SSL|sasl.mechanism=AWS_MSK_IAM|sasl.jaas.config=software.amazon.msk.auth.iam.IAMLoginModule
 
required;|sasl.client.callback.handler.class=software.amazon.msk.auth.iam.IAMClientCallbackHandler
+      - 
FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_PRODUCER_EXTRA_PROPERTIES=security.protocol=SASL_SSL|sasl.mechanism=AWS_MSK_IAM|sasl.jaas.config=software.amazon.msk.auth.iam.IAMLoginModule
 
required;|sasl.client.callback.handler.class=software.amazon.msk.auth.iam.IAMClientCallbackHandler
+      - 
FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_CONSUMER_EXTRA_PROPERTIES=security.protocol=SASL_SSL|sasl.mechanism=AWS_MSK_IAM|sasl.jaas.config=software.amazon.msk.auth.iam.IAMLoginModule
 
required;|sasl.client.callback.handler.class=software.amazon.msk.auth.iam.IAMClientCallbackHandler
+      - FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_TOPIC_NAME=job-topic
+      - FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_TOPIC_REPLICAS=2
+      - FINERACT_MODE_BATCH_MANAGER_ENABLED=true
+      - FINERACT_MODE_BATCH_WORKER_ENABLED=false
+      - LOAN_COB_CHUNK_SIZE=10
+      - LOAN_COB_PARTITION_SIZE=10
+      - FINERACT_EXTERNAL_EVENTS_ENABLED=true
+      - FINERACT_EXTERNAL_EVENTS_KAFKA_ENABLED=true
+      - 
FINERACT_EXTERNAL_EVENTS_KAFKA_BOOTSTRAP_SERVERS=b-3-public.democluster1.am2oyx.c4.kafka.eu-central-1.amazonaws.com:9198,b-2-public.democluster1.am2oyx.c4.kafka.eu-central-1.amazonaws.com:9198,b-1-public.democluster1.am2oyx.c4.kafka.eu-central-1.amazonaws.com:9198
+      - 
FINERACT_EXTERNAL_EVENTS_KAFKA_ADMIN_EXTRA_PROPERTIES=security.protocol=SASL_SSL|sasl.mechanism=AWS_MSK_IAM|sasl.jaas.config=software.amazon.msk.auth.iam.IAMLoginModule
 
required;|sasl.client.callback.handler.class=software.amazon.msk.auth.iam.IAMClientCallbackHandler
+      - 
FINERACT_EXTERNAL_EVENTS_KAFKA_PRODUCER_EXTRA_PROPERTIES:linger.ms=10|batch.size=16384|security.protocol=SASL_SSL|sasl.mechanism=AWS_MSK_IAM|sasl.jaas.config=software.amazon.msk.auth.iam.IAMLoginModule
 
required;|sasl.client.callback.handler.class=software.amazon.msk.auth.iam.IAMClientCallbackHandler
+      - FINERACT_EXTERNAL_EVENTS_KAFKA_TOPIC_NAME=external-events
+      - FINERACT_EXTERNAL_EVENTS_KAFKA_TOPIC_REPLICAS=2
+      - SPRING_PROFILES_ACTIVE=test,diagnostics
+  fineract-worker:
+    image: fineract:latest
+    volumes:
+      - ./fineract-provider/build/data:/data
+    deploy:
+      mode: replicated
+      replicas: 2
+    healthcheck:
+      test: ["CMD", 'sh', '-c', 'echo -e "Checking for the availability of 
Fineract server deployment"; while ! nc -z "fineract-server" 8443; do sleep 1; 
printf "-"; done; echo -e " >> Fineract server has started";' ]
+      timeout: 10s
+      retries: 10
+    ports:
+      - "8444-8445:8443"
+    depends_on:
+      fineractpostgresql:
+        condition: service_healthy
+    environment:
+      - AWS_ACCESS_KEY_ID=
+      - AWS_SECRET_ACCESS_KEY=
+      - FINERACT_NODE_ID=1
+      - FINERACT_HIKARI_DRIVER_SOURCE_CLASS_NAME=org.postgresql.Driver
+      - 
FINERACT_HIKARI_JDBC_URL=jdbc:postgresql://fineractpostgresql:5432/fineract_tenants
+      - FINERACT_HIKARI_USERNAME=postgres
+      - FINERACT_HIKARI_PASSWORD=skdcnwauicn2ucnaecasdsajdnizucawencascdca
+      - FINERACT_HIKARI_MINIMUM_IDLE=3
+      - FINERACT_HIKARI_MAXIMUM_POOL_SIZE=10
+      - FINERACT_HIKARI_IDLE_TIMEOUT=60000
+      - FINERACT_HIKARI_CONNECTION_TIMEOUT=20000
+      - FINERACT_HIKARI_TEST_QUERY=SELECT 1
+      - FINERACT_HIKARI_AUTO_COMMIT=true
+      - FINERACT_SERVER_SSL_ENABLED=true
+      - FINERACT_HIKARI_DS_PROPERTIES_CACHE_PREP_STMTS=true
+      - FINERACT_HIKARI_DS_PROPERTIES_PREP_STMT_CACHE_SIZE=250
+      - FINERACT_HIKARI_DS_PROPERTIES_PREP_STMT_CACHE_SQL_LIMIT=2048
+      - FINERACT_HIKARI_DS_PROPERTIES_USE_SERVER_PREP_STMTS=true
+      - FINERACT_HIKARI_DS_PROPERTIES_USE_LOCAL_SESSION_STATE=true
+      - FINERACT_HIKARI_DS_PROPERTIES_REWRITE_BATCHED_STATEMENTS=true
+      - FINERACT_HIKARI_DS_PROPERTIES_CACHE_RESULT_SET_METADATA=true
+      - FINERACT_HIKARI_DS_PROPERTIES_CACHE_SERVER_CONFIGURATION=true
+      - FINERACT_HIKARI_DS_PROPERTIES_ELIDE_SET_AUTO_COMMITS=true
+      - FINERACT_HIKARI_DS_PROPERTIES_MAINTAIN_TIME_STATS=false
+      - FINERACT_HIKARI_DS_PROPERTIES_LOG_SLOW_QUERIES=true
+      - FINERACT_HIKARI_DS_PROPERTIES_DUMP_QUERIES_IN_EXCEPTION=true
+      - FINERACT_DEFAULT_TENANTDB_HOSTNAME=fineractpostgresql
+      - FINERACT_DEFAULT_TENANTDB_PORT=5432
+      - FINERACT_DEFAULT_TENANTDB_UID=postgres
+      - FINERACT_DEFAULT_TENANTDB_PWD=skdcnwauicn2ucnaecasdsajdnizucawencascdca
+      - FINERACT_DEFAULT_TENANTDB_CONN_PARAMS=
+      - FINERACT_DEFAULT_TENANTDB_TIMEZONE=Asia/Kolkata
+      - FINERACT_DEFAULT_TENANTDB_IDENTIFIER=default
+      - FINERACT_DEFAULT_TENANTDB_NAME=fineract_default
+      - FINERACT_DEFAULT_TENANTDB_DESCRIPTION=Default Demo Tenant
+      - JAVA_TOOL_OPTIONS="-Xmx1G"
+      - FINERACT_MODE_BATCH_MANAGER_ENABLED=false
+      - FINERACT_MODE_BATCH_WORKER_ENABLED=true
+      - FINERACT_REMOTE_JOB_MESSAGE_HANDLER_JMS_ENABLED=false
+      - FINERACT_REMOTE_JOB_MESSAGE_HANDLER_SPRING_EVENTS_ENABLED=false
+      - FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_ENABLED=true
+      - 
FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_BOOTSTRAP_SERVERS=b-3-public.democluster1.am2oyx.c4.kafka.eu-central-1.amazonaws.com:9198,b-2-public.democluster1.am2oyx.c4.kafka.eu-central-1.amazonaws.com:9198,b-1-public.democluster1.am2oyx.c4.kafka.eu-central-1.amazonaws.com:9198
+      - 
FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_ADMIN_EXTRA_PROPERTIES=security.protocol=SASL_SSL|sasl.mechanism=AWS_MSK_IAM|sasl.jaas.config=software.amazon.msk.auth.iam.IAMLoginModule
 
required;|sasl.client.callback.handler.class=software.amazon.msk.auth.iam.IAMClientCallbackHandler
+      - 
FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_PRODUCER_EXTRA_PROPERTIES=security.protocol=SASL_SSL|sasl.mechanism=AWS_MSK_IAM|sasl.jaas.config=software.amazon.msk.auth.iam.IAMLoginModule
 
required;|sasl.client.callback.handler.class=software.amazon.msk.auth.iam.IAMClientCallbackHandler
+      - 
FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_CONSUMER_EXTRA_PROPERTIES=security.protocol=SASL_SSL|sasl.mechanism=AWS_MSK_IAM|sasl.jaas.config=software.amazon.msk.auth.iam.IAMLoginModule
 
required;|sasl.client.callback.handler.class=software.amazon.msk.auth.iam.IAMClientCallbackHandler
+      - FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_TOPIC_NAME=job-topic
+      - FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_TOPIC_REPLICAS=2
+      - FINERACT_EXTERNAL_EVENTS_ENABLED=true
+      - FINERACT_EXTERNAL_EVENTS_KAFKA_ENABLED=true
+      - 
FINERACT_EXTERNAL_EVENTS_KAFKA_BOOTSTRAP_SERVERS=b-3-public.democluster1.am2oyx.c4.kafka.eu-central-1.amazonaws.com:9198,b-2-public.democluster1.am2oyx.c4.kafka.eu-central-1.amazonaws.com:9198,b-1-public.democluster1.am2oyx.c4.kafka.eu-central-1.amazonaws.com:9198
+      - 
FINERACT_EXTERNAL_EVENTS_KAFKA_ADMIN_EXTRA_PROPERTIES=security.protocol=SASL_SSL|sasl.mechanism=AWS_MSK_IAM|sasl.jaas.config=software.amazon.msk.auth.iam.IAMLoginModule
 
required;|sasl.client.callback.handler.class=software.amazon.msk.auth.iam.IAMClientCallbackHandler
+      - 
FINERACT_EXTERNAL_EVENTS_KAFKA_PRODUCER_EXTRA_PROPERTIES:linger.ms=10|batch.size=16384|security.protocol=SASL_SSL|sasl.mechanism=AWS_MSK_IAM|sasl.jaas.config=software.amazon.msk.auth.iam.IAMLoginModule
 
required;|sasl.client.callback.handler.class=software.amazon.msk.auth.iam.IAMClientCallbackHandler
+      - FINERACT_EXTERNAL_EVENTS_KAFKA_TOPIC_NAME=external-events
+      - FINERACT_EXTERNAL_EVENTS_KAFKA_TOPIC_REPLICAS=2
+      - SPRING_PROFILES_ACTIVE=test,diagnostics
diff --git a/fineract-doc/src/docs/en/chapters/appendix/properties-kafka.adoc 
b/fineract-doc/src/docs/en/chapters/appendix/properties-kafka.adoc
new file mode 100644
index 000000000..a618d96cf
--- /dev/null
+++ b/fineract-doc/src/docs/en/chapters/appendix/properties-kafka.adoc
@@ -0,0 +1,158 @@
+= Kafka Properties
+
+.Kafka related properties for Remote Spring Batch Jobs
+|===
+|Name |Env Variable |Default Value |Description
+
+|fineract.remote-job-message-handler.kafka.enabled
+|FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_ENABLED
+|false
+|Enables or disables Kafka for remote job execution. If Kafka is enabled then 
JMS shall be disabled.
+
+|fineract.remote-job-message-handler.kafka.topic.auto-create
+|FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_TOPIC_AUTO_CREATE
+|true
+|Enables topic auto creation. In case the auto creation of the topic is 
disabled please make sure that the replica and the partition count is properly 
configured.
+
+|fineract.remote-job-message-handler.kafka.topic.name
+|FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_TOPIC_NAME
+|job-topic
+|Name of the topic where partitioned tasks are sent to
+
+|fineract.remote-job-message-handler.kafka.topic.replicas
+|FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_TOPIC_REPLICAS
+|1
+|Number of the replicas
+
+|fineract.remote-job-message-handler.kafka.topic.partitions
+|FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_TOPIC_PARTITIONS
+|10
+|Number of partitions
+
+|fineract.remote-job-message-handler.kafka.bootstrap-servers
+|FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_BOOTSTRAP_SERVERS
+|localhost:9092
+|Comma separated list of bootstrap servers
+
+|fineract.remote-job-message-handler.kafka.consumer.group-id
+|FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_CONSUMER_GROUPID
+|fineract-consumer-group-id
+|Group ID of the Consumer
+
+|fineract.remote-job-message-handler.kafka.consumer.extra-properties-key-value-separator
+|FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_CONSUMER_EXTRA_PROPERTIES_SEPARATOR
+|=
+|Defines key and value separator for consumer,e.g.: key=value
+
+|fineract.remote-job-message-handler.kafka.consumer.extra-properties-separator
+|FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_CONSUMER_EXTRA_PROPERTIES_SEPARATOR
+|\|
+|Defines item separator for consumer, e.g.: key1=value1\|key2=value2
+
+|fineract.remote-job-message-handler.kafka.consumer.extra-properties
+|FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_CONSUMER_EXTRA_PROPERTIES
+|
+|#holds list of key value pairs using the above defined separators for 
consumer:  key1=value1\|key2=value2\|...\|keyn=valuen
+
+|fineract.remote-job-message-handler.kafka.producer.extra-properties-key-value-separator
+|FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_PRODUCER_EXTRA_PROPERTIES_KEY_VALUE_SEPARATOR
+|=
+|Defines key and value separator for producer,e.g.: key=value
+
+|fineract.remote-job-message-handler.kafka.producer.extra-properties-separator
+|FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_PRODUCER_EXTRA_PROPERTIES_SEPARATOR
+|\|
+|Defines item separator for producer, e.g.: key1=value1\|key2=value2
+
+|fineract.remote-job-message-handler.kafka.producer.extra-properties
+|FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_PRODUCER_EXTRA_PROPERTIES
+|
+|#holds list of key value pairs using the above defined separators for 
producer:  key1=value1\|key2=value2\|...\|keyn=valuen
+
+|fineract.remote-job-message-handler.kafka.admin.extra-properties-key-value-separator
+|FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_ADMIN_EXTRA_PROPERTIES_KEY_VALUE_SEPARATOR
+|=
+|Defines key and value separator for admin,e.g.: key=value
+
+|fineract.remote-job-message-handler.kafka.admin.extra-properties-separator
+|FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_ADMIN_EXTRA_PROPERTIES_SEPARATOR
+|\|
+|Defines item separator for admin, e.g.: key1=value1\|key2=value2
+
+|fineract.remote-job-message-handler.kafka.admin.extra-properties
+|FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_ADMIN_EXTRA_PROPERTIES
+|
+|#holds list of key value pairs using the above defined separators for admin:  
key1=value1\|key2=value2\|...\|keyn=valuen
+
+|===
+
+.Kafka related Properties for External Events
+|===
+|Name |Env Variable |Default Value |Description
+
+|fineract.events.external.producer.kafka.enabled
+|FINERACT_EXTERNAL_EVENTS_KAFKA_ENABLED
+|false
+|Enables disables Kafka for External Events. If Kafka is enabled then JMS 
shall be disabled.
+
+|fineract.events.external.producer.kafka.timeout-in-seconds
+|FINERACT_EXTERNAL_EVENTS_KAFKA_TIMEOUT_IN_SECONDS
+|10
+|Timeout for Kafka confirming the messages written in the topic
+
+|fineract.events.external.producer.kafka.topic.auto-create
+|FINERACT_EXTERNAL_EVENTS_KAFKA_TOPIC_AUTO_CREATE
+|true
+|Enables topic auto creation. In case the auto creation of the topic is 
disabled please make sure that the replica and the partition count is properly 
configured.
+
+|fineract.events.external.producer.kafka.topic.name
+|FINERACT_EXTERNAL_EVENTS_KAFKA_TOPIC_NAME
+|external-events
+|Name of the topic where external events are sent to
+
+|fineract.events.external.producer.kafka.topic.replicas
+|FINERACT_EXTERNAL_EVENTS_KAFKA_TOPIC_REPLICAS
+|1
+|Number of the replicas
+
+|fineract.events.external.producer.kafka.topic.partitions
+|FINERACT_EXTERNAL_EVENTS_KAFKA_TOPIC_PARTITIONS
+|10
+|Number of partitions
+
+|fineract.events.external.producer.kafka.bootstrap-servers
+|FINERACT_EXTERNAL_EVENTS_KAFKA_BOOTSTRAP_SERVERS
+|localhost:9092
+|Comma separated list of Kafka bootstrap servers
+
+|fineract.events.external.producer.kafka.producer.extra-properties-separator
+|FINERACT_EXTERNAL_EVENTS_KAFKA_PRODUCER_EXTRA_PROPERTIES_SEPARATOR
+|\|
+|Defines item separator for producer,e.g.: key=value
+
+|fineract.events.external.producer.kafka.producer.extra-properties-key-value-separator
+|FINERACT_EXTERNAL_EVENTS_KAFKA_PRODUCER_EXTRA_PROPERTIES_KEY_VALUE_SEPARATOR
+|=
+|Defines key and value separator for producer client
+
+|fineract.events.external.producer.kafka.producer.extra-properties
+|FINERACT_EXTERNAL_EVENTS_KAFKA_PRODUCER_EXTRA_PROPERTIES
+|linger.ms=10\|batch.size=16384
+|Defines the extra properties for external event producer clients. 
Optimization for sending out large volume of messages. Increases Batch buffer 
size and batching time window.
+
+|fineract.events.external.producer.kafka.admin.extra-properties-separator
+|FINERACT_EXTERNAL_EVENTS_KAFKA_ADMIN_EXTRA_PROPERTIES_SEPARATOR
+|\|
+|Defines item separator for admin client.
+
+|fineract.events.external.producer.kafka.admin.extra-properties-key-value-separator
+|FINERACT_EXTERNAL_EVENTS_KAFKA_ADMIN_EXTRA_PROPERTIES_KEY_VALUE_SEPARATOR
+|=
+|Defines key and value separator for admin client
+
+|fineract.events.external.producer.kafka.admin.extra-properties
+|FINERACT_EXTERNAL_EVENTS_KAFKA_ADMIN_EXTRA_PROPERTIES
+|
+|Defines the extra properties for external event admin clients
+
+|===
\ No newline at end of file
diff --git a/fineract-doc/src/docs/en/chapters/appendix/properties.adoc 
b/fineract-doc/src/docs/en/chapters/appendix/properties.adoc
index 928de87cb..870c503ce 100644
--- a/fineract-doc/src/docs/en/chapters/appendix/properties.adoc
+++ b/fineract-doc/src/docs/en/chapters/appendix/properties.adoc
@@ -13,4 +13,6 @@ include::properties-authentication.adoc[leveloffset=+1]
 
 include::properties-tomcat.adoc[leveloffset=+1]
 
+include::properties-kafka.adoc[leveloffset=+1]
+
 // include::properties-cache.adoc[leveloffset=+1]
diff --git a/fineract-doc/src/docs/en/chapters/architecture/batch-jobs.adoc 
b/fineract-doc/src/docs/en/chapters/architecture/batch-jobs.adoc
index 14acb26d5..a93d671b2 100644
--- a/fineract-doc/src/docs/en/chapters/architecture/batch-jobs.adoc
+++ b/fineract-doc/src/docs/en/chapters/architecture/batch-jobs.adoc
@@ -97,6 +97,7 @@ Also, please note that the partitioned job execution is 
multitenant meaning that
 For remote partitioning, the following message channels are supported by 
Fineract:
 
 * Any JMS compatible message channels (ActiveMQ, Amazon MQ, etc)
+* Apache Kafka
 
 ==== Fault-tolerance scenarios
 
diff --git a/fineract-provider/src/main/resources/application.properties 
b/fineract-provider/src/main/resources/application.properties
index b3d997fb5..333e094d2 100644
--- a/fineract-provider/src/main/resources/application.properties
+++ b/fineract-provider/src/main/resources/application.properties
@@ -82,13 +82,13 @@ 
fineract.remote-job-message-handler.kafka.topic.partitions=${FINERACT_REMOTE_JOB
 
fineract.remote-job-message-handler.kafka.bootstrap-servers=${FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_BOOTSTRAP_SERVERS:localhost:9092}
 
fineract.remote-job-message-handler.kafka.consumer.group-id=${FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_CONSUMER_GROUPID:fineract-consumer-group-id}
 #defines the key and value separator, e.g.: key=value
-fineract.remote-job-message-handler.kafka.consumer.extra-properties-key-value-separator=${FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_CONSUMER_EXTRA_PROPERTIES_SEPARATOR:=}
+fineract.remote-job-message-handler.kafka.consumer.extra-properties-key-value-separator=${FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_CONSUMER_EXTRA_PROPERTIES_KEY_VALUE_SEPARATOR:=}
 #defines the item separator, e.g.: key1=value1|key2=value2
 
fineract.remote-job-message-handler.kafka.consumer.extra-properties-separator=${FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_CONSUMER_EXTRA_PROPERTIES_SEPARATOR:|}
 #holds list of key value pairs using the above defined separators:  
key1=value1|key2=value2|...|keyn=valuen
 
fineract.remote-job-message-handler.kafka.consumer.extra-properties=${FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_CONSUMER_EXTRA_PROPERTIES:}
 
fineract.remote-job-message-handler.kafka.producer.extra-properties-separator=${FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_PRODUCER_EXTRA_PROPERTIES_SEPARATOR:|}
-fineract.remote-job-message-handler.kafka.producer.extra-properties-key-value-separator=${FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_PRODUCER_EXTRA_PROPERTIES_SEPARATOR:=}
+fineract.remote-job-message-handler.kafka.producer.extra-properties-key-value-separator=${FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_PRODUCER_EXTRA_PROPERTIES_KEY_VALUE_SEPARATOR:=}
 
fineract.remote-job-message-handler.kafka.producer.extra-properties=${FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_PRODUCER_EXTRA_PROPERTIES:}
 
fineract.remote-job-message-handler.kafka.admin.extra-properties-separator=${FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_ADMIN_EXTRA_PROPERTIES_SEPARATOR:|}
 
fineract.remote-job-message-handler.kafka.admin.extra-properties-key-value-separator=${FINERACT_REMOTE_JOB_MESSAGE_HANDLER_KAFKA_ADMIN_EXTRA_PROPERTIES_KEY_VALUE_SEPARATOR:=}
@@ -114,7 +114,7 @@ 
fineract.events.external.producer.kafka.topic.replicas=${FINERACT_EXTERNAL_EVENT
 
fineract.events.external.producer.kafka.topic.partitions=${FINERACT_EXTERNAL_EVENTS_KAFKA_TOPIC_PARTITIONS:10}
 
fineract.events.external.producer.kafka.bootstrap-servers=${FINERACT_EXTERNAL_EVENTS_KAFKA_BOOTSTRAP_SERVERS:localhost:9092}
 
fineract.events.external.producer.kafka.producer.extra-properties-separator=${FINERACT_EXTERNAL_EVENTS_KAFKA_PRODUCER_EXTRA_PROPERTIES_SEPARATOR:|}
-fineract.events.external.producer.kafka.producer.extra-properties-key-value-separator=${FINERACT_EXTERNAL_EVENTS_KAFKA_PRODUCER_EXTRA_PROPERTIES_SEPARATOR:=}
+fineract.events.external.producer.kafka.producer.extra-properties-key-value-separator=${FINERACT_EXTERNAL_EVENTS_KAFKA_PRODUCER_EXTRA_PROPERTIES_KEY_VALUE_SEPARATOR:=}
 
fineract.events.external.producer.kafka.producer.extra-properties=${FINERACT_EXTERNAL_EVENTS_KAFKA_PRODUCER_EXTRA_PROPERTIES:linger.ms=10|batch.size=16384}
 
fineract.events.external.producer.kafka.admin.extra-properties-separator=${FINERACT_EXTERNAL_EVENTS_KAFKA_ADMIN_EXTRA_PROPERTIES_SEPARATOR:|}
 
fineract.events.external.producer.kafka.admin.extra-properties-key-value-separator=${FINERACT_EXTERNAL_EVENTS_KAFKA_ADMIN_EXTRA_PROPERTIES_KEY_VALUE_SEPARATOR:=}

Reply via email to