From 7edd2a1b20cba11a734941dbc338e25e6ad9eb82 Mon Sep 17 00:00:00 2001 From: buildmaster Date: Mon, 22 Jun 2020 15:19:11 +0000 Subject: [PATCH] Sync docs from v3.0.6.RELEASE to gh-pages --- .../3.0.6.RELEASE/reference/html/Guardfile | 20 + .../3.0.6.RELEASE/reference/html/README.html | 1366 ++++++ .../reference/html/appendix.html | 106 + .../reference/html/building.html | 244 ++ .../reference/html/contributing.html | 185 + .../reference/html/css/spring.css | 1 + .../3.0.6.RELEASE/reference/html/dlq.html | 268 ++ .../3.0.6.RELEASE/reference/html/favicon.ico | Bin 0 -> 111804 bytes .../reference/html/images/kafka-binder.png | Bin 0 -> 9469 bytes .../html/images/kafka-streams-initializr.png | Bin 0 -> 121574 bytes .../spring-initializr-kafka-streams.png | Bin 0 -> 239045 bytes .../html/js/highlight/highlight.min.js | 2 + .../highlight/styles/atom-one-light.min.css | 96 + .../html/js/highlight/styles/github-gist.css | 79 + .../html/js/highlight/styles/github.min.css | 99 + .../html/js/highlight/styles/googlecode.css | 89 + .../highlight/styles/solarized-light.min.css | 84 + .../3.0.6.RELEASE/reference/html/js/toc.js | 80 + .../reference/html/js/tocbot/tocbot.css | 1 + .../reference/html/js/tocbot/tocbot.min.js | 1 + .../reference/html/kafka-streams.html | 2229 ++++++++++ .../reference/html/overview.html | 1141 +++++ .../reference/html/partitions.html | 241 ++ ...g-cloud-stream-binder-kafka-aggregate.html | 1417 ++++++ .../spring-cloud-stream-binder-kafka.html | 3855 +++++++++++++++++ .../reference/htmlsingle/Guardfile | 20 + .../reference/htmlsingle/css/spring.css | 1 + .../reference/htmlsingle/favicon.ico | Bin 0 -> 111804 bytes .../htmlsingle/images/kafka-binder.png | Bin 0 -> 9469 bytes .../images/kafka-streams-initializr.png | Bin 0 -> 121574 bytes .../spring-initializr-kafka-streams.png | Bin 0 -> 239045 bytes .../htmlsingle/js/highlight/highlight.min.js | 2 + .../highlight/styles/atom-one-light.min.css | 96 + .../js/highlight/styles/github-gist.css | 79 + .../js/highlight/styles/github.min.css | 99 + .../js/highlight/styles/googlecode.css | 89 + .../highlight/styles/solarized-light.min.css | 84 + .../reference/htmlsingle/js/toc.js | 80 + .../reference/htmlsingle/js/tocbot/tocbot.css | 1 + .../htmlsingle/js/tocbot/tocbot.min.js | 1 + 40 files changed, 12156 insertions(+) create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/Guardfile create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/README.html create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/appendix.html create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/building.html create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/contributing.html create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/css/spring.css create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/dlq.html create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/favicon.ico create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/images/kafka-binder.png create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/images/kafka-streams-initializr.png create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/images/spring-initializr-kafka-streams.png create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/highlight/highlight.min.js create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/highlight/styles/atom-one-light.min.css create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/highlight/styles/github-gist.css create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/highlight/styles/github.min.css create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/highlight/styles/googlecode.css create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/highlight/styles/solarized-light.min.css create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/toc.js create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/tocbot/tocbot.css create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/tocbot/tocbot.min.js create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/kafka-streams.html create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/overview.html create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/partitions.html create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/spring-cloud-stream-binder-kafka-aggregate.html create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/spring-cloud-stream-binder-kafka.html create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/Guardfile create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/css/spring.css create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/favicon.ico create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/images/kafka-binder.png create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/images/kafka-streams-initializr.png create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/images/spring-initializr-kafka-streams.png create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/highlight/highlight.min.js create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/highlight/styles/atom-one-light.min.css create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/highlight/styles/github-gist.css create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/highlight/styles/github.min.css create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/highlight/styles/googlecode.css create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/highlight/styles/solarized-light.min.css create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/toc.js create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/tocbot/tocbot.css create mode 100644 spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/tocbot/tocbot.min.js diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/Guardfile b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/Guardfile new file mode 100644 index 00000000..bdd4d729 --- /dev/null +++ b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/Guardfile @@ -0,0 +1,20 @@ +require 'asciidoctor' +require 'erb' + +guard 'shell' do + watch(/.*\.adoc$/) {|m| + Asciidoctor.render_file('index.adoc', \ + :in_place => true, \ + :safe => Asciidoctor::SafeMode::UNSAFE, \ + :attributes=> { \ + 'source-highlighter' => 'prettify', \ + 'icons' => 'font', \ + 'linkcss'=> 'true', \ + 'copycss' => 'true', \ + 'doctype' => 'book'}) + } +end + +guard 'livereload' do + watch(%r{^.+\.(css|js|html)$}) +end diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/README.html b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/README.html new file mode 100644 index 00000000..56f69ccc --- /dev/null +++ b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/README.html @@ -0,0 +1,1366 @@ + + + + + + + +Apache Kafka Binder + + + + + + + + + + +
+
+
+
+
+CircleCI +
+
+
+
+codecov +
+
+
+
+Gitter +
+
+ +
+
+
+

Apache Kafka Binder

+
+
+

Usage

+
+

To use Apache Kafka binder, you need to add spring-cloud-stream-binder-kafka as a dependency to your Spring Cloud Stream application, as shown in the following example for Maven:

+
+
+
+
<dependency>
+  <groupId>org.springframework.cloud</groupId>
+  <artifactId>spring-cloud-stream-binder-kafka</artifactId>
+</dependency>
+
+
+
+

Alternatively, you can also use the Spring Cloud Stream Kafka Starter, as shown in the following example for Maven:

+
+
+
+
<dependency>
+  <groupId>org.springframework.cloud</groupId>
+  <artifactId>spring-cloud-starter-stream-kafka</artifactId>
+</dependency>
+
+
+
+
+

Overview

+
+

The following image shows a simplified diagram of how the Apache Kafka binder operates:

+
+
+
+kafka binder +
+
Figure 1. Kafka Binder
+
+
+

The Apache Kafka Binder implementation maps each destination to an Apache Kafka topic. +The consumer group maps directly to the same Apache Kafka concept. +Partitioning also maps directly to Apache Kafka partitions as well.

+
+
+

The binder currently uses the Apache Kafka kafka-clients version 2.3.1. +This client can communicate with older brokers (see the Kafka documentation), but certain features may not be available. +For example, with versions earlier than 0.11.x.x, native headers are not supported. +Also, 0.11.x.x does not support the autoAddPartitions property.

+
+
+
+

Configuration Options

+
+

This section contains the configuration options used by the Apache Kafka binder.

+
+
+

For common configuration options and properties pertaining to binder, see the core documentation.

+
+
+

Kafka Binder Properties

+
+
+
spring.cloud.stream.kafka.binder.brokers
+
+

A list of brokers to which the Kafka binder connects.

+
+

Default: localhost.

+
+
+
spring.cloud.stream.kafka.binder.defaultBrokerPort
+
+

brokers allows hosts specified with or without port information (for example, host1,host2:port2). +This sets the default port when no port is configured in the broker list.

+
+

Default: 9092.

+
+
+
spring.cloud.stream.kafka.binder.configuration
+
+

Key/Value map of client properties (both producers and consumer) passed to all clients created by the binder. +Due to the fact that these properties are used by both producers and consumers, usage should be restricted to common properties — for example, security settings. +Unknown Kafka producer or consumer properties provided through this configuration are filtered out and not allowed to propagate. +Properties here supersede any properties set in boot.

+
+

Default: Empty map.

+
+
+
spring.cloud.stream.kafka.binder.consumerProperties
+
+

Key/Value map of arbitrary Kafka client consumer properties. +In addition to support known Kafka consumer properties, unknown consumer properties are allowed here as well. +Properties here supersede any properties set in boot and in the configuration property above.

+
+

Default: Empty map.

+
+
+
spring.cloud.stream.kafka.binder.headers
+
+

The list of custom headers that are transported by the binder. +Only required when communicating with older applications (⇐ 1.3.x) with a kafka-clients version < 0.11.0.0. Newer versions support headers natively.

+
+

Default: empty.

+
+
+
spring.cloud.stream.kafka.binder.healthTimeout
+
+

The time to wait to get partition information, in seconds. +Health reports as down if this timer expires.

+
+

Default: 10.

+
+
+
spring.cloud.stream.kafka.binder.requiredAcks
+
+

The number of required acks on the broker. +See the Kafka documentation for the producer acks property.

+
+

Default: 1.

+
+
+
spring.cloud.stream.kafka.binder.minPartitionCount
+
+

Effective only if autoCreateTopics or autoAddPartitions is set. +The global minimum number of partitions that the binder configures on topics on which it produces or consumes data. +It can be superseded by the partitionCount setting of the producer or by the value of instanceCount * concurrency settings of the producer (if either is larger).

+
+

Default: 1.

+
+
+
spring.cloud.stream.kafka.binder.producerProperties
+
+

Key/Value map of arbitrary Kafka client producer properties. +In addition to support known Kafka producer properties, unknown producer properties are allowed here as well. +Properties here supersede any properties set in boot and in the configuration property above.

+
+

Default: Empty map.

+
+
+
spring.cloud.stream.kafka.binder.replicationFactor
+
+

The replication factor of auto-created topics if autoCreateTopics is active. +Can be overridden on each binding.

+
+

Default: 1.

+
+
+
spring.cloud.stream.kafka.binder.autoCreateTopics
+
+

If set to true, the binder creates new topics automatically. +If set to false, the binder relies on the topics being already configured. +In the latter case, if the topics do not exist, the binder fails to start.

+
+ + + + + +
+ + +This setting is independent of the auto.create.topics.enable setting of the broker and does not influence it. +If the server is set to auto-create topics, they may be created as part of the metadata retrieval request, with default broker settings. +
+
+
+

Default: true.

+
+
+
spring.cloud.stream.kafka.binder.autoAddPartitions
+
+

If set to true, the binder creates new partitions if required. +If set to false, the binder relies on the partition size of the topic being already configured. +If the partition count of the target topic is smaller than the expected value, the binder fails to start.

+
+

Default: false.

+
+
+
spring.cloud.stream.kafka.binder.transaction.transactionIdPrefix
+
+

Enables transactions in the binder. See transaction.id in the Kafka documentation and Transactions in the spring-kafka documentation. +When transactions are enabled, individual producer properties are ignored and all producers use the spring.cloud.stream.kafka.binder.transaction.producer.* properties.

+
+

Default null (no transactions)

+
+
+
spring.cloud.stream.kafka.binder.transaction.producer.*
+
+

Global producer properties for producers in a transactional binder. +See spring.cloud.stream.kafka.binder.transaction.transactionIdPrefix and Kafka Producer Properties and the general producer properties supported by all binders.

+
+

Default: See individual producer properties.

+
+
+
spring.cloud.stream.kafka.binder.headerMapperBeanName
+
+

The bean name of a KafkaHeaderMapper used for mapping spring-messaging headers to and from Kafka headers. +Use this, for example, if you wish to customize the trusted packages in a BinderHeaderMapper bean that uses JSON deserialization for the headers. +If this custom BinderHeaderMapper bean is not made available to the binder using this property, then the binder will look for a header mapper bean with the name kafkaBinderHeaderMapper that is of type BinderHeaderMapper before falling back to a default BinderHeaderMapper created by the binder.

+
+

Default: none.

+
+
+
+
+
+
+

Kafka Consumer Properties

+
+ + + + + +
+ + +To avoid repetition, Spring Cloud Stream supports setting values for all channels, in the format of spring.cloud.stream.kafka.default.consumer.<property>=<value>. +
+
+
+

The following properties are available for Kafka consumers only and +must be prefixed with spring.cloud.stream.kafka.bindings.<channelName>.consumer..

+
+
+
+
admin.configuration
+
+

Since version 2.1.1, this property is deprecated in favor of topic.properties, and support for it will be removed in a future version.

+
+
admin.replicas-assignment
+
+

Since version 2.1.1, this property is deprecated in favor of topic.replicas-assignment, and support for it will be removed in a future version.

+
+
admin.replication-factor
+
+

Since version 2.1.1, this property is deprecated in favor of topic.replication-factor, and support for it will be removed in a future version.

+
+
autoRebalanceEnabled
+
+

When true, topic partitions is automatically rebalanced between the members of a consumer group. +When false, each consumer is assigned a fixed set of partitions based on spring.cloud.stream.instanceCount and spring.cloud.stream.instanceIndex. +This requires both the spring.cloud.stream.instanceCount and spring.cloud.stream.instanceIndex properties to be set appropriately on each launched instance. +The value of the spring.cloud.stream.instanceCount property must typically be greater than 1 in this case.

+
+

Default: true.

+
+
+
ackEachRecord
+
+

When autoCommitOffset is true, this setting dictates whether to commit the offset after each record is processed. +By default, offsets are committed after all records in the batch of records returned by consumer.poll() have been processed. +The number of records returned by a poll can be controlled with the max.poll.records Kafka property, which is set through the consumer configuration property. +Setting this to true may cause a degradation in performance, but doing so reduces the likelihood of redelivered records when a failure occurs. +Also, see the binder requiredAcks property, which also affects the performance of committing offsets.

+
+

Default: false.

+
+
+
autoCommitOffset
+
+

Whether to autocommit offsets when a message has been processed. +If set to false, a header with the key kafka_acknowledgment of the type org.springframework.kafka.support.Acknowledgment header is present in the inbound message. +Applications may use this header for acknowledging messages. +See the examples section for details. +When this property is set to false, Kafka binder sets the ack mode to org.springframework.kafka.listener.AbstractMessageListenerContainer.AckMode.MANUAL and the application is responsible for acknowledging records. +Also see ackEachRecord.

+
+

Default: true.

+
+
+
autoCommitOnError
+
+

Effective only if autoCommitOffset is set to true. +If set to false, it suppresses auto-commits for messages that result in errors and commits only for successful messages. It allows a stream to automatically replay from the last successfully processed message, in case of persistent failures. +If set to true, it always auto-commits (if auto-commit is enabled). +If not set (the default), it effectively has the same value as enableDlq, auto-committing erroneous messages if they are sent to a DLQ and not committing them otherwise.

+
+

Default: not set.

+
+
+
resetOffsets
+
+

Whether to reset offsets on the consumer to the value provided by startOffset. +Must be false if a KafkaRebalanceListener is provided; see Using a KafkaRebalanceListener.

+
+

Default: false.

+
+
+
startOffset
+
+

The starting offset for new groups. +Allowed values: earliest and latest. +If the consumer group is set explicitly for the consumer 'binding' (through spring.cloud.stream.bindings.<channelName>.group), 'startOffset' is set to earliest. Otherwise, it is set to latest for the anonymous consumer group. +Also see resetOffsets (earlier in this list).

+
+

Default: null (equivalent to earliest).

+
+
+
enableDlq
+
+

When set to true, it enables DLQ behavior for the consumer. +By default, messages that result in errors are forwarded to a topic named error.<destination>.<group>. +The DLQ topic name can be configurable by setting the dlqName property. +This provides an alternative option to the more common Kafka replay scenario for the case when the number of errors is relatively small and replaying the entire original topic may be too cumbersome. +See [kafka-dlq-processing] processing for more information. +Starting with version 2.0, messages sent to the DLQ topic are enhanced with the following headers: x-original-topic, x-exception-message, and x-exception-stacktrace as byte[]. +By default, a failed record is sent to the same partition number in the DLQ topic as the original record. +See [dlq-partition-selection] for how to change that behavior. +Not allowed when destinationIsPattern is true.

+
+

Default: false.

+
+
+
dlqPartitions
+
+

When enableDlq is true, and this property is not set, a dead letter topic with the same number of partitions as the primary topic(s) is created. +Usually, dead-letter records are sent to the same partition in the dead-letter topic as the original record. +This behavior can be changed; see [dlq-partition-selection]. +If this property is set to 1 and there is no DqlPartitionFunction bean, all dead-letter records will be written to partition 0. +If this property is greater than 1, you MUST provide a DlqPartitionFunction bean. +Note that the actual partition count is affected by the binder’s minPartitionCount property.

+
+

Default: none

+
+
+
configuration
+
+

Map with a key/value pair containing generic Kafka consumer properties. +In addition to having Kafka consumer properties, other configuration properties can be passed here. +For example some properties needed by the application such as spring.cloud.stream.kafka.bindings.input.consumer.configuration.foo=bar.

+
+

Default: Empty map.

+
+
+
dlqName
+
+

The name of the DLQ topic to receive the error messages.

+
+

Default: null (If not specified, messages that result in errors are forwarded to a topic named error.<destination>.<group>).

+
+
+
dlqProducerProperties
+
+

Using this, DLQ-specific producer properties can be set. +All the properties available through kafka producer properties can be set through this property. +When native decoding is enabled on the consumer (i.e., useNativeDecoding: true) , the application must provide corresponding key/value serializers for DLQ. +This must be provided in the form of dlqProducerProperties.configuration.key.serializer and dlqProducerProperties.configuration.value.serializer.

+
+

Default: Default Kafka producer properties.

+
+
+
standardHeaders
+
+

Indicates which standard headers are populated by the inbound channel adapter. +Allowed values: none, id, timestamp, or both. +Useful if using native deserialization and the first component to receive a message needs an id (such as an aggregator that is configured to use a JDBC message store).

+
+

Default: none

+
+
+
converterBeanName
+
+

The name of a bean that implements RecordMessageConverter. Used in the inbound channel adapter to replace the default MessagingMessageConverter.

+
+

Default: null

+
+
+
idleEventInterval
+
+

The interval, in milliseconds, between events indicating that no messages have recently been received. +Use an ApplicationListener<ListenerContainerIdleEvent> to receive these events. +See Example: Pausing and Resuming the Consumer for a usage example.

+
+

Default: 30000

+
+
+
destinationIsPattern
+
+

When true, the destination is treated as a regular expression Pattern used to match topic names by the broker. +When true, topics are not provisioned, and enableDlq is not allowed, because the binder does not know the topic names during the provisioning phase. +Note, the time taken to detect new topics that match the pattern is controlled by the consumer property metadata.max.age.ms, which (at the time of writing) defaults to 300,000ms (5 minutes). +This can be configured using the configuration property above.

+
+

Default: false

+
+
+
topic.properties
+
+

A Map of Kafka topic properties used when provisioning new topics — for example, spring.cloud.stream.kafka.bindings.input.consumer.topic.properties.message.format.version=0.9.0.0

+
+

Default: none.

+
+
+
topic.replicas-assignment
+
+

A Map<Integer, List<Integer>> of replica assignments, with the key being the partition and the value being the assignments. +Used when provisioning new topics. +See the NewTopic Javadocs in the kafka-clients jar.

+
+

Default: none.

+
+
+
topic.replication-factor
+
+

The replication factor to use when provisioning topics. Overrides the binder-wide setting. +Ignored if replicas-assignments is present.

+
+

Default: none (the binder-wide default of 1 is used).

+
+
+
pollTimeout
+
+

Timeout used for polling in pollable consumers.

+
+

Default: 5 seconds.

+
+
+
+
+
+
+

Consuming Batches

+
+

Starting with version 3.0, when spring.cloud.stream.binding.<name>.consumer.batch-mode is set to true, all of the records received by polling the Kafka Consumer will be presented as a List<?> to the listener method. +Otherwise, the method will be called with one record at a time. +The size of the batch is controlled by Kafka consumer properties max.poll.records, min.fetch.bytes, fetch.max.wait.ms; refer to the Kafka documentation for more information.

+
+
+

Bear in mind that batch mode is not supported with @StreamListener - it only works with the newer functional programming model.

+
+
+ + + + + +
+ + +Retry within the binder is not supported when using batch mode, so maxAttempts will be overridden to 1. +You can configure a SeekToCurrentBatchErrorHandler (using a ListenerContainerCustomizer) to achieve similar functionality to retry in the binder. +You can also use a manual AckMode and call Ackowledgment.nack(index, sleep) to commit the offsets for a partial batch and have the remaining records redelivered. +Refer to the Spring for Apache Kafka documentation for more information about these techniques. +
+
+
+
+

Kafka Producer Properties

+
+ + + + + +
+ + +To avoid repetition, Spring Cloud Stream supports setting values for all channels, in the format of spring.cloud.stream.kafka.default.producer.<property>=<value>. +
+
+
+

The following properties are available for Kafka producers only and +must be prefixed with spring.cloud.stream.kafka.bindings.<channelName>.producer..

+
+
+
+
admin.configuration
+
+

Since version 2.1.1, this property is deprecated in favor of topic.properties, and support for it will be removed in a future version.

+
+
admin.replicas-assignment
+
+

Since version 2.1.1, this property is deprecated in favor of topic.replicas-assignment, and support for it will be removed in a future version.

+
+
admin.replication-factor
+
+

Since version 2.1.1, this property is deprecated in favor of topic.replication-factor, and support for it will be removed in a future version.

+
+
bufferSize
+
+

Upper limit, in bytes, of how much data the Kafka producer attempts to batch before sending.

+
+

Default: 16384.

+
+
+
sync
+
+

Whether the producer is synchronous.

+
+

Default: false.

+
+
+
sendTimeoutExpression
+
+

A SpEL expression evaluated against the outgoing message used to evaluate the time to wait for ack when synchronous publish is enabled — for example, headers['mySendTimeout']. +The value of the timeout is in milliseconds. +With versions before 3.0, the payload could not be used unless native encoding was being used because, by the time this expression was evaluated, the payload was already in the form of a byte[]. +Now, the expression is evaluated before the payload is converted.

+
+

Default: none.

+
+
+
batchTimeout
+
+

How long the producer waits to allow more messages to accumulate in the same batch before sending the messages. +(Normally, the producer does not wait at all and simply sends all the messages that accumulated while the previous send was in progress.) A non-zero value may increase throughput at the expense of latency.

+
+

Default: 0.

+
+
+
messageKeyExpression
+
+

A SpEL expression evaluated against the outgoing message used to populate the key of the produced Kafka message — for example, headers['myKey']. +With versions before 3.0, the payload could not be used unless native encoding was being used because, by the time this expression was evaluated, the payload was already in the form of a byte[]. +Now, the expression is evaluated before the payload is converted.

+
+

Default: none.

+
+
+
headerPatterns
+
+

A comma-delimited list of simple patterns to match Spring messaging headers to be mapped to the Kafka Headers in the ProducerRecord. +Patterns can begin or end with the wildcard character (asterisk). +Patterns can be negated by prefixing with !. +Matching stops after the first match (positive or negative). +For example !ask,as* will pass ash but not ask. +id and timestamp are never mapped.

+
+

Default: * (all headers - except the id and timestamp)

+
+
+
configuration
+
+

Map with a key/value pair containing generic Kafka producer properties.

+
+

Default: Empty map.

+
+
+
topic.properties
+
+

A Map of Kafka topic properties used when provisioning new topics — for example, spring.cloud.stream.kafka.bindings.output.producer.topic.properties.message.format.version=0.9.0.0

+
+
topic.replicas-assignment
+
+

A Map<Integer, List<Integer>> of replica assignments, with the key being the partition and the value being the assignments. +Used when provisioning new topics. +See the NewTopic Javadocs in the kafka-clients jar.

+
+

Default: none.

+
+
+
topic.replication-factor
+
+

The replication factor to use when provisioning topics. Overrides the binder-wide setting. +Ignored if replicas-assignments is present.

+
+

Default: none (the binder-wide default of 1 is used).

+
+
+
useTopicHeader
+
+

Set to true to override the default binding destination (topic name) with the value of the KafkaHeaders.TOPIC message header in the outbound message. +If the header is not present, the default binding destination is used. +Default: false.

+
+
recordMetadataChannel
+
+

The bean name of a MessageChannel to which successful send results should be sent; the bean must exist in the application context. +The message sent to the channel is the sent message (after conversion, if any) with an additional header KafkaHeaders.RECORD_METADATA. +The header contains a RecordMetadata object provided by the Kafka client; it includes the partition and offset where the record was written in the topic.

+
+
+
+
+

ResultMetadata meta = sendResultMsg.getHeaders().get(KafkaHeaders.RECORD_METADATA, RecordMetadata.class)

+
+
+

Failed sends go the producer error channel (if configured); see Error Channels. +Default: null

+
+
+

+

+
+
+ + + + + +
+ + +The Kafka binder uses the partitionCount setting of the producer as a hint to create a topic with the given partition count (in conjunction with the minPartitionCount, the maximum of the two being the value being used). +Exercise caution when configuring both minPartitionCount for a binder and partitionCount for an application, as the larger value is used. +If a topic already exists with a smaller partition count and autoAddPartitions is disabled (the default), the binder fails to start. +If a topic already exists with a smaller partition count and autoAddPartitions is enabled, new partitions are added. +If a topic already exists with a larger number of partitions than the maximum of (minPartitionCount or partitionCount), the existing partition count is used. +
+
+
+
+
compression
+
+

Set the compression.type producer property. +Supported values are none, gzip, snappy and lz4. +If you override the kafka-clients jar to 2.1.0 (or later), as discussed in the Spring for Apache Kafka documentation, and wish to use zstd compression, use spring.cloud.stream.kafka.bindings.<binding-name>.producer.configuration.compression.type=zstd.

+
+

Default: none.

+
+
+
closeTimeout
+
+

Timeout in number of seconds to wait for when closing the producer.

+
+

Default: 30

+
+
+
+
+
+
+

Usage examples

+
+

In this section, we show the use of the preceding properties for specific scenarios.

+
+
+
Example: Setting autoCommitOffset to false and Relying on Manual Acking
+
+

This example illustrates how one may manually acknowledge offsets in a consumer application.

+
+
+

This example requires that spring.cloud.stream.kafka.bindings.input.consumer.autoCommitOffset be set to false. +Use the corresponding input channel name for your example.

+
+
+
+
@SpringBootApplication
+@EnableBinding(Sink.class)
+public class ManuallyAcknowdledgingConsumer {
+
+ public static void main(String[] args) {
+     SpringApplication.run(ManuallyAcknowdledgingConsumer.class, args);
+ }
+
+ @StreamListener(Sink.INPUT)
+ public void process(Message<?> message) {
+     Acknowledgment acknowledgment = message.getHeaders().get(KafkaHeaders.ACKNOWLEDGMENT, Acknowledgment.class);
+     if (acknowledgment != null) {
+         System.out.println("Acknowledgment provided");
+         acknowledgment.acknowledge();
+     }
+ }
+}
+
+
+
+
+
Example: Security Configuration
+
+

Apache Kafka 0.9 supports secure connections between client and brokers. +To take advantage of this feature, follow the guidelines in the Apache Kafka Documentation as well as the Kafka 0.9 security guidelines from the Confluent documentation. +Use the spring.cloud.stream.kafka.binder.configuration option to set security properties for all clients created by the binder.

+
+
+

For example, to set security.protocol to SASL_SSL, set the following property:

+
+
+
+
spring.cloud.stream.kafka.binder.configuration.security.protocol=SASL_SSL
+
+
+
+

All the other security properties can be set in a similar manner.

+
+
+

When using Kerberos, follow the instructions in the reference documentation for creating and referencing the JAAS configuration.

+
+
+

Spring Cloud Stream supports passing JAAS configuration information to the application by using a JAAS configuration file and using Spring Boot properties.

+
+
+
Using JAAS Configuration Files
+
+

The JAAS and (optionally) krb5 file locations can be set for Spring Cloud Stream applications by using system properties. +The following example shows how to launch a Spring Cloud Stream application with SASL and Kerberos by using a JAAS configuration file:

+
+
+
+
 java -Djava.security.auth.login.config=/path.to/kafka_client_jaas.conf -jar log.jar \
+   --spring.cloud.stream.kafka.binder.brokers=secure.server:9092 \
+   --spring.cloud.stream.bindings.input.destination=stream.ticktock \
+   --spring.cloud.stream.kafka.binder.configuration.security.protocol=SASL_PLAINTEXT
+
+
+
+
+
Using Spring Boot Properties
+
+

As an alternative to having a JAAS configuration file, Spring Cloud Stream provides a mechanism for setting up the JAAS configuration for Spring Cloud Stream applications by using Spring Boot properties.

+
+
+

The following properties can be used to configure the login context of the Kafka client:

+
+
+
+
spring.cloud.stream.kafka.binder.jaas.loginModule
+
+

The login module name. Not necessary to be set in normal cases.

+
+

Default: com.sun.security.auth.module.Krb5LoginModule.

+
+
+
spring.cloud.stream.kafka.binder.jaas.controlFlag
+
+

The control flag of the login module.

+
+

Default: required.

+
+
+
spring.cloud.stream.kafka.binder.jaas.options
+
+

Map with a key/value pair containing the login module options.

+
+

Default: Empty map.

+
+
+
+
+
+

The following example shows how to launch a Spring Cloud Stream application with SASL and Kerberos by using Spring Boot configuration properties:

+
+
+
+
 java --spring.cloud.stream.kafka.binder.brokers=secure.server:9092 \
+   --spring.cloud.stream.bindings.input.destination=stream.ticktock \
+   --spring.cloud.stream.kafka.binder.autoCreateTopics=false \
+   --spring.cloud.stream.kafka.binder.configuration.security.protocol=SASL_PLAINTEXT \
+   --spring.cloud.stream.kafka.binder.jaas.options.useKeyTab=true \
+   --spring.cloud.stream.kafka.binder.jaas.options.storeKey=true \
+   --spring.cloud.stream.kafka.binder.jaas.options.keyTab=/etc/security/keytabs/kafka_client.keytab \
+   --spring.cloud.stream.kafka.binder.jaas.options.principal=kafka-client-1@EXAMPLE.COM
+
+
+
+

The preceding example represents the equivalent of the following JAAS file:

+
+
+
+
KafkaClient {
+    com.sun.security.auth.module.Krb5LoginModule required
+    useKeyTab=true
+    storeKey=true
+    keyTab="/etc/security/keytabs/kafka_client.keytab"
+    principal="kafka-client-1@EXAMPLE.COM";
+};
+
+
+
+

If the topics required already exist on the broker or will be created by an administrator, autocreation can be turned off and only client JAAS properties need to be sent.

+
+
+ + + + + +
+ + +Do not mix JAAS configuration files and Spring Boot properties in the same application. +If the -Djava.security.auth.login.config system property is already present, Spring Cloud Stream ignores the Spring Boot properties. +
+
+
+ + + + + +
+ + +Be careful when using the autoCreateTopics and autoAddPartitions with Kerberos. +Usually, applications may use principals that do not have administrative rights in Kafka and Zookeeper. +Consequently, relying on Spring Cloud Stream to create/modify topics may fail. +In secure environments, we strongly recommend creating topics and managing ACLs administratively by using Kafka tooling. +
+
+
+
+
+
Example: Pausing and Resuming the Consumer
+
+

If you wish to suspend consumption but not cause a partition rebalance, you can pause and resume the consumer. +This is facilitated by adding the Consumer as a parameter to your @StreamListener. +To resume, you need an ApplicationListener for ListenerContainerIdleEvent instances. +The frequency at which events are published is controlled by the idleEventInterval property. +Since the consumer is not thread-safe, you must call these methods on the calling thread.

+
+
+

The following simple application shows how to pause and resume:

+
+
+
+
@SpringBootApplication
+@EnableBinding(Sink.class)
+public class Application {
+
+	public static void main(String[] args) {
+		SpringApplication.run(Application.class, args);
+	}
+
+	@StreamListener(Sink.INPUT)
+	public void in(String in, @Header(KafkaHeaders.CONSUMER) Consumer<?, ?> consumer) {
+		System.out.println(in);
+		consumer.pause(Collections.singleton(new TopicPartition("myTopic", 0)));
+	}
+
+	@Bean
+	public ApplicationListener<ListenerContainerIdleEvent> idleListener() {
+		return event -> {
+			System.out.println(event);
+			if (event.getConsumer().paused().size() > 0) {
+				event.getConsumer().resume(event.getConsumer().paused());
+			}
+		};
+	}
+
+}
+
+
+
+
+
+
+

Transactional Binder

+
+

Enable transactions by setting spring.cloud.stream.kafka.binder.transaction.transactionIdPrefix to a non-empty value, e.g. tx-. +When used in a processor application, the consumer starts the transaction; any records sent on the consumer thread participate in the same transaction. +When the listener exits normally, the listener container will send the offset to the transaction and commit it. +A common producer factory is used for all producer bindings configured using spring.cloud.stream.kafka.binder.transaction.producer.* properties; individual binding Kafka producer properties are ignored.

+
+
+ + + + + +
+ + +Normal binder retries (and dead lettering) are not supported with transactions because the retries will run in the original transaction, which may be rolled back and any published records will be rolled back too. +When retries are enabled (the common property maxAttempts is greater than zero) the retry properties are used to configure a DefaultAfterRollbackProcessor to enable retries at the container level. +Similarly, instead of publishing dead-letter records within the transaction, this functionality is moved to the listener container, again via the DefaultAfterRollbackProcessor which runs after the main transaction has rolled back. +
+
+
+

If you wish to use transactions in a source application, or from some arbitrary thread for producer-only transaction (e.g. @Scheduled method), you must get a reference to the transactional producer factory and define a KafkaTransactionManager bean using it.

+
+
+
+
+
+
@Bean
+public PlatformTransactionManager transactionManager(BinderFactory binders) {
+    ProducerFactory<byte[], byte[]> pf = ((KafkaMessageChannelBinder) binders.getBinder(null,
+            MessageChannel.class)).getTransactionalProducerFactory();
+    return new KafkaTransactionManager<>(pf);
+}
+
+
+
+
+
+

Notice that we get a reference to the binder using the BinderFactory; use null in the first argument when there is only one binder configured. +If more than one binder is configured, use the binder name to get the reference. +Once we have a reference to the binder, we can obtain a reference to the ProducerFactory and create a transaction manager.

+
+
+

Then you would use normal Spring transaction support, e.g. TransactionTemplate or @Transactional, for example:

+
+
+
+
+
+
public static class Sender {
+
+    @Transactional
+    public void doInTransaction(MessageChannel output, List<String> stuffToSend) {
+        stuffToSend.forEach(stuff -> output.send(new GenericMessage<>(stuff)));
+    }
+
+}
+
+
+
+
+
+

If you wish to synchronize producer-only transactions with those from some other transaction manager, use a ChainedTransactionManager.

+
+
+
+

Error Channels

+
+

Starting with version 1.3, the binder unconditionally sends exceptions to an error channel for each consumer destination and can also be configured to send async producer send failures to an error channel. +See [spring-cloud-stream-overview-error-handling] for more information.

+
+
+

The payload of the ErrorMessage for a send failure is a KafkaSendFailureException with properties:

+
+
+
    +
  • +

    failedMessage: The Spring Messaging Message<?> that failed to be sent.

    +
  • +
  • +

    record: The raw ProducerRecord that was created from the failedMessage

    +
  • +
+
+
+

There is no automatic handling of producer exceptions (such as sending to a Dead-Letter queue). +You can consume these exceptions with your own Spring Integration flow.

+
+
+
+

Kafka Metrics

+
+

Kafka binder module exposes the following metrics:

+
+
+

spring.cloud.stream.binder.kafka.offset: This metric indicates how many messages have not been yet consumed from a given binder’s topic by a given consumer group. +The metrics provided are based on the Mircometer metrics library. The metric contains the consumer group information, topic and the actual lag in committed offset from the latest offset on the topic. +This metric is particularly useful for providing auto-scaling feedback to a PaaS platform.

+
+
+
+

Tombstone Records (null record values)

+
+

When using compacted topics, a record with a null value (also called a tombstone record) represents the deletion of a key. +To receive such messages in a @StreamListener method, the parameter must be marked as not required to receive a null value argument.

+
+
+
+
+
+
@StreamListener(Sink.INPUT)
+public void in(@Header(KafkaHeaders.RECEIVED_MESSAGE_KEY) byte[] key,
+               @Payload(required = false) Customer customer) {
+    // customer is null if a tombstone record
+    ...
+}
+
+
+
+
+
+
+

Using a KafkaRebalanceListener

+
+

Applications may wish to seek topics/partitions to arbitrary offsets when the partitions are initially assigned, or perform other operations on the consumer. +Starting with version 2.1, if you provide a single KafkaRebalanceListener bean in the application context, it will be wired into all Kafka consumer bindings.

+
+
+
+
+
+
public interface KafkaBindingRebalanceListener {
+
+	/**
+	 * Invoked by the container before any pending offsets are committed.
+	 * @param bindingName the name of the binding.
+	 * @param consumer the consumer.
+	 * @param partitions the partitions.
+	 */
+	default void onPartitionsRevokedBeforeCommit(String bindingName, Consumer<?, ?> consumer,
+			Collection<TopicPartition> partitions) {
+
+	}
+
+	/**
+	 * Invoked by the container after any pending offsets are committed.
+	 * @param bindingName the name of the binding.
+	 * @param consumer the consumer.
+	 * @param partitions the partitions.
+	 */
+	default void onPartitionsRevokedAfterCommit(String bindingName, Consumer<?, ?> consumer, Collection<TopicPartition> partitions) {
+
+	}
+
+	/**
+	 * Invoked when partitions are initially assigned or after a rebalance.
+	 * Applications might only want to perform seek operations on an initial assignment.
+	 * @param bindingName the name of the binding.
+	 * @param consumer the consumer.
+	 * @param partitions the partitions.
+	 * @param initial true if this is the initial assignment.
+	 */
+	default void onPartitionsAssigned(String bindingName, Consumer<?, ?> consumer, Collection<TopicPartition> partitions,
+			boolean initial) {
+
+	}
+
+}
+
+
+
+
+
+

You cannot set the resetOffsets consumer property to true when you provide a rebalance listener.

+
+
+
+
+

Appendices

+
+

Appendix A: Building

+
+
+

Basic Compile and Test

+
+

To build the source you will need to install JDK 1.7.

+
+
+

The build uses the Maven wrapper so you don’t have to install a specific +version of Maven. To enable the tests, you should have Kafka server 0.9 or above running +before building. See below for more information on running the servers.

+
+
+

The main build command is

+
+
+
+
$ ./mvnw clean install
+
+
+
+

You can also add '-DskipTests' if you like, to avoid running the tests.

+
+
+ + + + + +
+ + +You can also install Maven (>=3.3.3) yourself and run the mvn command +in place of ./mvnw in the examples below. If you do that you also +might need to add -P spring if your local Maven settings do not +contain repository declarations for spring pre-release artifacts. +
+
+
+ + + + + +
+ + +Be aware that you might need to increase the amount of memory +available to Maven by setting a MAVEN_OPTS environment variable with +a value like -Xmx512m -XX:MaxPermSize=128m. We try to cover this in +the .mvn configuration, so if you find you have to do it to make a +build succeed, please raise a ticket to get the settings added to +source control. +
+
+
+

The projects that require middleware generally include a +docker-compose.yml, so consider using +Docker Compose to run the middeware servers +in Docker containers.

+
+
+
+

Documentation

+
+

There is a "full" profile that will generate documentation.

+
+
+
+

Working with the code

+
+

If you don’t have an IDE preference we would recommend that you use +Spring Tools Suite or +Eclipse when working with the code. We use the +m2eclipe eclipse plugin for maven support. Other IDEs and tools +should also work without issue.

+
+
+

Importing into eclipse with m2eclipse

+
+

We recommend the m2eclipe eclipse plugin when working with +eclipse. If you don’t already have m2eclipse installed it is available from the "eclipse +marketplace".

+
+
+

Unfortunately m2e does not yet support Maven 3.3, so once the projects +are imported into Eclipse you will also need to tell m2eclipse to use +the .settings.xml file for the projects. If you do not do this you +may see many different errors related to the POMs in the +projects. Open your Eclipse preferences, expand the Maven +preferences, and select User Settings. In the User Settings field +click Browse and navigate to the Spring Cloud project you imported +selecting the .settings.xml file in that project. Click Apply and +then OK to save the preference changes.

+
+
+ + + + + +
+ + +Alternatively you can copy the repository settings from .settings.xml into your own ~/.m2/settings.xml. +
+
+
+
+

Importing into eclipse without m2eclipse

+
+

If you prefer not to use m2eclipse you can generate eclipse project metadata using the +following command:

+
+
+
+
$ ./mvnw eclipse:eclipse
+
+
+
+

The generated eclipse projects can be imported by selecting import existing projects +from the file menu. +[[contributing] +== Contributing

+
+
+

Spring Cloud is released under the non-restrictive Apache 2.0 license, +and follows a very standard Github development process, using Github +tracker for issues and merging pull requests into master. If you want +to contribute even something trivial please do not hesitate, but +follow the guidelines below.

+
+
+
+
+

Sign the Contributor License Agreement

+
+

Before we accept a non-trivial patch or pull request we will need you to sign the +contributor’s agreement. +Signing the contributor’s agreement does not grant anyone commit rights to the main +repository, but it does mean that we can accept your contributions, and you will get an +author credit if we do. Active contributors might be asked to join the core team, and +given the ability to merge pull requests.

+
+
+
+

Code Conventions and Housekeeping

+
+

None of these is essential for a pull request, but they will all help. They can also be +added after the original pull request but before a merge.

+
+
+
    +
  • +

    Use the Spring Framework code format conventions. If you use Eclipse +you can import formatter settings using the +eclipse-code-formatter.xml file from the +Spring +Cloud Build project. If using IntelliJ, you can use the +Eclipse Code Formatter +Plugin to import the same file.

    +
  • +
  • +

    Make sure all new .java files to have a simple Javadoc class comment with at least an +@author tag identifying you, and preferably at least a paragraph on what the class is +for.

    +
  • +
  • +

    Add the ASF license header comment to all new .java files (copy from existing files +in the project)

    +
  • +
  • +

    Add yourself as an @author to the .java files that you modify substantially (more +than cosmetic changes).

    +
  • +
  • +

    Add some Javadocs and, if you change the namespace, some XSD doc elements.

    +
  • +
  • +

    A few unit tests would help a lot as well — someone has to do it.

    +
  • +
  • +

    If no-one else is using your branch, please rebase it against the current master (or +other target branch in the main project).

    +
  • +
  • +

    When writing a commit message please follow these conventions, +if you are fixing an existing issue please add Fixes gh-XXXX at the end of the commit +message (where XXXX is the issue number).

    +
  • +
+
+
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/appendix.html b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/appendix.html new file mode 100644 index 00000000..451bd702 --- /dev/null +++ b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/appendix.html @@ -0,0 +1,106 @@ + + + + + + + +Appendices + + + + + + + + + + +
+ +
+ + + + + + + \ No newline at end of file diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/building.html b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/building.html new file mode 100644 index 00000000..62996f5a --- /dev/null +++ b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/building.html @@ -0,0 +1,244 @@ + + + + + + + +Building + + + + + + + + + + +
+
+

Building

+
+
+

Basic Compile and Test

+
+

To build the source you will need to install JDK 1.7.

+
+
+

The build uses the Maven wrapper so you don’t have to install a specific +version of Maven. To enable the tests, you should have Kafka server 0.9 or above running +before building. See below for more information on running the servers.

+
+
+

The main build command is

+
+
+
+
$ ./mvnw clean install
+
+
+
+

You can also add '-DskipTests' if you like, to avoid running the tests.

+
+
+ + + + + +
+ + +You can also install Maven (>=3.3.3) yourself and run the mvn command +in place of ./mvnw in the examples below. If you do that you also +might need to add -P spring if your local Maven settings do not +contain repository declarations for spring pre-release artifacts. +
+
+
+ + + + + +
+ + +Be aware that you might need to increase the amount of memory +available to Maven by setting a MAVEN_OPTS environment variable with +a value like -Xmx512m -XX:MaxPermSize=128m. We try to cover this in +the .mvn configuration, so if you find you have to do it to make a +build succeed, please raise a ticket to get the settings added to +source control. +
+
+
+

The projects that require middleware generally include a +docker-compose.yml, so consider using +Docker Compose to run the middeware servers +in Docker containers.

+
+
+
+

Documentation

+
+

There is a "full" profile that will generate documentation.

+
+
+
+

Working with the code

+
+

If you don’t have an IDE preference we would recommend that you use +Spring Tools Suite or +Eclipse when working with the code. We use the +m2eclipe eclipse plugin for maven support. Other IDEs and tools +should also work without issue.

+
+
+

Importing into eclipse with m2eclipse

+
+

We recommend the m2eclipe eclipse plugin when working with +eclipse. If you don’t already have m2eclipse installed it is available from the "eclipse +marketplace".

+
+
+

Unfortunately m2e does not yet support Maven 3.3, so once the projects +are imported into Eclipse you will also need to tell m2eclipse to use +the .settings.xml file for the projects. If you do not do this you +may see many different errors related to the POMs in the +projects. Open your Eclipse preferences, expand the Maven +preferences, and select User Settings. In the User Settings field +click Browse and navigate to the Spring Cloud project you imported +selecting the .settings.xml file in that project. Click Apply and +then OK to save the preference changes.

+
+
+ + + + + +
+ + +Alternatively you can copy the repository settings from .settings.xml into your own ~/.m2/settings.xml. +
+
+
+
+

Importing into eclipse without m2eclipse

+
+

If you prefer not to use m2eclipse you can generate eclipse project metadata using the +following command:

+
+
+
+
$ ./mvnw eclipse:eclipse
+
+
+
+

The generated eclipse projects can be imported by selecting import existing projects +from the file menu.

+
+
+
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/contributing.html b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/contributing.html new file mode 100644 index 00000000..a00bf7da --- /dev/null +++ b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/contributing.html @@ -0,0 +1,185 @@ + + + + + + + +Sign the Contributor License Agreement + + + + + + + + + + +
+
+
+
+

[[contributing] +== Contributing

+
+
+

Spring Cloud is released under the non-restrictive Apache 2.0 license, +and follows a very standard Github development process, using Github +tracker for issues and merging pull requests into master. If you want +to contribute even something trivial please do not hesitate, but +follow the guidelines below.

+
+
+
+
+

Sign the Contributor License Agreement

+
+

Before we accept a non-trivial patch or pull request we will need you to sign the +contributor’s agreement. +Signing the contributor’s agreement does not grant anyone commit rights to the main +repository, but it does mean that we can accept your contributions, and you will get an +author credit if we do. Active contributors might be asked to join the core team, and +given the ability to merge pull requests.

+
+
+
+

Code Conventions and Housekeeping

+
+

None of these is essential for a pull request, but they will all help. They can also be +added after the original pull request but before a merge.

+
+
+
    +
  • +

    Use the Spring Framework code format conventions. If you use Eclipse +you can import formatter settings using the +eclipse-code-formatter.xml file from the +Spring +Cloud Build project. If using IntelliJ, you can use the +Eclipse Code Formatter +Plugin to import the same file.

    +
  • +
  • +

    Make sure all new .java files to have a simple Javadoc class comment with at least an +@author tag identifying you, and preferably at least a paragraph on what the class is +for.

    +
  • +
  • +

    Add the ASF license header comment to all new .java files (copy from existing files +in the project)

    +
  • +
  • +

    Add yourself as an @author to the .java files that you modify substantially (more +than cosmetic changes).

    +
  • +
  • +

    Add some Javadocs and, if you change the namespace, some XSD doc elements.

    +
  • +
  • +

    A few unit tests would help a lot as well — someone has to do it.

    +
  • +
  • +

    If no-one else is using your branch, please rebase it against the current master (or +other target branch in the main project).

    +
  • +
  • +

    When writing a commit message please follow these conventions, +if you are fixing an existing issue please add Fixes gh-XXXX at the end of the commit +message (where XXXX is the issue number).

    +
  • +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/css/spring.css b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/css/spring.css new file mode 100644 index 00000000..7fead00e --- /dev/null +++ b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/css/spring.css @@ -0,0 +1 @@ +@import url("https://fonts.googleapis.com/css?family=Open+Sans:400,700&display=swap");/*! normalize.css v2.1.2 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden],template{display:none}script{display:none !important}html,body{font-size:100%}html{font-family:'Open Sans', sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}*,*:before,*:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}body{background:white;color:#000;padding:0;margin:0;font-size:16px;font-family:'Open Sans', sans-serif;font-weight:normal;font-style:normal;line-height:1.6em;position:relative;cursor:auto}a:hover{cursor:pointer}img,object,embed{max-width:100%;height:auto}object,embed{height:100%}img{-ms-interpolation-mode:bicubic}#map_canvas img,#map_canvas embed,#map_canvas object,.map_canvas img,.map_canvas embed,.map_canvas object{max-width:none !important}.left{float:left !important}.right{float:right !important}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}.text-justify{text-align:justify !important}.hide{display:none}.antialiased{-webkit-font-smoothing:antialiased}img{display:inline-block;vertical-align:middle}textarea{height:auto;min-height:50px}select{width:100%}object,svg{display:inline-block;vertical-align:middle}.center{margin-left:auto;margin-right:auto}.spread,.stretch{width:100%}p.lead,.paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{line-height:1.6}.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#0b0a0a;font-weight:bold;margin-top:0;margin-bottom:0.8em}div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr}a{color:#086dc3;line-height:inherit;text-decoration:none}a:hover,a:focus{color:#086dc3;text-decoration:underline}a img{border:none}p{font-family:inherit;font-weight:normal;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}p aside{font-size:0.875em;line-height:1.35;font-style:italic}h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:Montserrat, sans-serif;font-weight:400;font-style:normal;color:#000;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:0.5em;line-height:1.0125em}h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#867c74;line-height:0}h1{font-size:2.125em}h2{font-size:1.6875em}h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}h4{font-size:1.125em}h5{font-size:1.125em}h6{font-size:1em}hr{border:solid #dce6e6;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}em,i{font-style:italic;line-height:inherit}strong,b{font-weight:bold;line-height:inherit}small{font-size:60%;line-height:inherit}code{font-family:Monaco, Menlo, Consolas, "Courier New", monospace;font-weight:normal;color:#3d3d3c;word-break:break-word}a:not(pre)>code{border:1px solid #086dc3;color:#086dc3}ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}ul,ol{margin-left:1.5em}ul.no-bullet,ol.no-bullet{margin-left:1.5em}ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}ul.square{list-style-type:square}ul.circle{list-style-type:circle}ul.disc{list-style-type:disc}ul.no-bullet{list-style:none}ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}dl dt{margin-bottom:0.3125em;font-weight:bold}dl dd{margin-bottom:1.25em}abbr,acronym{text-transform:uppercase;font-size:90%;color:#000;border-bottom:1px dotted #dddddd;cursor:help}abbr{text-transform:none}blockquote{margin:0 0 1.25em;padding:0.5625em 1.25em 0 1.1875em;border-left:1px solid #dddddd}blockquote cite{display:block;font-size:0.9375em;color:rgba(0,0,0,0.6)}blockquote cite:before{content:"\2014 \0020"}blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,0.6)}blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,0.85)}.vcard{display:inline-block;margin:0 0 1.25em 0;border:1px solid #dddddd;padding:0.625em 0.75em}.vcard li{margin:0;display:block}.vcard .fn{font-weight:bold;font-size:0.9375em}.vevent .summary{font-weight:bold}.vevent abbr{cursor:auto;text-decoration:none;font-weight:bold;border:none;padding:0 0.0625em}#tocbot{padding:0 0 0.5rem 0;line-height:1.5rem;padding-left:10px}.mobile-toc{padding:0 0 1rem 0;line-height:1.5rem}.mobile-toc li a{display:block;padding:.3rem 0}#tocbot ol li{list-style:none;padding:0;margin:0}#tocbot ol{margin:0;padding:0}#tocbot ol ol{padding-left:0.6rem}#tocbot .toc-link{display:block;padding-top:.6rem;padding-bottom:.6rem;outline:none;border-radius:4px;font-size:15px;transition:all .15s}#tocbot .toc-link:hover{background:#ebf2f2;color:#06c;text-decoration:none}table{background:white;margin-bottom:1.25em;border:solid 1px #d4dfdf;border-spacing:0}table thead,table tfoot{background:#ebf2f2;font-weight:bold}table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:0.5em 0.625em 0.625em;font-size:inherit;color:#000;text-align:left}table tr th,table tr td{padding:0.5625em 0.625em;font-size:inherit;color:#000}table tr.even,table tr.alt,table tr:nth-child(even){background:#f5f9f9}table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6}body{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;tab-size:4}h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-0.05em}.clearfix:before,.clearfix:after,.float-group:before,.float-group:after{content:" ";display:table}.clearfix:after,.float-group:after{clear:both}*:not(pre)>code{white-space:nowrap;background-color:#fff;border:1px solid #e1e1e8;color:#009;padding:2px 6px;font-size:.875rem;font-family:Monaco, Menlo, Consolas, "Courier New", monospace}pre,pre>code{line-height:1.85;color:rgba(0,0,0,0.9);font-family:Monaco, Menlo, Consolas, "Courier New", monospace;font-weight:normal;text-rendering:optimizeSpeed;word-break:normal}pre{overflow:auto}em em{font-style:normal}strong strong{font-weight:normal}.keyseq{color:#6b625c}kbd{font-family:Monaco, Menlo, Consolas, "Courier New", monospace;display:inline-block;color:#000;font-size:0.65em;line-height:1.45;background-color:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.2),0 0 0 0.1em white inset;box-shadow:0 1px 0 rgba(0,0,0,0.2),0 0 0 0.1em white inset;margin:0 0.15em;padding:0.2em 0.5em;vertical-align:middle;position:relative;top:-0.1em;white-space:nowrap}.keyseq kbd:first-child{margin-left:0}.keyseq kbd:last-child{margin-right:0}.menuseq,.menu{color:#191715}b.button:before,b.button:after{position:relative;top:-1px;font-weight:normal}b.button:before{content:"[";padding:0 3px 0 2px}b.button:after{content:"]";padding:0 2px 0 3px}p a>code:hover{color:rgba(0,0,0,0.9)}#toc{border-bottom:1px solid #dce6e6;padding-bottom:0.5em}#toc>ul{margin-left:0.125em}#toc ul.sectlevel0>li>a{font-style:italic}#toc ul.sectlevel0 ul.sectlevel1{margin:0.5em 0}#toc ul{list-style-type:none}#toc li{line-height:1.3334}#toc a{text-decoration:none}#toc a:active{text-decoration:underline}#toctitle{color:#0b0a0a;font-size:1.2em;display:none}body.toc2{padding-top:80px;text-rendering:optimizeLegibility}#content #toc{border-style:solid;border-width:1px;border-color:#dce6e6;margin-bottom:1.25em;padding:1.25em;background:#f1f1f1;-webkit-border-radius:4px;border-radius:4px}#content #toc>:first-child{margin-top:0}#content #toc>:last-child{margin-bottom:0}#footer{padding-bottom:2rem}#footer #footer-text{padding:2rem 0;border-top:1px solid #efefed}#footer-text{color:rgba(0,0,0,0.6);line-height:1.44}.sect1{padding-bottom:0.625em}.sect1+.sect1{border-top:1px solid #efefed}#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;margin-top:0.1rem;display:block;visibility:hidden;text-align:center;font-weight:normal;color:rgba(0,0,0,0.2)}#content h1>a.anchor:hover,h2>a.anchor:hover,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4>a.anchor:hover,h5>a.anchor:hover,h6>a.anchor:hover{color:#097dff;text-decoration:none}#content h1>a.anchor:before,h2>a.anchor:before,h3>a.anchor:before,#toctitle>a.anchor:before,.sidebarblock>.content>.title>a.anchor:before,h4>a.anchor:before,h5>a.anchor:before,h6>a.anchor:before{content:"\0023";font-size:0.85em;display:block;padding-top:0.1em}#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#000;text-decoration:none}#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#262321}.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:'Open Sans', sans-serif;font-size:1rem}table.tableblock>caption.title{white-space:nowrap;overflow:visible;max-width:0;padding:0.6rem 0}table.tableblock #preamble>.sectionbody>.paragraph:first-of-type p{font-size:inherit}.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}.admonitionblock>table td.icon{text-align:center;vertical-align:top;padding-top:0.8em;width:80px}.admonitionblock>table td.icon img{max-width:initial}.admonitionblock>table td.icon .title{font-weight:bold;font-family:Montserrat, sans-serif;text-transform:uppercase}.admonitionblock>table td.content{padding-left:0em;padding-right:1.25em;border-left:1px solid #dce6e6}.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}.exampleblock>.content{border-style:solid;border-width:0;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#f1f1f1;border-radius:4px}.exampleblock>.content>:first-child{margin-top:0}.exampleblock>.content>:last-child{margin-bottom:0}.sidebarblock{border-style:solid;border-width:0;border-color:#dce6e6;margin-bottom:1.25em;padding:1.25em;background:#ebf2f2;border-radius:4px;overflow:scroll}.sidebarblock>:first-child{margin-top:0}.sidebarblock>:last-child{margin-bottom:0}.sidebarblock>.content>.title{color:#0b0a0a;margin-top:0;text-align:center}.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}.literalblock pre,.listingblock pre:not(.highlight),.listingblock pre[class="highlight"],.listingblock pre[class^="highlight "],.listingblock pre.CodeRay,.listingblock pre.prettyprint{background:#fff;border:1px solid #d9d9d9;border-radius:4px}.sidebarblock .literalblock pre,.sidebarblock .listingblock pre:not(.highlight),.sidebarblock .listingblock pre[class="highlight"],.sidebarblock .listingblock pre[class^="highlight "],.sidebarblock .listingblock pre.CodeRay,.sidebarblock .listingblock pre.prettyprint{background:#fff;border:1px solid #d9d9d9;color:#222}.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class],.listingblock pre:not(.highlight){padding:1em 1.5rem;font-size:0.8125em}.literalblock pre.nowrap,.literalblock pre[class].nowrap,.listingblock pre.nowrap,.listingblock pre[class].nowrap{overflow-x:auto}.literalblock.output pre{color:whitesmoke;background-color:rgba(0,0,0,0.9)}.listingblock{white-space:nowrap}.listingblock pre.highlightjs>code{padding:1em 1.5rem;border-radius:4px}.listingblock>.content{position:relative}.listingblock code[data-lang]:before{display:none;content:attr(data-lang);position:absolute;font-size:0.8em;font-weight:bold;top:0.425rem;right:0.5rem;line-height:1;text-transform:uppercase;color:#999}.listingblock code[data-lang]:before{display:block}.listingblock.terminal pre .command:before{content:attr(data-prompt);padding-right:0.5em;color:#999}.listingblock.terminal pre .command:not([data-prompt]):before{content:"$"}table.pyhltable{border-collapse:separate;border:0;margin-bottom:0;background:none}table.pyhltable td{vertical-align:top;padding-top:0;padding-bottom:0;line-height:1.45}table.pyhltable td.code{padding-left:.75em;padding-right:0}pre.pygments .lineno,table.pyhltable td:not(.code){color:#999;padding-left:0;padding-right:.5em;border-right:1px solid #dce6e6}pre.pygments .lineno{display:block;margin-right:.25em}table.pyhltable .linenodiv{background:none !important;padding-right:0 !important}.quoteblock{margin:0 1em 1.25em 1.5em;display:block;text-align:left;padding-left:20px}.quoteblock blockquote,.quoteblock blockquote p{color:rgba(0,0,0,0.85);line-height:1.75;letter-spacing:0}.quoteblock blockquote{margin:0;padding:0;border:0;position:relative}.quoteblock blockquote:before{content:"\201c";font-size:2.75em;font-weight:bold;line-height:0.6em;margin-left:0em;margin-right:1rem;margin-top:0.8rem;color:rgba(0,0,0,0.1);position:absolute;top:0;left:-30px}.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}.quoteblock .attribution{margin-right:0.5ex}.quoteblock .quoteblock{margin-left:0;margin-right:0;padding:0.5em 0;border-left:3px solid rgba(0,0,0,0.6)}.quoteblock .quoteblock blockquote{padding:0 0 0 0.75em}.quoteblock .quoteblock blockquote:before{display:none}.verseblock{margin:0 1em 1.25em 0;background-color:#f1f1f1;padding:1rem 1.4rem;border-radius:4px}.verseblock pre{font-family:Monaco, Menlo, Consolas, "Courier New", monospace;font-size:0.9rem;color:rgba(0,0,0,0.85);font-weight:300;text-rendering:optimizeLegibility}.verseblock pre strong{font-weight:400}.verseblock .attribution{margin-top:1.25rem;margin-left:0.5ex}.quoteblock .attribution,.verseblock .attribution{font-size:0.9375em;line-height:1.45;font-style:italic}.quoteblock .attribution br,.verseblock .attribution br{display:none}.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-0.025em;color:rgba(0,0,0,0.6)}.quoteblock.abstract{margin:0 0 1.25em 0;display:block}.quoteblock.abstract blockquote,.quoteblock.abstract blockquote p{text-align:left;word-spacing:0}.quoteblock.abstract blockquote:before,.quoteblock.abstract blockquote p:first-of-type:before{display:none}table.tableblock{max-width:100%;border-collapse:separate;overflow-x:scroll;display:block}table.tableblock td>.paragraph:last-child p>p:last-child,table.tableblock th>p:last-child,table.tableblock td>p:last-child{margin-bottom:0}table.tableblock,th.tableblock,td.tableblock{border:0 solid #d4dfdf}table.grid-all th.tableblock,table.grid-all td.tableblock{border-width:0 1px 1px 0}table.grid-all tfoot>tr>th.tableblock,table.grid-all tfoot>tr>td.tableblock{border-width:1px 1px 0 0}table.grid-cols th.tableblock,table.grid-cols td.tableblock{border-width:0 1px 0 0}table.grid-all *>tr>.tableblock:last-child,table.grid-cols *>tr>.tableblock:last-child{border-right-width:0}table.grid-rows th.tableblock,table.grid-rows td.tableblock{border-width:0 0 1px 0}table.grid-all tbody>tr:last-child>th.tableblock,table.grid-all tbody>tr:last-child>td.tableblock,table.grid-all thead:last-child>tr>th.tableblock,table.grid-rows tbody>tr:last-child>th.tableblock,table.grid-rows tbody>tr:last-child>td.tableblock,table.grid-rows thead:last-child>tr>th.tableblock{border-bottom-width:0}table.grid-rows tfoot>tr>th.tableblock,table.grid-rows tfoot>tr>td.tableblock{border-width:1px 0 0 0}table.frame-all{border-width:1px}table.frame-sides{border-width:0 1px}table.frame-topbot{border-width:1px 0}th.halign-left,td.halign-left{text-align:left}th.halign-right,td.halign-right{text-align:right}th.halign-center,td.halign-center{text-align:center}th.valign-top,td.valign-top{vertical-align:top}th.valign-bottom,td.valign-bottom{vertical-align:bottom}th.valign-middle,td.valign-middle{vertical-align:middle}table thead th,table tfoot th{font-weight:bold}tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7}tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:#34302d;font-weight:bold}p.tableblock{font-size:1em}td>div.verse{white-space:pre}ol{margin-left:1.75em}ul li ol{margin-left:1.5em}dl dd{margin-left:1.125em}dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:0.625em}ul.unstyled,ol.unnumbered,ul.checklist,ul.none{list-style-type:none}ul.unstyled,ol.unnumbered,ul.checklist{margin-left:0.625em}ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1em;font-size:0.85em}ul.checklist li>p:first-child>input[type="checkbox"]:first-child{width:1em;position:relative;top:1px}ul.inline{margin:0 auto 0.625em auto;margin-left:-1.375em;margin-right:0;padding:0;list-style:none;overflow:hidden}ul.inline>li{list-style:none;float:left;margin-left:1.375em;display:block}ul.inline>li>*{display:block}.unstyled dl dt{font-weight:normal;font-style:normal}ol.arabic{list-style-type:decimal}ol.decimal{list-style-type:decimal-leading-zero}ol.loweralpha{list-style-type:lower-alpha}ol.upperalpha{list-style-type:upper-alpha}ol.lowerroman{list-style-type:lower-roman}ol.upperroman{list-style-type:upper-roman}ol.lowergreek{list-style-type:lower-greek}.hdlist>table,.colist>table{border:0;background:none}.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}td.hdlist1,td.hdlist2{vertical-align:top;padding:0 0.625em}td.hdlist1{font-weight:bold;padding-bottom:1.25em}.literalblock+.colist,.listingblock+.colist{margin-top:-0.5em}.colist>table tr>td:first-of-type{padding:0 0.75em;line-height:1}.colist>table tr>td:first-of-type img{max-width:initial}.colist>table tr>td:last-of-type{padding:0.25em 0}.colist>table tr>td{white-space:pre-wrap}.thumb,.th{line-height:0;display:inline-block;border:solid 4px white;-webkit-box-shadow:0 0 0 1px #dddddd;box-shadow:0 0 0 1px #dddddd}.imageblock.left,.imageblock[style*="float: left"]{margin:0.25em 0.625em 1.25em 0}.imageblock.right,.imageblock[style*="float: right"]{margin:0.25em 0 1.25em 0.625em}.imageblock>.title{margin-bottom:0}.imageblock.thumb,.imageblock.th{border-width:6px}.imageblock.thumb>.title,.imageblock.th>.title{padding:0 0.125em}.image.left,.image.right{margin-top:0.25em;margin-bottom:0.25em;display:inline-block;line-height:0}.image.left{margin-right:0.625em}.image.right{margin-left:0.625em}a.image{text-decoration:none;display:inline-block}a.image object{pointer-events:none}sup.footnote,sup.footnoteref{font-size:0.875em;position:static;vertical-align:super}sup.footnote a,sup.footnoteref a{text-decoration:none}sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}#footnotes{padding-top:0.75em;padding-bottom:0.75em;margin-bottom:0.625em}#footnotes hr{width:20%;min-width:6.25em;margin:-0.25em 0 0.75em 0;border-width:1px 0 0 0}#footnotes .footnote{padding:0 0.375em 0 0.225em;line-height:1.3334;font-size:0.875em;margin-left:1.2em;text-indent:-1.05em;margin-bottom:0.2em}#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none}#footnotes .footnote:last-of-type{margin-bottom:0}#content #footnotes{margin-top:-0.625em;margin-bottom:0;padding:0.75em 0}.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}.gist .file-data>table td.line-data{width:99%}div.unbreakable{page-break-inside:avoid}.big{font-size:larger}.small{font-size:smaller}.underline{text-decoration:underline}.overline{text-decoration:overline}.line-through{text-decoration:line-through}.aqua{color:#00bfbf}.aqua-background{background-color:#00fafa}.black{color:black}.black-background{background-color:black}.blue{color:#0000bf}.blue-background{background-color:#0000fa}.fuchsia{color:#bf00bf}.fuchsia-background{background-color:#fa00fa}.gray{color:#606060}.gray-background{background-color:#7d7d7d}.green{color:#006000}.green-background{background-color:#007d00}.lime{color:#00bf00}.lime-background{background-color:#00fa00}.maroon{color:#600000}.maroon-background{background-color:#7d0000}.navy{color:#000060}.navy-background{background-color:#00007d}.olive{color:#606000}.olive-background{background-color:#7d7d00}.purple{color:#600060}.purple-background{background-color:#7d007d}.red{color:#bf0000}.red-background{background-color:#fa0000}.silver{color:#909090}.silver-background{background-color:#bcbcbc}.teal{color:#006060}.teal-background{background-color:#007d7d}.white{color:#bfbfbf}.white-background{background-color:#f5f9f9}.yellow{color:#bfbf00}.yellow-background{background-color:#fafa00}span.icon>.fa{cursor:default}.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;cursor:default}.admonitionblock td.icon .icon-note:before{content:"\f05a";color:#3f6a22}.admonitionblock td.icon .icon-tip:before{content:"\f0eb";color:#0077b9}.admonitionblock td.icon .icon-warning:before{content:"\f071";color:#d88400}.admonitionblock td.icon .icon-caution:before{content:"\f06d";color:#bf3400}.admonitionblock td.icon .icon-important:before{content:"\f06a";color:#bf0000}.conum[data-value]{display:inline-block;color:#000 !important;background-color:#ffe157;-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:0.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans", "DejaVu Sans", sans-serif;font-style:normal;font-weight:bold}.conum[data-value] *{color:#fff !important}.conum[data-value]+b{display:none}.conum[data-value]:after{content:attr(data-value)}pre .conum[data-value]{position:relative;top:0;color:#000 !important;background-color:#ffe157;font-size:12px}b.conum *{color:inherit !important}.conum:not([data-value]):empty{display:none}.admonitionblock{background-color:#ecf1e8;padding:0.8em 0;margin:30px 0;width:auto;border-radius:4px;overflow-x:auto}.admonitionblock.important{border-left:0px solid #e20000;background-color:#f9ebeb}.admonitionblock.warning{border-left:0px solid #d88400;background-color:#fff9e4}.admonitionblock.tip{border-left:0px solid #0077b9;background-color:#e9f1f6}.admonitionblock.caution{border-left:0px solid #e20000;background-color:#f9ebeb}.admonitionblock .exampleblock>.content{border:0 none;background-color:#fff}#toc a:hover{text-decoration:underline}.admonitionblock>table{margin-bottom:0}.admonitionblock>table td.content{border-left:none}@media print{#tocbot a.toc-link.node-name--H4{display:none}}.is-collapsible{max-height:1000px;overflow:hidden;transition:all 200ms ease-in-out}.is-collapsed{max-height:0}#index-link{display:none}ul li>p>a>code{color:#086dc3}ul li>p>a:hover>code{color:#086dc3}#content .listingblock .switch{border-style:none;display:inline-block;position:relative;bottom:0;margin-bottom:4px}#content .listingblock .switch--item:not(:first-child){border:2px solid #000}#content .listingblock .switch--item{padding:6px 12px;background-color:#fff;color:#000;display:inline-block;cursor:pointer;border:2px solid #000;margin-right:2px;border-radius:0}#content .listingblock .switch--item:hover{color:#086dc3}#content .listingblock .switch--item.selected{background-color:#000;color:#fff;border-color:#000}#content .listingblock .switch--item.selected:hover{color:#fff}#content .listingblock pre.highlightjs{padding:0}div.back-action,#toc.toc2 div.back-action{padding:0.8rem 0 0 5px}div.back-action a,#toc.toc2 div.back-action a{position:relative;display:inline-block;padding:0.6rem 1.2rem;padding-left:35px}div.back-action a span,#toc.toc2 div.back-action a span{position:absolute;left:5px;top:5px;display:block;color:#333;height:26px;width:26px;border-radius:13px}div.back-action a i,#toc.toc2 div.back-action a i{position:absolute;top:10px;left:5px}div.back-action a:hover span,#toc.toc2 div.back-action a:hover span{color:#000}#tocbot.desktop-toc{padding:.5rem}#header-spring{position:absolute;text-rendering:optimizeLegibility;top:0;left:0;right:0;height:80px;margin:0 1rem;padding:0 1rem;border-bottom:1px solid #dce6e6}#header-spring h1{margin:0;padding:0;font-size:22px;text-align:left;line-height:76px;padding-left:0.6rem}#header-spring h1 svg{width:240px}#header-spring h1 svg .st0{fill:#6bb536}#header-spring h1 svg .st2{fill:#444}body.book #header-spring{position:relative;top:auto;left:auto;right:auto;margin:0}body.book #header>h1:only-child{border:0 none;padding-bottom:1.2rem;font-size:1.8rem}body.book #header,body.book #content,body.book #footnotes,body.book #footer{margin:0 auto}body.toc2 #header-spring{position:absolute;left:0;right:0;top:0}body.toc2 #header>h1:only-child{font-size:2.2rem}body.toc2 #header,body.toc2 #content,body.toc2 #footnotes,body.toc2 #footer{margin:0 auto}body.toc2 #content{padding-top:2rem}#header,#content,#footnotes,#footer{width:100%;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:0.9375em;padding-right:0.9375em}#header:before,#header:after,#content:before,#content:after,#footnotes:before,#footnotes:after,#footer:before,#footer:after{content:" ";display:table}#header:after,#content:after,#footnotes:after,#footer:after{clear:both}#content{margin-top:1.25em}#content:before{content:none}#header{position:relative}#header>h1:first-child{margin-top:2.55rem;margin-bottom:0.5em;margin-bottom:0.7em;font-size:2rem}#header>h1:first-child+#toc{margin-top:8px;border-top:0 none}#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #ebf2f2;padding-bottom:8px}#header .details{line-height:1.45;color:#222;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap;background-color:#ebf2f2;padding:2rem 2.5rem}#header .details span:first-child{margin-left:-0.125em}#header .details span.email a{color:rgba(0,0,0,0.85)}#header .details br{display:none}#header .details br+span:before{content:"\00a0\2013\00a0"}#header .details br+span.author:before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,0.85)}#header .details br+span#revremark:before{content:"\00a0|\00a0"}#header #revnumber{text-transform:capitalize}#header #revnumber:after{content:"\00a0"}#content>h1:first-child:not([class]){color:rgba(0,0,0,0.85);border-bottom:1px solid #ebf2f2;padding-bottom:8px;margin-top:0;padding-top:1.5rem;margin-bottom:1.25rem}h1{font-size:2.2rem}h1,h2,h3,h4,h5,h6{font-weight:bold;font-family:Montserrat, Arial, Helvetica, sans-serif}h1:focus,h2:focus,h3:focus,h4:focus,h5:focus,h6:focus{box-shadow:none;outline:none}h2,h3,h4,h5,h6{padding:.8rem 0 .4rem}h1{font-size:1.75em}h2{font-size:1.6rem}h3{font-size:1.5rem}h4{font-size:1.4rem}h5{font-size:1.3rem}h6{font-size:1.2rem}pre.highlight{padding:20px;border:1px solid #d9d9d9;overflow-x:scroll;color:#222}pre.highlight code{color:#222}pre.highlight a,#toc.toc2 a{color:#000}pre.highlight ul.sectlevel1,#toc.toc2 ul.sectlevel1{padding-left:0.2rem}pre.highlight ul.sectlevel1 li,#toc.toc2 ul.sectlevel1 li{line-height:1.4rem}::selection{background-color:#d1ff79}.literalblock pre::selection,.listingblock pre[class="highlight"]::selection,.highlight::selection,pre::selection,.highlight code::selection,.highlight code span::selection{background:rgba(0,0,0,0.2) !important}body.book #header{margin-bottom:2rem}body.toc2 #header{margin-bottom:0}.desktop-toc{display:none}.admonitionblock td.icon{display:none}.admonitionblock>table td.content{padding-left:1.25em}@media only screen and (min-width: 768px){#toctitle{font-size:1.375em}.sect1{padding-bottom:1.25em}.mobile-toc{display:none}.desktop-toc{display:block}.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:0.90625em}.admonitionblock td.icon{display:table-cell}.admonitionblock>table td.content{padding-left:0}#header{position:relative;min-height:98px;padding-right:210px}#header::after{position:absolute;right:0;top:0;display:block;content:'';height:95px;width:203px;z-index:-1;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA38AAAGjCAIAAAATtjulAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyVpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ4IDc5LjE2NDAzNiwgMjAxOS8wOC8xMy0wMTowNjo1NyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIxLjEgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTMxQjVFRkQ2NTNCMTFFQTlENDc5OTVFRUMxRUY0NTEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTMxQjVFRkU2NTNCMTFFQTlENDc5OTVFRUMxRUY0NTEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1MzFCNUVGQjY1M0IxMUVBOUQ0Nzk5NUVFQzFFRjQ1MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1MzFCNUVGQzY1M0IxMUVBOUQ0Nzk5NUVFQzFFRjQ1MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvrI2PUAAD6SSURBVHja7N13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");background-repeat:no-repeat;background-size:203px 95px;background-position:right -10px}body.toc2{padding-right:0}body.toc2 #toc.toc2{position:absolute;margin-top:0 !important;width:15em;top:0;border-top-width:0 !important;border-bottom-width:0 !important;margin-left:-15.9375em;z-index:1000;padding:0 1em 1.25em 0em;overflow:auto}body.toc2 #toc.toc2 #toctitle{margin-top:0;margin-bottom:0.8rem;font-size:1.2em}body.toc2 #toc.toc2>ul{font-size:0.9em;margin-bottom:0}body.toc2 #toc.toc2 ul ul{margin-left:0;padding-left:1em}body.toc2 #toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:0.5em;margin-bottom:0.5em}body.toc2 #header,body.toc2 #content,body.toc2 #footnotes,body.toc2 #footer{padding-left:15.9375em;max-width:none}body.book #header-spring h1{max-width:1400px;margin:0 auto}body.book #header,body.book #content,body.book #footnotes,body.book #footer{max-width:1400px}body.is-position-fixed #toc.toc2{position:fixed;height:100%}h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}h1{font-size:1.75em}h2{font-size:1.6em}h3,#toctitle,.sidebarblock>.content>.title{font-size:1.5em}h4{font-size:1.4em}h5{font-size:1.2em}h6{font-size:1.2em}#tocbot a.toc-link.node-name--H1{font-style:italic}#tocbot ol{margin:0;padding:0}#tocbot ol li{list-style:none;padding:0 0;margin:0;display:block}#tocbot{z-index:999}#tocbot .toc-link{position:relative;display:block;z-index:999;padding:.4rem .6rem}#tocbot a.is-active-link{padding-right:3px;background:black;color:white}}@media only screen and (min-width: 768px){#tocbot>ul.toc-list{margin-bottom:0.5em;margin-left:0.125em}#tocbot ul.sectlevel0,#tocbot a.toc-link.node-name--H1+ul{padding-left:0}#tocbot a.toc-link{height:100%}.is-collapsible{max-height:3000px;overflow:hidden}.is-collapsed{max-height:0}}@media only screen and (min-width: 768px){body.toc2 #header,body.toc2 #content,body.toc2 #footer{background-repeat:repeat-y;background-position:14em 0;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAMAAAAoyzS7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQwIDc5LjE2MDQ1MSwgMjAxNy8wNS8wNi0wMTowODoyMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RDE0NUNENzNGMTVGMTFFODk5RjI5ODk3QURGRjcxMkEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RDE0NUNENzRGMTVGMTFFODk5RjI5ODk3QURGRjcxMkEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpEMTQ1Q0Q3MUYxNUYxMUU4OTlGMjk4OTdBREZGNzEyQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpEMTQ1Q0Q3MkYxNUYxMUU4OTlGMjk4OTdBREZGNzEyQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjmGxxYAAAAGUExURd3d2AAAAJlCnKAAAAAMSURBVHjaYmAACDAAAAIAAU9tWeEAAAAASUVORK5CYII=);background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyVpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ4IDc5LjE2NDAzNiwgMjAxOS8wOC8xMy0wMTowNjo1NyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIxLjEgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDMyRDZERkQ1MEE4MTFFQTlCNTJBOEQwQTM2ODZEQjgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDMyRDZERkU1MEE4MTFFQTlCNTJBOEQwQTM2ODZEQjgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0MzJENkRGQjUwQTgxMUVBOUI1MkE4RDBBMzY4NkRCOCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0MzJENkRGQzUwQTgxMUVBOUI1MkE4RDBBMzY4NkRCOCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjdyLKIAAAAPSURBVHjaYnj16RNAgAEABZgCz/xXiToAAAAASUVORK5CYII=");background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyVpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ4IDc5LjE2NDAzNiwgMjAxOS8wOC8xMy0wMTowNjo1NyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIxLjEgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODRBOEI2NTI1MEI1MTFFQTlCNTJBOEQwQTM2ODZEQjgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODRBOEI2NTM1MEI1MTFFQTlCNTJBOEQwQTM2ODZEQjgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0MzJENkRGRjUwQTgxMUVBOUI1MkE4RDBBMzY4NkRCOCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0MzJENkUwMDUwQTgxMUVBOUI1MkE4RDBBMzY4NkRCOCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pul87iAAAAAPSURBVHjaYrj17BlAgAEABUQCpxgONc4AAAAASUVORK5CYII=")}}@media only screen and (min-width: 1280px){body.toc2{padding-right:0}body.toc2 #toc.toc2{width:25em;left:auto;margin-left:-26.9375em}body.toc2 #toc.toc2 #toctitle{font-size:1.375em}body.toc2 #toc.toc2>ul{font-size:0.95em}body.toc2 #toc.toc2 ul ul{padding-left:1.25em}body.toc2 body.toc2.toc-right{padding-left:0;padding-right:20em}body.toc2 #header,body.toc2 #content,body.toc2 #footnotes,body.toc2 #footer{padding-left:26.9375em;max-width:1400px}body.toc2 #header-spring h1{margin:0 auto;max-width:1400px}.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:0.8125em}body.toc2 #header,body.toc2 #content,body.toc2 #footer{background-repeat:repeat-y;background-position:24em 0;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAMAAAAoyzS7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQwIDc5LjE2MDQ1MSwgMjAxNy8wNS8wNi0wMTowODoyMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RDE0NUNENzNGMTVGMTFFODk5RjI5ODk3QURGRjcxMkEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RDE0NUNENzRGMTVGMTFFODk5RjI5ODk3QURGRjcxMkEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpEMTQ1Q0Q3MUYxNUYxMUU4OTlGMjk4OTdBREZGNzEyQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpEMTQ1Q0Q3MkYxNUYxMUU4OTlGMjk4OTdBREZGNzEyQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjmGxxYAAAAGUExURd3d2AAAAJlCnKAAAAAMSURBVHjaYmAACDAAAAIAAU9tWeEAAAAASUVORK5CYII=);background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyVpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ4IDc5LjE2NDAzNiwgMjAxOS8wOC8xMy0wMTowNjo1NyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIxLjEgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDMyRDZERkQ1MEE4MTFFQTlCNTJBOEQwQTM2ODZEQjgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDMyRDZERkU1MEE4MTFFQTlCNTJBOEQwQTM2ODZEQjgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0MzJENkRGQjUwQTgxMUVBOUI1MkE4RDBBMzY4NkRCOCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0MzJENkRGQzUwQTgxMUVBOUI1MkE4RDBBMzY4NkRCOCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjdyLKIAAAAPSURBVHjaYnj16RNAgAEABZgCz/xXiToAAAAASUVORK5CYII=");background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyVpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ4IDc5LjE2NDAzNiwgMjAxOS8wOC8xMy0wMTowNjo1NyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIxLjEgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODRBOEI2NTI1MEI1MTFFQTlCNTJBOEQwQTM2ODZEQjgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODRBOEI2NTM1MEI1MTFFQTlCNTJBOEQwQTM2ODZEQjgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0MzJENkRGRjUwQTgxMUVBOUI1MkE4RDBBMzY4NkRCOCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0MzJENkUwMDUwQTgxMUVBOUI1MkE4RDBBMzY4NkRCOCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pul87iAAAAAPSURBVHjaYrj17BlAgAEABUQCpxgONc4AAAAASUVORK5CYII=")}#header{min-height:150px;padding-right:310px}#header::after{height:147px;width:305px;background-size:305px 147px}} diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/dlq.html b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/dlq.html new file mode 100644 index 00000000..6d825ae2 --- /dev/null +++ b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/dlq.html @@ -0,0 +1,268 @@ + + + + + + + +Dead-Letter Topic Processing + + + + + + + + + + +
+
+

Dead-Letter Topic Processing

+
+

Dead-Letter Topic Partition Selection

+
+

By default, records are published to the Dead-Letter topic using the same partition as the original record. +This means the Dead-Letter topic must have at least as many partitions as the original record.

+
+
+

To change this behavior, add a DlqPartitionFunction implementation as a @Bean to the application context. +Only one such bean can be present. +The function is provided with the consumer group, the failed ConsumerRecord and the exception. +For example, if you always want to route to partition 0, you might use:

+
+
+
+
+
+
@Bean
+public DlqPartitionFunction partitionFunction() {
+    return (group, record, ex) -> 0;
+}
+
+
+
+
+
+ + + + + +
+ + +If you set a consumer binding’s dlqPartitions property to 1 (and the binder’s minPartitionCount is equal to 1), there is no need to supply a DlqPartitionFunction; the framework will always use partition 0. +If you set a consumer binding’s dlqPartitions property to a value greater than 1 (or the binder’s minPartitionCount is greater than 1), you must provide a DlqPartitionFunction bean, even if the partition count is the same as the original topic’s. +
+
+
+
+

Handling Records in a Dead-Letter Topic

+
+

Because the framework cannot anticipate how users would want to dispose of dead-lettered messages, it does not provide any standard mechanism to handle them. +If the reason for the dead-lettering is transient, you may wish to route the messages back to the original topic. +However, if the problem is a permanent issue, that could cause an infinite loop. +The sample Spring Boot application within this topic is an example of how to route those messages back to the original topic, but it moves them to a “parking lot” topic after three attempts. +The application is another spring-cloud-stream application that reads from the dead-letter topic. +It terminates when no messages are received for 5 seconds.

+
+
+

The examples assume the original destination is so8400out and the consumer group is so8400.

+
+
+

There are a couple of strategies to consider:

+
+
+
    +
  • +

    Consider running the rerouting only when the main application is not running. +Otherwise, the retries for transient errors are used up very quickly.

    +
  • +
  • +

    Alternatively, use a two-stage approach: Use this application to route to a third topic and another to route from there back to the main topic.

    +
  • +
+
+
+

The following code listings show the sample application:

+
+
+
application.properties
+
+
spring.cloud.stream.bindings.input.group=so8400replay
+spring.cloud.stream.bindings.input.destination=error.so8400out.so8400
+
+spring.cloud.stream.bindings.output.destination=so8400out
+
+spring.cloud.stream.bindings.parkingLot.destination=so8400in.parkingLot
+
+spring.cloud.stream.kafka.binder.configuration.auto.offset.reset=earliest
+
+spring.cloud.stream.kafka.binder.headers=x-retries
+
+
+
+
Application
+
+
@SpringBootApplication
+@EnableBinding(TwoOutputProcessor.class)
+public class ReRouteDlqKApplication implements CommandLineRunner {
+
+    private static final String X_RETRIES_HEADER = "x-retries";
+
+    public static void main(String[] args) {
+        SpringApplication.run(ReRouteDlqKApplication.class, args).close();
+    }
+
+    private final AtomicInteger processed = new AtomicInteger();
+
+    @Autowired
+    private MessageChannel parkingLot;
+
+    @StreamListener(Processor.INPUT)
+    @SendTo(Processor.OUTPUT)
+    public Message<?> reRoute(Message<?> failed) {
+        processed.incrementAndGet();
+        Integer retries = failed.getHeaders().get(X_RETRIES_HEADER, Integer.class);
+        if (retries == null) {
+            System.out.println("First retry for " + failed);
+            return MessageBuilder.fromMessage(failed)
+                    .setHeader(X_RETRIES_HEADER, new Integer(1))
+                    .setHeader(BinderHeaders.PARTITION_OVERRIDE,
+                            failed.getHeaders().get(KafkaHeaders.RECEIVED_PARTITION_ID))
+                    .build();
+        }
+        else if (retries.intValue() < 3) {
+            System.out.println("Another retry for " + failed);
+            return MessageBuilder.fromMessage(failed)
+                    .setHeader(X_RETRIES_HEADER, new Integer(retries.intValue() + 1))
+                    .setHeader(BinderHeaders.PARTITION_OVERRIDE,
+                            failed.getHeaders().get(KafkaHeaders.RECEIVED_PARTITION_ID))
+                    .build();
+        }
+        else {
+            System.out.println("Retries exhausted for " + failed);
+            parkingLot.send(MessageBuilder.fromMessage(failed)
+                    .setHeader(BinderHeaders.PARTITION_OVERRIDE,
+                            failed.getHeaders().get(KafkaHeaders.RECEIVED_PARTITION_ID))
+                    .build());
+        }
+        return null;
+    }
+
+    @Override
+    public void run(String... args) throws Exception {
+        while (true) {
+            int count = this.processed.get();
+            Thread.sleep(5000);
+            if (count == this.processed.get()) {
+                System.out.println("Idle, terminating");
+                return;
+            }
+        }
+    }
+
+    public interface TwoOutputProcessor extends Processor {
+
+        @Output("parkingLot")
+        MessageChannel parkingLot();
+
+    }
+
+}
+
+
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/favicon.ico b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..1a4956e64705230122da8c19d762a7f8e6971533 GIT binary patch literal 111804 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 Pn5$LYDwgECM&W5?C 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 literal 0 HcmV?d00001 diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/images/kafka-streams-initializr.png b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/images/kafka-streams-initializr.png new file mode 100644 index 0000000000000000000000000000000000000000..3f1014895b2dba40b7cca1c373b8eb41ea2dc94c GIT binary patch literal 121574 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 literal 0 HcmV?d00001 diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/images/spring-initializr-kafka-streams.png b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/images/spring-initializr-kafka-streams.png new file mode 100644 index 0000000000000000000000000000000000000000..5d820fe553ccd74b0d710d64c06720526da02e21 GIT binary patch literal 239045 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

RR1bzn&soF7 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

CQm7+NJ(6u$msNM}%} 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

>{662B$sM*Jc=gTld2e^?&z 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

^=bgQQ8rU&C5>o9;i@c_pDP&+ku$~&j@GJ3ZS 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 literal 0 HcmV?d00001 diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/highlight/highlight.min.js b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/highlight/highlight.min.js new file mode 100644 index 00000000..dcbbb4c7 --- /dev/null +++ b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/highlight/highlight.min.js @@ -0,0 +1,2 @@ +/*! highlight.js v9.13.1 | BSD3 License | git.io/hljslicense */ +!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs}))}(function(e){function n(e){return e.replace(/&/g,"&").replace(//g,">")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0===t.index}function a(e){return k.test(e)}function i(e){var n,t,r,i,o=e.className+" ";if(o+=e.parentNode?e.parentNode.className:"",t=M.exec(o))return w(t[1])?t[1]:"no-highlight";for(o=o.split(/\s+/),n=0,r=o.length;r>n;n++)if(i=o[n],a(i)||w(i))return i}function o(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function c(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3===i.nodeType?a+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:a,node:i}));return a}(e,0),n}function u(e,r,a){function i(){return e.length&&r.length?e[0].offset!==r[0].offset?e[0].offset"}function c(e){l+=""}function u(e){("start"===e.event?o:c)(e.node)}for(var s=0,l="",f=[];e.length||r.length;){var g=i();if(l+=n(a.substring(s,g[0].offset)),s=g[0].offset,g===e){f.reverse().forEach(c);do u(g.splice(0,1)[0]),g=i();while(g===e&&g.length&&g[0].offset===s);f.reverse().forEach(o)}else"start"===g[0].event?f.push(g[0].node):f.pop(),u(g.splice(0,1)[0])}return l+n(a.substr(s))}function s(e){return e.v&&!e.cached_variants&&(e.cached_variants=e.v.map(function(n){return o(e,{v:null},n)})),e.cached_variants||e.eW&&[o(e)]||[e]}function l(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),"m"+(e.cI?"i":"")+(r?"g":""))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var o={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(" ").forEach(function(e){var t=e.split("|");o[t[0]]=[n,t[1]?Number(t[1]):1]})};"string"==typeof a.k?c("keyword",a.k):B(a.k).forEach(function(e){c(e,a.k[e])}),a.k=o}a.lR=t(a.l||/\w+/,!0),i&&(a.bK&&(a.b="\\b("+a.bK.split(" ").join("|")+")\\b"),a.b||(a.b=/\B|\b/),a.bR=t(a.b),a.endSameAsBegin&&(a.e=a.b),a.e||a.eW||(a.e=/\B|\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||"",a.eW&&i.tE&&(a.tE+=(a.e?"|":"")+i.tE)),a.i&&(a.iR=t(a.i)),null==a.r&&(a.r=1),a.c||(a.c=[]),a.c=Array.prototype.concat.apply([],a.c.map(function(e){return s("self"===e?a:e)})),a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var u=a.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=u.length?t(u.join("|"),!0):{exec:function(){return null}}}}r(e)}function f(e,t,a,i){function o(e){return new RegExp(e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")}function c(e,n){var t,a;for(t=0,a=n.c.length;a>t;t++)if(r(n.c[t].bR,e))return n.c[t].endSameAsBegin&&(n.c[t].eR=o(n.c[t].bR.exec(e)[0])),n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function s(e,n){return!a&&r(n.iR,e)}function p(e,n){var t=R.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function d(e,n,t,r){var a=r?"":j.classPrefix,i='',i+n+o}function h(){var e,t,r,a;if(!E.k)return n(k);for(a="",t=0,E.lR.lastIndex=0,r=E.lR.exec(k);r;)a+=n(k.substring(t,r.index)),e=p(E,r),e?(M+=e[1],a+=d(e[0],n(r[0]))):a+=n(r[0]),t=E.lR.lastIndex,r=E.lR.exec(k);return a+n(k.substr(t))}function b(){var e="string"==typeof E.sL;if(e&&!L[E.sL])return n(k);var t=e?f(E.sL,k,!0,B[E.sL]):g(k,E.sL.length?E.sL:void 0);return E.r>0&&(M+=t.r),e&&(B[E.sL]=t.top),d(t.language,t.value,!1,!0)}function v(){y+=null!=E.sL?b():h(),k=""}function m(e){y+=e.cN?d(e.cN,"",!0):"",E=Object.create(e,{parent:{value:E}})}function N(e,n){if(k+=e,null==n)return v(),0;var t=c(n,E);if(t)return t.skip?k+=n:(t.eB&&(k+=n),v(),t.rB||t.eB||(k=n)),m(t,n),t.rB?0:n.length;var r=u(E,n);if(r){var a=E;a.skip?k+=n:(a.rE||a.eE||(k+=n),v(),a.eE&&(k=n));do E.cN&&(y+=I),E.skip||E.sL||(M+=E.r),E=E.parent;while(E!==r.parent);return r.starts&&(r.endSameAsBegin&&(r.starts.eR=r.eR),m(r.starts,"")),a.rE?0:n.length}if(s(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"")+'"');return k+=n,n.length||1}var R=w(e);if(!R)throw new Error('Unknown language: "'+e+'"');l(R);var x,E=i||R,B={},y="";for(x=E;x!==R;x=x.parent)x.cN&&(y=d(x.cN,"",!0)+y);var k="",M=0;try{for(var C,A,S=0;;){if(E.t.lastIndex=S,C=E.t.exec(t),!C)break;A=N(t.substring(S,C.index),C[0]),S=C.index+A}for(N(t.substr(S)),x=E;x.parent;x=x.parent)x.cN&&(y+=I);return{r:M,value:y,language:e,top:E}}catch(O){if(O.message&&-1!==O.message.indexOf("Illegal"))return{r:0,value:n(t)};throw O}}function g(e,t){t=t||j.languages||B(L);var r={r:0,value:n(e)},a=r;return t.filter(w).filter(x).forEach(function(n){var t=f(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}),a.language&&(r.second_best=a),r}function p(e){return j.tabReplace||j.useBR?e.replace(C,function(e,n){return j.useBR&&"\n"===e?"
":j.tabReplace?n.replace(/\t/g,j.tabReplace):""}):e}function d(e,n,t){var r=n?y[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}function h(e){var n,t,r,o,s,l=i(e);a(l)||(j.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div"),n.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")):n=e,s=n.textContent,r=l?f(l,s,!0):g(s),t=c(n),t.length&&(o=document.createElementNS("http://www.w3.org/1999/xhtml","div"),o.innerHTML=r.value,r.value=u(t,c(o),s)),r.value=p(r.value),e.innerHTML=r.value,e.className=d(e.className,l,r.language),e.result={language:r.language,re:r.r},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.r}))}function b(e){j=o(j,e)}function v(){if(!v.called){v.called=!0;var e=document.querySelectorAll("pre code");E.forEach.call(e,h)}}function m(){addEventListener("DOMContentLoaded",v,!1),addEventListener("load",v,!1)}function N(n,t){var r=L[n]=t(e);r.aliases&&r.aliases.forEach(function(e){y[e]=n})}function R(){return B(L)}function w(e){return e=(e||"").toLowerCase(),L[e]||L[y[e]]}function x(e){var n=w(e);return n&&!n.disableAutodetect}var E=[],B=Object.keys,L={},y={},k=/^(no-?highlight|plain|text)$/i,M=/\blang(?:uage)?-([\w-]+)\b/i,C=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,I="
",j={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};return e.highlight=f,e.highlightAuto=g,e.fixMarkup=p,e.highlightBlock=h,e.configure=b,e.initHighlighting=v,e.initHighlightingOnLoad=m,e.registerLanguage=N,e.listLanguages=R,e.getLanguage=w,e.autoDetection=x,e.inherit=o,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},e.C=function(n,t,r){var a=e.inherit({cN:"comment",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),a},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e.METHOD_GUARD={b:"\\.\\s*"+e.UIR,r:0},e});hljs.registerLanguage("bash",function(e){var t={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},s={cN:"string",b:/"/,e:/"/,c:[e.BE,t,{cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]}]},a={cN:"string",b:/'/,e:/'/};return{aliases:["sh","zsh"],l:/\b-?[a-z\._]+\b/,k:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"meta",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:!0,c:[e.inherit(e.TM,{b:/\w[\w\d_]*/})],r:0},e.HCM,s,a,t]}});hljs.registerLanguage("dockerfile",function(e){return{aliases:["docker"],cI:!0,k:"from maintainer expose env arg user onbuild stopsignal",c:[e.HCM,e.ASM,e.QSM,e.NM,{bK:"run cmd entrypoint volume add copy workdir label healthcheck shell",starts:{e:/[^\\]\n/,sL:"bash"}}],i:")?[^\s\(]+(\s+[^\s\(]+)\s*=/,r:5,c:[{b:e.UIR+"\\s*\\(",rB:!0,r:0,c:[e.UTM]},{cN:"type",b://,k:"reified",r:0},{cN:"params",b:/\(/,e:/\)/,endsParent:!0,k:t,r:0,c:[{b:/:/,e:/[=,\/]/,eW:!0,c:[{cN:"type",b:e.UIR},e.CLCM,e.CBCM],r:0},e.CLCM,e.CBCM,s,l,c,e.CNM]},e.CBCM]},{cN:"class",bK:"class interface trait",e:/[:\{(]|$/,eE:!0,i:"extends implements",c:[{bK:"public protected internal private constructor"},e.UTM,{cN:"type",b://,eB:!0,eE:!0,r:0},{cN:"type",b:/[,:]\s*/,e:/[<\(,]|$/,eB:!0,rE:!0},s,l]},c,{cN:"meta",b:"^#!/usr/bin/env",e:"$",i:"\n"},o]}});hljs.registerLanguage("java",function(e){var a="[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*",t=a+"(<"+a+"(\\s*,\\s*"+a+")*>)?",r="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",s="\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",c={cN:"number",b:s,r:0};return{aliases:["jsp"],k:r,i:/<\/|#/,c:[e.C("/\\*\\*","\\*/",{r:0,c:[{b:/\w+@/,r:0},{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:"class",bK:"class interface",e:/[{;=]/,eE:!0,k:"class interface",i:/[:"\[\]]/,c:[{bK:"extends implements"},e.UTM]},{bK:"new throw return else",r:0},{cN:"function",b:"("+t+"\\s+)+"+e.UIR+"\\s*\\(",rB:!0,e:/[{;=]/,eE:!0,k:r,c:[{b:e.UIR+"\\s*\\(",rB:!0,r:0,c:[e.UTM]},{cN:"params",b:/\(/,e:/\)/,k:r,r:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},c,{cN:"meta",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("xml",function(s){var e="[A-Za-z0-9\\._:-]+",t={eW:!0,i:/`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist"],cI:!0,c:[{cN:"meta",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},s.C("",{r:10}),{b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"meta",b:/<\?xml/,e:/\?>/,r:10},{b:/<\?(php)?/,e:/\?>/,sL:"php",c:[{b:"/\\*",e:"\\*/",skip:!0},{b:'b"',e:'"',skip:!0},{b:"b'",e:"'",skip:!0},s.inherit(s.ASM,{i:null,cN:null,c:null,skip:!0}),s.inherit(s.QSM,{i:null,cN:null,c:null,skip:!0})]},{cN:"tag",b:"|$)",e:">",k:{name:"style"},c:[t],starts:{e:"",rE:!0,sL:["css","xml"]}},{cN:"tag",b:"|$)",e:">",k:{name:"script"},c:[t],starts:{e:"",rE:!0,sL:["actionscript","javascript","handlebars","xml"]}},{cN:"tag",b:"",c:[{cN:"name",b:/[^\/><\s]+/,r:0},t]}]}});hljs.registerLanguage("properties",function(r){var t="[ \\t\\f]*",e="[ \\t\\f]+",s="("+t+"[:=]"+t+"|"+e+")",n="([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",a="([^\\\\:= \\t\\f\\n]|\\\\.)+",c={e:s,r:0,starts:{cN:"string",e:/$/,r:0,c:[{b:"\\\\\\n"}]}};return{cI:!0,i:/\S/,c:[r.C("^\\s*[!#]","$"),{b:n+s,rB:!0,c:[{cN:"attr",b:n,endsParent:!0,r:0}],starts:c},{b:a+s,rB:!0,r:0,c:[{cN:"meta",b:a,endsParent:!0,r:0}],starts:c},{cN:"attr",r:0,b:a+t+"$"}]}});hljs.registerLanguage("diff",function(e){return{aliases:["patch"],c:[{cN:"meta",r:10,v:[{b:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{b:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{b:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{cN:"comment",v:[{b:/Index: /,e:/$/},{b:/={3,}/,e:/$/},{b:/^\-{3}/,e:/$/},{b:/^\*{3} /,e:/$/},{b:/^\+{3}/,e:/$/},{b:/\*{5}/,e:/\*{5}$/}]},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"addition",b:"^\\!",e:"$"}]}});hljs.registerLanguage("shell",function(s){return{aliases:["console"],c:[{cN:"meta",b:"^\\s{0,3}[\\w\\d\\[\\]()@-]*[>%$#]",starts:{e:"$",sL:"bash"}}]}});hljs.registerLanguage("asciidoc",function(e){return{aliases:["adoc"],c:[e.C("^/{4,}\\n","\\n/{4,}$",{r:10}),e.C("^//","$",{r:0}),{cN:"title",b:"^\\.\\w.*$"},{b:"^[=\\*]{4,}\\n",e:"\\n^[=\\*]{4,}$",r:10},{cN:"section",r:10,v:[{b:"^(={1,5}) .+?( \\1)?$"},{b:"^[^\\[\\]\\n]+?\\n[=\\-~\\^\\+]{2,}$"}]},{cN:"meta",b:"^:.+?:",e:"\\s",eE:!0,r:10},{cN:"meta",b:"^\\[.+?\\]$",r:0},{cN:"quote",b:"^_{4,}\\n",e:"\\n_{4,}$",r:10},{cN:"code",b:"^[\\-\\.]{4,}\\n",e:"\\n[\\-\\.]{4,}$",r:10},{b:"^\\+{4,}\\n",e:"\\n\\+{4,}$",c:[{b:"<",e:">",sL:"xml",r:0}],r:10},{cN:"bullet",b:"^(\\*+|\\-+|\\.+|[^\\n]+?::)\\s+"},{cN:"symbol",b:"^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\s+",r:10},{cN:"strong",b:"\\B\\*(?![\\*\\s])",e:"(\\n{2}|\\*)",c:[{b:"\\\\*\\w",r:0}]},{cN:"emphasis",b:"\\B'(?!['\\s])",e:"(\\n{2}|')",c:[{b:"\\\\'\\w",r:0}],r:0},{cN:"emphasis",b:"_(?![_\\s])",e:"(\\n{2}|_)",r:0},{cN:"string",v:[{b:"``.+?''"},{b:"`.+?'"}]},{cN:"code",b:"(`.+?`|\\+.+?\\+)",r:0},{cN:"code",b:"^[ \\t]",e:"$",r:0},{b:"^'{3,}[ \\t]*$",r:10},{b:"(link:)?(http|https|ftp|file|irc|image:?):\\S+\\[.*?\\]",rB:!0,c:[{b:"(link|image:?):",r:0},{cN:"link",b:"\\w",e:"[^\\[]+",r:0},{cN:"string",b:"\\[",e:"\\]",eB:!0,eE:!0,r:0}],r:10}]}});hljs.registerLanguage("aspectj",function(e){var t="false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else extends implements break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws privileged aspectOf adviceexecution proceed cflowbelow cflow initialization preinitialization staticinitialization withincode target within execution getWithinTypeName handler thisJoinPoint thisJoinPointStaticPart thisEnclosingJoinPointStaticPart declare parents warning error soft precedence thisAspectInstance",i="get set args call";return{k:t,i:/<\/|#/,c:[e.C("/\\*\\*","\\*/",{r:0,c:[{b:/\w+@/,r:0},{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:"class",bK:"aspect",e:/[{;=]/,eE:!0,i:/[:;"\[\]]/,c:[{bK:"extends implements pertypewithin perthis pertarget percflowbelow percflow issingleton"},e.UTM,{b:/\([^\)]*/,e:/[)]+/,k:t+" "+i,eE:!1}]},{cN:"class",bK:"class interface",e:/[{;=]/,eE:!0,r:0,k:"class interface",i:/[:"\[\]]/,c:[{bK:"extends implements"},e.UTM]},{bK:"pointcut after before around throwing returning",e:/[)]/,eE:!1,i:/["\[\]]/,c:[{b:e.UIR+"\\s*\\(",rB:!0,c:[e.UTM]}]},{b:/[:]/,rB:!0,e:/[{;]/,r:0,eE:!1,k:t,i:/["\[\]]/,c:[{b:e.UIR+"\\s*\\(",k:t+" "+i,r:0},e.QSM]},{bK:"new throw",r:0},{cN:"function",b:/\w+ +\w+(\.)?\w+\s*\([^\)]*\)\s*((throws)[\w\s,]+)?[\{;]/,rB:!0,e:/[{;=]/,k:t,eE:!0,c:[{b:e.UIR+"\\s*\\(",rB:!0,r:0,c:[e.UTM]},{cN:"params",b:/\(/,e:/\)/,r:0,k:t,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},e.CNM,{cN:"meta",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("gradle",function(e){return{cI:!0,k:{keyword:"task project allprojects subprojects artifacts buildscript configurations dependencies repositories sourceSets description delete from into include exclude source classpath destinationDir includes options sourceCompatibility targetCompatibility group flatDir doLast doFirst flatten todir fromdir ant def abstract break case catch continue default do else extends final finally for if implements instanceof native new private protected public return static switch synchronized throw throws transient try volatile while strictfp package import false null super this true antlrtask checkstyle codenarc copy boolean byte char class double float int interface long short void compile runTime file fileTree abs any append asList asWritable call collect compareTo count div dump each eachByte eachFile eachLine every find findAll flatten getAt getErr getIn getOut getText grep immutable inject inspect intersect invokeMethods isCase join leftShift minus multiply newInputStream newOutputStream newPrintWriter newReader newWriter next plus pop power previous print println push putAt read readBytes readLines reverse reverseEach round size sort splitEachLine step subMap times toInteger toList tokenize upto waitForOrKill withPrintWriter withReader withStream withWriter withWriterAppend write writeLine"},c:[e.CLCM,e.CBCM,e.ASM,e.QSM,e.NM,e.RM]}});hljs.registerLanguage("json",function(e){var i={literal:"true false null"},n=[e.QSM,e.CNM],r={e:",",eW:!0,eE:!0,c:n,k:i},t={b:"{",e:"}",c:[{cN:"attr",b:/"/,e:/"/,c:[e.BE],i:"\\n"},e.inherit(r,{b:/:/})],i:"\\S"},c={b:"\\[",e:"\\]",c:[e.inherit(r)],i:"\\S"};return n.splice(n.length,0,t,c),{c:n,k:i,i:"\\S"}});hljs.registerLanguage("sql",function(e){var t=e.C("--","$");return{cI:!0,i:/[<>{}*]/,c:[{bK:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment with",e:/;/,eW:!0,l:/[\w\.]+/,k:{keyword:"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias allocate allow alter always analyze ancillary and any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second section securefile security seed segment select self sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null unknown",built_in:"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp varchar varying void"},c:[{cN:"string",b:"'",e:"'",c:[e.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[e.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[e.BE]},e.CNM,e.CBCM,t,e.HCM]},e.CBCM,t,e.HCM]}});hljs.registerLanguage("go",function(e){var t={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",literal:"true false iota nil",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{aliases:["golang"],k:t,i:"",rB:!0,e:"\\s*=>",c:[{cN:"params",v:[{b:r},{b:/\(\s*\)/},{b:/\(/,e:/\)/,eB:!0,eE:!0,k:t,c:s}]}]},{b://,sL:"xml",c:[{b:/<\w+\s*\/>/,skip:!0},{b:/<\w+/,e:/(\/\w+|\w+\/)>/,skip:!0,c:[{b:/<\w+\s*\/>/,skip:!0},"self"]}]}],r:0},{cN:"function",bK:"function",e:/\{/,eE:!0,c:[e.inherit(e.TM,{b:r}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,c:s}],i:/\[|%/},{b:/\$[(.]/},e.METHOD_GUARD,{cN:"class",bK:"class",e:/[{;=]/,eE:!0,i:/[:"\[\]]/,c:[{bK:"extends"},e.UTM]},{bK:"constructor",e:/\{/,eE:!0}],i:/#(?!!)/}}); \ No newline at end of file diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/highlight/styles/atom-one-light.min.css b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/highlight/styles/atom-one-light.min.css new file mode 100644 index 00000000..d5bd1d2a --- /dev/null +++ b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/highlight/styles/atom-one-light.min.css @@ -0,0 +1,96 @@ +/* + +Atom One Light by Daniel Gamage +Original One Light Syntax theme from https://github.com/atom/one-light-syntax + +base: #fafafa +mono-1: #383a42 +mono-2: #686b77 +mono-3: #a0a1a7 +hue-1: #0184bb +hue-2: #4078f2 +hue-3: #a626a4 +hue-4: #50a14f +hue-5: #e45649 +hue-5-2: #c91243 +hue-6: #986801 +hue-6-2: #c18401 + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + color: #383a42; + background: #fafafa; +} + +.hljs-comment, +.hljs-quote { + color: #a0a1a7; + font-style: italic; +} + +.hljs-doctag, +.hljs-keyword, +.hljs-formula { + color: #a626a4; +} + +.hljs-section, +.hljs-name, +.hljs-selector-tag, +.hljs-deletion, +.hljs-subst { + color: #e45649; +} + +.hljs-literal { + color: #0184bb; +} + +.hljs-string, +.hljs-regexp, +.hljs-addition, +.hljs-attribute, +.hljs-meta-string { + color: #50a14f; +} + +.hljs-built_in, +.hljs-class .hljs-title { + color: #c18401; +} + +.hljs-attr, +.hljs-variable, +.hljs-template-variable, +.hljs-type, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-number { + color: #986801; +} + +.hljs-symbol, +.hljs-bullet, +.hljs-link, +.hljs-meta, +.hljs-selector-id, +.hljs-title { + color: #4078f2; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-link { + text-decoration: underline; +} diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/highlight/styles/github-gist.css b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/highlight/styles/github-gist.css new file mode 100644 index 00000000..2706084a --- /dev/null +++ b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/highlight/styles/github-gist.css @@ -0,0 +1,79 @@ +/** + * GitHub Gist Theme + * Author : Anthony Attard - https://github.com/AnthonyAttard + * Author : Louis Barranqueiro - https://github.com/LouisBarranqueiro + */ + +.hljs { + display: block; + background: white; + padding: 0.5em; + color: #333333; + overflow-x: auto; +} + +.hljs-comment, +.hljs-meta { + color: #969896; +} + +.hljs-variable, +.hljs-template-variable, +.hljs-strong, +.hljs-emphasis, +.hljs-quote { + color: #df5000; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-type { + color: #d73a49; +} + +.hljs-literal, +.hljs-symbol, +.hljs-bullet, +.hljs-attribute { + color: #0086b3; +} + +.hljs-section, +.hljs-name { + color: #63a35c; +} + +.hljs-tag { + color: #333333; +} + +.hljs-title, +.hljs-attr, +.hljs-selector-id, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #6f42c1; +} + +.hljs-addition { + color: #55a532; + background-color: #eaffea; +} + +.hljs-deletion { + color: #bd2c00; + background-color: #ffecec; +} + +.hljs-link { + text-decoration: underline; +} + +.hljs-number { + color: #005cc5; +} + +.hljs-string { + color: #032f62; +} diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/highlight/styles/github.min.css b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/highlight/styles/github.min.css new file mode 100644 index 00000000..791932b8 --- /dev/null +++ b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/highlight/styles/github.min.css @@ -0,0 +1,99 @@ +/* + +github.com style (c) Vasily Polovnyov + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + color: #333; + background: #f8f8f8; +} + +.hljs-comment, +.hljs-quote { + color: #998; + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-subst { + color: #333; + font-weight: bold; +} + +.hljs-number, +.hljs-literal, +.hljs-variable, +.hljs-template-variable, +.hljs-tag .hljs-attr { + color: #008080; +} + +.hljs-string, +.hljs-doctag { + color: #d14; +} + +.hljs-title, +.hljs-section, +.hljs-selector-id { + color: #900; + font-weight: bold; +} + +.hljs-subst { + font-weight: normal; +} + +.hljs-type, +.hljs-class .hljs-title { + color: #458; + font-weight: bold; +} + +.hljs-tag, +.hljs-name, +.hljs-attribute { + color: #000080; + font-weight: normal; +} + +.hljs-regexp, +.hljs-link { + color: #009926; +} + +.hljs-symbol, +.hljs-bullet { + color: #990073; +} + +.hljs-built_in, +.hljs-builtin-name { + color: #0086b3; +} + +.hljs-meta { + color: #999; + font-weight: bold; +} + +.hljs-deletion { + background: #fdd; +} + +.hljs-addition { + background: #dfd; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/highlight/styles/googlecode.css b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/highlight/styles/googlecode.css new file mode 100644 index 00000000..0cf18a04 --- /dev/null +++ b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/highlight/styles/googlecode.css @@ -0,0 +1,89 @@ +/* + +Google Code style (c) Aahan Krish + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: white; + color: black; +} + +.hljs-comment, +.hljs-quote { + color: #800; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-section, +.hljs-title, +.hljs-name { + color: #008; +} + +.hljs-variable, +.hljs-template-variable { + color: #660; +} + +.hljs-string, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-regexp { + color: #080; +} + +.hljs-literal, +.hljs-symbol, +.hljs-bullet, +.hljs-meta, +.hljs-number, +.hljs-link { + color: #066; +} + +.hljs-title, +.hljs-doctag, +.hljs-type, +.hljs-attr, +.hljs-built_in, +.hljs-builtin-name, +.hljs-params { + color: #606; +} + +.hljs-attribute, +.hljs-subst { + color: #000; +} + +.hljs-formula { + background-color: #eee; + font-style: italic; +} + +.hljs-selector-id, +.hljs-selector-class { + color: #9B703F +} + +.hljs-addition { + background-color: #baeeba; +} + +.hljs-deletion { + background-color: #ffc8bd; +} + +.hljs-doctag, +.hljs-strong { + font-weight: bold; +} + +.hljs-emphasis { + font-style: italic; +} diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/highlight/styles/solarized-light.min.css b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/highlight/styles/solarized-light.min.css new file mode 100644 index 00000000..fdcfcc72 --- /dev/null +++ b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/highlight/styles/solarized-light.min.css @@ -0,0 +1,84 @@ +/* + +Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #fdf6e3; + color: #657b83; +} + +.hljs-comment, +.hljs-quote { + color: #93a1a1; +} + +/* Solarized Green */ +.hljs-keyword, +.hljs-selector-tag, +.hljs-addition { + color: #859900; +} + +/* Solarized Cyan */ +.hljs-number, +.hljs-string, +.hljs-meta .hljs-meta-string, +.hljs-literal, +.hljs-doctag, +.hljs-regexp { + color: #2aa198; +} + +/* Solarized Blue */ +.hljs-title, +.hljs-section, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #268bd2; +} + +/* Solarized Yellow */ +.hljs-attribute, +.hljs-attr, +.hljs-variable, +.hljs-template-variable, +.hljs-class .hljs-title, +.hljs-type { + color: #b58900; +} + +/* Solarized Orange */ +.hljs-symbol, +.hljs-bullet, +.hljs-subst, +.hljs-meta, +.hljs-meta .hljs-keyword, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-link { + color: #cb4b16; +} + +/* Solarized Red */ +.hljs-built_in, +.hljs-deletion { + color: #dc322f; +} + +.hljs-formula { + background: #eee8d5; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/toc.js b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/toc.js new file mode 100644 index 00000000..0b6fcd65 --- /dev/null +++ b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/toc.js @@ -0,0 +1,80 @@ +var toctitle = document.getElementById('toctitle'); +var path = window.location.pathname; +if (toctitle != null) { + var oldtoc = toctitle.nextElementSibling; + var newtoc = document.createElement('div'); + newtoc.setAttribute('id', 'tocbot'); + newtoc.setAttribute('class', 'js-toc desktop-toc'); + oldtoc.setAttribute('class', 'mobile-toc'); + oldtoc.parentNode.appendChild(newtoc); + tocbot.init({ + contentSelector: '#content', + headingSelector: 'h1, h2, h3, h4, h5', + positionFixedSelector: 'body', + fixedSidebarOffset: 90, + smoothScroll: false + }); + if (!path.endsWith("index.html") && !path.endsWith("/")) { + var link = document.createElement("a"); + if (document.getElementById('index-link')) { + indexLinkElement = document.querySelector('#index-link > p > a'); + linkHref = indexLinkElement.getAttribute("href"); + link.setAttribute("href", linkHref); + } else { + link.setAttribute("href", "index.html"); + } + link.innerHTML = " Back to index"; + var block = document.createElement("div"); + block.setAttribute('class', 'back-action'); + block.appendChild(link); + var toc = document.getElementById('toc'); + var next = document.getElementById('toctitle').nextElementSibling; + toc.insertBefore(block, next); + } +} + +var headerHtml = '

'; + +var header = document.createElement("div"); +header.innerHTML = headerHtml; +document.body.insertBefore(header, document.body.firstChild); diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/tocbot/tocbot.css b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/tocbot/tocbot.css new file mode 100644 index 00000000..0632de23 --- /dev/null +++ b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/tocbot/tocbot.css @@ -0,0 +1 @@ +.toc{overflow-y:auto}.toc>.toc-list{overflow:hidden;position:relative}.toc>.toc-list li{list-style:none}.toc-list{margin:0;padding-left:10px}a.toc-link{color:currentColor;height:100%}.is-collapsible{max-height:1000px;overflow:hidden;transition:all 300ms ease-in-out}.is-collapsed{max-height:0}.is-position-fixed{position:fixed !important;top:0}.is-active-link{font-weight:700}.toc-link::before{background-color:#EEE;content:' ';display:inline-block;height:inherit;left:0;margin-top:-1px;position:absolute;width:2px}.is-active-link::before{background-color:#54BC4B} diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/tocbot/tocbot.min.js b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/tocbot/tocbot.min.js new file mode 100644 index 00000000..943d8fdb --- /dev/null +++ b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/js/tocbot/tocbot.min.js @@ -0,0 +1 @@ +!function(e){function t(o){if(n[o])return n[o].exports;var l=n[o]={i:o,l:!1,exports:{}};return e[o].call(l.exports,l,l.exports,t),l.l=!0,l.exports}var n={};t.m=e,t.c=n,t.d=function(e,n,o){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:o})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=0)}([function(e,t,n){(function(o){var l,i,s;!function(n,o){i=[],l=o(n),void 0!==(s="function"==typeof l?l.apply(t,i):l)&&(e.exports=s)}(void 0!==o?o:this.window||this.global,function(e){"use strict";function t(){for(var e={},t=0;te.fixedSidebarOffset?-1===n.className.indexOf(e.positionFixedClass)&&(n.className+=h+e.positionFixedClass):n.className=n.className.split(h+e.positionFixedClass).join("")}function s(t){var n=document.documentElement.scrollTop||f.scrollTop;e.positionFixedSelector&&i();var o,l=t;if(m&&null!==document.querySelector(e.tocSelector)&&l.length>0){d.call(l,function(t,i){if(t.offsetTop>n+e.headingsOffset+10){return o=l[0===i?i:i-1],!0}if(i===l.length-1)return o=l[l.length-1],!0});var s=document.querySelector(e.tocSelector).querySelectorAll("."+e.linkClass);u.call(s,function(t){t.className=t.className.split(h+e.activeLinkClass).join("")});var c=document.querySelector(e.tocSelector).querySelectorAll("."+e.listItemClass);u.call(c,function(t){t.className=t.className.split(h+e.activeListItemClass).join("")});var a=document.querySelector(e.tocSelector).querySelector("."+e.linkClass+".node-name--"+o.nodeName+'[href="#'+o.id+'"]');-1===a.className.indexOf(e.activeLinkClass)&&(a.className+=h+e.activeLinkClass);var p=a.parentNode;p&&-1===p.className.indexOf(e.activeListItemClass)&&(p.className+=h+e.activeListItemClass);var C=document.querySelector(e.tocSelector).querySelectorAll("."+e.listClass+"."+e.collapsibleClass);u.call(C,function(t){-1===t.className.indexOf(e.isCollapsedClass)&&(t.className+=h+e.isCollapsedClass)}),a.nextSibling&&-1!==a.nextSibling.className.indexOf(e.isCollapsedClass)&&(a.nextSibling.className=a.nextSibling.className.split(h+e.isCollapsedClass).join("")),r(a.parentNode.parentNode)}}function r(t){return-1!==t.className.indexOf(e.collapsibleClass)&&-1!==t.className.indexOf(e.isCollapsedClass)?(t.className=t.className.split(h+e.isCollapsedClass).join(""),r(t.parentNode.parentNode)):t}function c(t){var n=t.target||t.srcElement;"string"==typeof n.className&&-1!==n.className.indexOf(e.linkClass)&&(m=!1)}function a(){m=!0}var u=[].forEach,d=[].some,f=document.body,m=!0,h=" ";return{enableTocAnimation:a,disableTocAnimation:c,render:n,updateToc:s}}},function(e,t){e.exports=function(e){function t(e){return e[e.length-1]}function n(e){return+e.nodeName.split("H").join("")}function o(t){var o={id:t.id,children:[],nodeName:t.nodeName,headingLevel:n(t),textContent:t.textContent.trim()};return e.includeHtml&&(o.childNodes=t.childNodes),o}function l(l,i){for(var s=o(l),r=n(l),c=i,a=t(c),u=a?a.headingLevel:0,d=r-u;d>0;)a=t(c),a&&void 0!==a.children&&(c=a.children),d--;return r>=e.collapseDepth&&(s.isCollapsed=!0),c.push(s),c}function i(t,n){var o=n;e.ignoreSelector&&(o=n.split(",").map(function(t){return t.trim()+":not("+e.ignoreSelector+")"}));try{return document.querySelector(t).querySelectorAll(o)}catch(e){return console.warn("Element not found: "+t),null}}function s(e){return r.call(e,function(e,t){return l(o(t),e.nest),e},{nest:[]})}var r=[].reduce;return{nestHeadingsArray:s,selectHeadings:i}}},function(e,t){function n(e){function t(e){return"a"===e.tagName.toLowerCase()&&(e.hash.length>0||"#"===e.href.charAt(e.href.length-1))&&(n(e.href)===s||n(e.href)+"#"===s)}function n(e){return e.slice(0,e.lastIndexOf("#"))}function l(e){var t=document.getElementById(e.substring(1));t&&(/^(?:a|select|input|button|textarea)$/i.test(t.tagName)||(t.tabIndex=-1),t.focus())}!function(){document.documentElement.style}();var i=e.duration,s=location.hash?n(location.href):location.href;!function(){function n(n){!t(n.target)||n.target.className.indexOf("no-smooth-scroll")>-1||"#"===n.target.href.charAt(n.target.href.length-2)&&"!"===n.target.href.charAt(n.target.href.length-1)||-1===n.target.className.indexOf(e.linkClass)||o(n.target.hash,{duration:i,callback:function(){l(n.target.hash)}})}document.body.addEventListener("click",n,!1)}()}function o(e,t){function n(e){s=e-i,window.scrollTo(0,c.easing(s,r,u,d)),s + + + + + + +Kafka Streams Binder + + + + + + + + + + +
+
+

Kafka Streams Binder

+
+
+

Usage

+
+

For using the Kafka Streams binder, you just need to add it to your Spring Cloud Stream application, using the following maven coordinates:

+
+
+
+
<dependency>
+  <groupId>org.springframework.cloud</groupId>
+  <artifactId>spring-cloud-stream-binder-kafka-streams</artifactId>
+</dependency>
+
+
+
+

A quick way to bootstrap a new project for Kafka Streams binder is to use Spring Initializr and then select "Cloud Streams" and "Spring for Kafka Streams" as shown below

+
+
+
+spring initializr kafka streams +
+
+
+
+

Overview

+
+

Spring Cloud Stream includes a binder implementation designed explicitly for Apache Kafka Streams binding. +With this native integration, a Spring Cloud Stream "processor" application can directly use the +Apache Kafka Streams APIs in the core business logic.

+
+
+

Kafka Streams binder implementation builds on the foundations provided by the Spring for Apache Kafka project.

+
+
+

Kafka Streams binder provides binding capabilities for the three major types in Kafka Streams - KStream, KTable and GlobalKTable.

+
+
+

Kafka Streams applications typically follow a model in which the records are read from an inbound topic, apply business logic, and then write the transformed records to an outbound topic. +Alternatively, a Processor application with no outbound destination can be defined as well.

+
+
+

In the following sections, we are going to look at the details of Spring Cloud Stream’s integration with Kafka Streams.

+
+
+
+

Programming Model

+
+

When using the programming model provided by Kafka Streams binder, both the high-level Streams DSL and a mix of both the higher level and the lower level Processor-API can be used as options. +When mixing both higher and lower level API’s, this is usually achieved by invoking transform or process API methods on KStream.

+
+
+

Functional Style

+
+

Starting with Spring Cloud Stream 3.0.0, Kafka Streams binder allows the applications to be designed and developed using the functional programming style that is available in Java 8. +This means that the applications can be concisely represented as a lambda expression of types java.util.function.Function or java.util.function.Consumer.

+
+
+

Let’s take a very basic example.

+
+
+
+
@SpringBootApplication
+public class SimpleConsumerApplication {
+
+    @Bean
+    public java.util.function.Consumer<KStream<Object, String>> process() {
+
+        return input ->
+                input.foreach((key, value) -> {
+                    System.out.println("Key: " + key + " Value: " + value);
+                });
+    }
+}
+
+
+
+

Albeit simple, this is a complete standalone Spring Boot application that is leveraging Kafka Streams for stream processing. +This is a consumer application with no outbound binding and only a single inbound binding. +The application consumes data and it simply logs the information from the KStream key and value on the standard output. +The application contains the SpringBootApplication annotation and a method that is marked as Bean. +The bean method is of type java.util.function.Consumer which is parameterized with KStream. +Then in the implementation, we are returning a Consumer object that is essentially a lambda expression. +Inside the lambda expression, the code for processing the data is provided.

+
+
+

In this application, there is a single input binding that is of type KStream. +The binder creates this binding for the application with a name process-in-0, i.e. the name of the function bean name followed by a dash character (-) and the literal in followed by another dash and then the ordinal position of the parameter. +You use this binding name to set other properties such as destination. +For example, spring.cloud.stream.bindings.process-in-0.destination=my-topic.

+
+
+ + + + + +
+ + +If the destination property is not set on the binding, a topic is created with the same name as the binding (if there are sufficient privileges for the application) or that topic is expected to be already available. +
+
+
+

Once built as a uber-jar (e.g., kstream-consumer-app.jar), you can run the above example like the following.

+
+
+
+
java -jar kstream-consumer-app.jar --spring.cloud.stream.bindings.process-in-0.destination=my-topic
+
+
+
+

Here is another example, where it is a full processor with both input and output bindings. +This is the classic word-count example in which the application receives data from a topic, the number of occurrences for each word is then computed in a tumbling time-window.

+
+
+
+
@SpringBootApplication
+public class WordCountProcessorApplication {
+
+  @Bean
+  public Function<KStream<Object, String>, KStream<?, WordCount>> process() {
+
+    return input -> input
+                .flatMapValues(value -> Arrays.asList(value.toLowerCase().split("\\W+")))
+                .map((key, value) -> new KeyValue<>(value, value))
+                .groupByKey(Serialized.with(Serdes.String(), Serdes.String()))
+                .windowedBy(TimeWindows.of(5000))
+                .count(Materialized.as("word-counts-state-store"))
+                .toStream()
+                .map((key, value) -> new KeyValue<>(key.key(), new WordCount(key.key(), value,
+                        new Date(key.window().start()), new Date(key.window().end()))));
+  }
+
+	public static void main(String[] args) {
+		SpringApplication.run(WordCountProcessorApplication.class, args);
+	}
+}
+
+
+
+

Here again, this is a complete Spring Boot application. The difference here from the first application is that the bean method is of type java.util.function.Function. +The first parameterized type for the Function is for the input KStream and the second one is for the output. +In the method body, a lambda expression is provided that is of type Function and as implementation, the actual business logic is given. +Similar to the previously discussed Consumer based application, the input binding here is named as process-in-0 by default. For the output, the binding name is automatically also set to process-out-0.

+
+
+

Once built as an uber-jar (e.g., wordcount-processor.jar), you can run the above example like the following.

+
+
+
+
java -jar wordcount-processor.jar --spring.cloud.stream.bindings.process-in-0.destination=words --spring.cloud.stream.bindings.process-out-0.destination=counts
+
+
+
+

This application will consume messages from the Kafka topic words and the computed results are published to an output +topic counts.

+
+
+

Spring Cloud Stream will ensure that the messages from both the incoming and outgoing topics are automatically bound as +KStream objects. As a developer, you can exclusively focus on the business aspects of the code, i.e. writing the logic +required in the processor. Setting up Kafka Streams specific configuration required by the Kafka Streams infrastructure +is automatically handled by the framework.

+
+
+

The two examples we saw above have a single KStream input binding. In both cases, the bindings received the records from a single topic. +If you want to multiplex multiple topics into a single KStream binding, you can provide comma separated Kafka topics as destinations below.

+
+
+

spring.cloud.stream.bindings.process-in-0.destination=topic-1,topic-2,topic-3

+
+
+

In addition, you can also provide topic patterns as destinations if you want to match topics against a regular exression.

+
+
+

spring.cloud.stream.bindings.process-in-0.destination=input.*

+
+
+
Multiple Input Bindings
+
+

Many non-trivial Kafka Streams applications often consume data from more than one topic through multiple bindings. +For instance, one topic is consumed as Kstream and another as KTable or GlobalKTable. +There are many reasons why an application might want to receive data as a table type. +Think of a use-case where the underlying topic is populated through a change data capture (CDC) mechanism from a database or perhaps the application only cares about the latest updates for downstream processing. +If the application specifies that the data needs to be bound as KTable or GlobalKTable, then Kafka Streams binder will properly bind the destination to a KTable or GlobalKTable and make them available for the application to operate upon. +We will look at a few different scenarios how multiple input bindings are handled in the Kafka Streams binder.

+
+
+
BiFunction in Kafka Streams Binder
+
+

Here is an example where we have two inputs and an output. In this case, the application can leverage on java.util.function.BiFunction.

+
+
+
+
@Bean
+public BiFunction<KStream<String, Long>, KTable<String, String>, KStream<String, Long>> process() {
+    return (userClicksStream, userRegionsTable) -> (userClicksStream
+            .leftJoin(userRegionsTable, (clicks, region) -> new RegionWithClicks(region == null ?
+                            "UNKNOWN" : region, clicks),
+                    Joined.with(Serdes.String(), Serdes.Long(), null))
+            .map((user, regionWithClicks) -> new KeyValue<>(regionWithClicks.getRegion(),
+                    regionWithClicks.getClicks()))
+            .groupByKey(Grouped.with(Serdes.String(), Serdes.Long()))
+            .reduce(Long::sum)
+            .toStream());
+}
+
+
+
+

Here again, the basic theme is the same as in the previous examples, but here we have two inputs. +Java’s BiFunction support is used to bind the inputs to the desired destinations. +The default binding names generated by the binder for the inputs are process-in-0 and process-in-1 respectively. The default output binding is process-out-0. +In this example, the first parameter of BiFunction is bound as a KStream for the first input and the second parameter is bound as a KTable for the second input.

+
+
+
+
BiConsumer in Kafka Streams Binder
+
+

If there are two inputs, but no outputs, in that case we can use java.util.function.BiConsumer as shown below.

+
+
+
+
@Bean
+public BiConsumer<KStream<String, Long>, KTable<String, String>> process() {
+    return (userClicksStream, userRegionsTable) -> {}
+}
+
+
+
+
+
Beyond two inputs
+
+

What if you have more than two inputs? +There are situations in which you need more than two inputs. In that case, the binder allows you to chain partial functions. +In functional programming jargon, this technique is generally known as currying. +With the functional programming support added as part of Java 8, Java now enables you to write curried functions. +Spring Cloud Stream Kafka Streams binder can make use of this feature to enable multiple input bindings.

+
+
+

Let’s see an example.

+
+
+
+
@Bean
+public Function<KStream<Long, Order>,
+        Function<GlobalKTable<Long, Customer>,
+                Function<GlobalKTable<Long, Product>, KStream<Long, EnrichedOrder>>>> enrichOrder() {
+
+    return orders -> (
+              customers -> (
+                    products -> (
+                        orders.join(customers,
+                            (orderId, order) -> order.getCustomerId(),
+                                (order, customer) -> new CustomerOrder(customer, order))
+                                .join(products,
+                                        (orderId, customerOrder) -> customerOrder
+                                                .productId(),
+                                        (customerOrder, product) -> {
+                                            EnrichedOrder enrichedOrder = new EnrichedOrder();
+                                            enrichedOrder.setProduct(product);
+                                            enrichedOrder.setCustomer(customerOrder.customer);
+                                            enrichedOrder.setOrder(customerOrder.order);
+                                            return enrichedOrder;
+                                        })
+                        )
+                )
+    );
+}
+
+
+
+

Let’s look at the details of the binding model presented above. +In this model, we have 3 partially applied functions on the inbound. Let’s call them as f(x), f(y) and f(z). +If we expand these functions in the sense of true mathematical functions, it will look like these: f(x) → (fy) → f(z) → KStream<Long, EnrichedOrder>. +The x variable stands for KStream<Long, Order>, the y variable stands for GlobalKTable<Long, Customer> and the z variable stands for GlobalKTable<Long, Product>. +The first function f(x) has the first input binding of the application (KStream<Long, Order>) and its output is the function, f(y). +The function f(y) has the second input binding for the application (GlobalKTable<Long, Customer>) and its output is yet another function, f(z). +The input for the function f(z) is the third input for the application (GlobalKTable<Long, Product>) and its output is KStream<Long, EnrichedOrder> which is the final output binding for the application. +The input from the three partial functions which are KStream, GlobalKTable, GlobalKTable respectively are available for you in the method body for implementing the business logic as part of the lambda expression.

+
+
+

Input bindings are named as enrichOrder-in-0, enrichOrder-in-1 and enrichOrder-in-2 respectively. Output binding is named as enrichOrder-out-0.

+
+
+

With curried functions, you can virtually have any number of inputs. However, keep in mind that, anything more than a smaller number of inputs and partially applied functions for them as above in Java might lead to unreadable code. +Therefore if your Kafka Streams application requires more than a reasonably smaller number of input bindings and you want to use this functional model, then you may want to rethink your design and decompose the application appropriately.

+
+
+
+
+
Multiple Output Bindings
+
+

Kafka Streams allows to write outbound data into multiple topics. This feature is known as branching in Kafka Streams. +When using multiple output bindings, you need to provide an array of KStream (KStream[]) as the outbound return type.

+
+
+

Here is an example:

+
+
+
+
@Bean
+public Function<KStream<Object, String>, KStream<?, WordCount>[]> process() {
+
+    Predicate<Object, WordCount> isEnglish = (k, v) -> v.word.equals("english");
+    Predicate<Object, WordCount> isFrench = (k, v) -> v.word.equals("french");
+    Predicate<Object, WordCount> isSpanish = (k, v) -> v.word.equals("spanish");
+
+    return input -> input
+            .flatMapValues(value -> Arrays.asList(value.toLowerCase().split("\\W+")))
+            .groupBy((key, value) -> value)
+            .windowedBy(TimeWindows.of(5000))
+            .count(Materialized.as("WordCounts-branch"))
+            .toStream()
+            .map((key, value) -> new KeyValue<>(null, new WordCount(key.key(), value,
+                    new Date(key.window().start()), new Date(key.window().end()))))
+            .branch(isEnglish, isFrench, isSpanish);
+}
+
+
+
+

The programming model remains the same, however the outbound parameterized type is KStream[]. +The default output binding names are process-out-0, process-out-1, process-out-2 respectively. +The reason why the binder generates three output bindings is because it detects the length of the returned KStream array.

+
+
+
+
Summary of Function based Programming Styles for Kafka Streams
+
+

In summary, the following table shows the various options that can be used in the functional paradigm.

+
+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Number of InputsNumber of OutputsComponent to use

1

0

java.util.function.Consumer

2

0

java.util.function.BiConsumer

1

1..n

java.util.function.Function

2

1..n

java.util.function.BiFunction

>= 3

0..n

Use curried functions

+
+
    +
  • +

    In the case of more than one output in this table, the type simply becomes KStream[].

    +
  • +
+
+
+
+
+

Imperative programming model.

+
+

Although the functional programming model outlined above is the preferred approach, you can still use the classic StreamListener based approach if you prefer.

+
+
+

Here are some examples.

+
+
+

Following is the equivalent of the Word count example using StreamListener.

+
+
+
+
@SpringBootApplication
+@EnableBinding(KafkaStreamsProcessor.class)
+public class WordCountProcessorApplication {
+
+    @StreamListener("input")
+    @SendTo("output")
+    public KStream<?, WordCount> process(KStream<?, String> input) {
+        return input
+                .flatMapValues(value -> Arrays.asList(value.toLowerCase().split("\\W+")))
+                .groupBy((key, value) -> value)
+                .windowedBy(TimeWindows.of(5000))
+                .count(Materialized.as("WordCounts-multi"))
+                .toStream()
+                .map((key, value) -> new KeyValue<>(null, new WordCount(key.key(), value, new Date(key.window().start()), new Date(key.window().end()))));
+    }
+
+    public static void main(String[] args) {
+        SpringApplication.run(WordCountProcessorApplication.class, args);
+    }
+
+
+
+

As you can see, this is a bit more verbose since you need to provide EnableBinding and the other extra annotations like StreamListener and SendTo to make it a complete application. +EnableBinding is where you specify your binding interface that contains your bindings. +In this case, we are using the stock KafkaStreamsProcessor binding interface that has the following contracts.

+
+
+
+
public interface KafkaStreamsProcessor {
+
+	@Input("input")
+	KStream<?, ?> input();
+
+	@Output("output")
+	KStream<?, ?> output();
+
+}
+
+
+
+

Binder will create bindings for the input KStream and output KStream since you are using a binding interface that contains those declarations.

+
+
+

In addition to the obvious differences in the programming model offered in the functional style, one particular thing that needs to be mentioned here is that the binding names are what you specify in the binding interface. +For example, in the above application, since we are using KafkaStreamsProcessor, the binding names are input and output. +Binding properties need to use those names. For instance spring.cloud.stream.bindings.input.destination, spring.cloud.stream.bindings.output.destination etc. +Keep in mind that this is fundamentally different from the functional style since there the binder generates binding names for the application. +This is because the application does not provide any binding interfaces in the functional model using EnableBinding.

+
+
+

Here is another example of a sink where we have two inputs.

+
+
+
+
@EnableBinding(KStreamKTableBinding.class)
+.....
+.....
+@StreamListener
+public void process(@Input("inputStream") KStream<String, PlayEvent> playEvents,
+                    @Input("inputTable") KTable<Long, Song> songTable) {
+                    ....
+                    ....
+}
+
+interface KStreamKTableBinding {
+
+    @Input("inputStream")
+    KStream<?, ?> inputStream();
+
+    @Input("inputTable")
+    KTable<?, ?> inputTable();
+}
+
+
+
+

Following is the StreamListener equivalent of the same BiFunction based processor that we saw above.

+
+
+
+
@EnableBinding(KStreamKTableBinding.class)
+....
+....
+
+@StreamListener
+@SendTo("output")
+public KStream<String, Long> process(@Input("input") KStream<String, Long> userClicksStream,
+                                     @Input("inputTable") KTable<String, String> userRegionsTable) {
+....
+....
+}
+
+interface KStreamKTableBinding extends KafkaStreamsProcessor {
+
+    @Input("inputX")
+    KTable<?, ?> inputTable();
+}
+
+
+
+

Finally, here is the StreamListener equivalent of the application with three inputs and curried functions.

+
+
+
+
@EnableBinding(CustomGlobalKTableProcessor.class)
+...
+...
+    @StreamListener
+    @SendTo("output")
+    public KStream<Long, EnrichedOrder> process(
+            @Input("input-1") KStream<Long, Order> ordersStream,
+            @Input("input-"2) GlobalKTable<Long, Customer> customers,
+            @Input("input-3") GlobalKTable<Long, Product> products) {
+
+        KStream<Long, CustomerOrder> customerOrdersStream = ordersStream.join(
+                customers, (orderId, order) -> order.getCustomerId(),
+                (order, customer) -> new CustomerOrder(customer, order));
+
+        return customerOrdersStream.join(products,
+                (orderId, customerOrder) -> customerOrder.productId(),
+                (customerOrder, product) -> {
+                    EnrichedOrder enrichedOrder = new EnrichedOrder();
+                    enrichedOrder.setProduct(product);
+                    enrichedOrder.setCustomer(customerOrder.customer);
+                    enrichedOrder.setOrder(customerOrder.order);
+                    return enrichedOrder;
+                });
+        }
+
+    interface CustomGlobalKTableProcessor {
+
+            @Input("input-1")
+            KStream<?, ?> input1();
+
+            @Input("input-2")
+            GlobalKTable<?, ?> input2();
+
+            @Input("input-3")
+            GlobalKTable<?, ?> input3();
+
+            @Output("output")
+            KStream<?, ?> output();
+    }
+
+
+
+

You might notice that the above two examples are even more verbose since in addition to provide EnableBinding, you also need to write your own custom binding interface as well. +Using the functional model, you can avoid all those ceremonial details.

+
+
+

Before we move on from looking at the general programming model offered by Kafka Streams binder, here is the StreamListener version of multiple output bindings.

+
+
+
+
EnableBinding(KStreamProcessorWithBranches.class)
+public static class WordCountProcessorApplication {
+
+    @Autowired
+    private TimeWindows timeWindows;
+
+    @StreamListener("input")
+    @SendTo({"output1","output2","output3"})
+    public KStream<?, WordCount>[] process(KStream<Object, String> input) {
+
+			Predicate<Object, WordCount> isEnglish = (k, v) -> v.word.equals("english");
+			Predicate<Object, WordCount> isFrench =  (k, v) -> v.word.equals("french");
+			Predicate<Object, WordCount> isSpanish = (k, v) -> v.word.equals("spanish");
+
+			return input
+					.flatMapValues(value -> Arrays.asList(value.toLowerCase().split("\\W+")))
+					.groupBy((key, value) -> value)
+					.windowedBy(timeWindows)
+					.count(Materialized.as("WordCounts-1"))
+					.toStream()
+					.map((key, value) -> new KeyValue<>(null, new WordCount(key.key(), value, new Date(key.window().start()), new Date(key.window().end()))))
+					.branch(isEnglish, isFrench, isSpanish);
+    }
+
+    interface KStreamProcessorWithBranches {
+
+    		@Input("input")
+    		KStream<?, ?> input();
+
+    		@Output("output1")
+    		KStream<?, ?> output1();
+
+    		@Output("output2")
+    		KStream<?, ?> output2();
+
+    		@Output("output3")
+    		KStream<?, ?> output3();
+    	}
+}
+
+
+
+

To recap, we have reviewed the various programming model choices when using the Kafka Streams binder.

+
+
+

The binder provides binding capabilities for KStream, KTable and GlobalKTable on the input. +KTable and GlobalKTable bindings are only available on the input. +Binder supports both input and output bindings for KStream.

+
+
+

The upshot of the programming model of Kafka Streams binder is that the binder provides you the flexibility of going with a fully functional programming model or using the StreamListener based imperative approach.

+
+
+
+
+

Ancillaries to the programming model

+
+

Multiple Kafka Streams processors within a single application

+
+

Binder allows to have multiple Kafka Streams processors within a single Spring Cloud Stream application. +You can have an application as below.

+
+
+
+
@Bean
+public java.util.function.Function<KStream<Object, String>, KStream<Object, String>> process() {
+   ...
+}
+
+@Bean
+public java.util.function.Consumer<KStream<Object, String>> anotherProcess() {
+  ...
+}
+
+@Bean
+public java.util.function.BiFunction<KStream<Object, String>, KTable<Integer, String>, KStream<Object, String>> yetAnotherProcess() {
+   ...
+}
+
+
+
+

In this case, the binder will create 3 separate Kafka Streams objects with different application ID’s (more on this below). +However, if you have more than one processor in the application, you have to tell Spring Cloud Stream, which functions need to be activated. +Here is how you activate the functions.

+
+
+

spring.cloud.stream.function.definition: process;anotherProcess;yetAnotherProcess

+
+
+

If you want certain functions to be not activated right away, you can remove that from this list.

+
+
+

This is also true when you have a single Kafka Streams processor and other types of Function beans in the same application that is handled through a different binder (for e.g., a function bean that is based on the regular Kafka Message Channel binder)

+
+
+
+

Kafka Streams Application ID

+
+

Application id is a mandatory property that you need to provide for a Kafka Streams application. +Spring Cloud Stream Kafka Streams binder allows you to configure this application id in multiple ways.

+
+
+

If you only have one single processor or StreamListener in the application, then you can set this at the binder level using the following property:

+
+
+

spring.cloud.stream.kafka.streams.binder.applicationId.

+
+
+

As a convenience, if you only have a single processor, you can also use spring.application.name as the property to delegate the application id.

+
+
+

If you have multiple Kafka Streams processors in the application, then you need to set the application id per processor. +In the case of the functional model, you can attach it to each function as a property.

+
+
+

For e.g. imagine that you have the following functions.

+
+
+
+
@Bean
+public java.util.function.Consumer<KStream<Object, String>> process() {
+   ...
+}
+
+
+
+

and

+
+
+
+
@Bean
+public java.util.function.Consumer<KStream<Object, String>> anotherProcess() {
+  ...
+}
+
+
+
+

Then you can set the application id for each, using the following binder level properties.

+
+
+

spring.cloud.stream.kafka.streams.binder.functions.process.applicationId

+
+
+

and

+
+
+

spring.cloud.stream.kafka.streams.binder.functions.anotherProcess.applicationId

+
+
+

In the case of StreamListener, you need to set this on the first input binding on the processor.

+
+
+

For e.g. imagine that you have the following two StreamListener based processors.

+
+
+
+
@StreamListener
+@SendTo("output")
+public KStream<String, String> process(@Input("input") <KStream<Object, String>> input) {
+   ...
+}
+
+@StreamListener
+@SendTo("anotherOutput")
+public KStream<String, String> anotherProcess(@Input("anotherInput") <KStream<Object, String>> input) {
+   ...
+}
+
+
+
+

Then you must set the application id for this using the following binding property.

+
+
+

spring.cloud.stream.kafka.streams.bindings.input.consumer.applicationId

+
+
+

and

+
+
+

spring.cloud.stream.kafka.streams.bindings.anotherInput.consumer.applicationId

+
+
+

For function based model also, this approach of setting application id at the binding level will work. +However, setting per function at the binder level as we have seen above is much easier if you are using the functional model.

+
+
+

For production deployments, it is highly recommended to explicitly specify the application ID through configuration. +This is especially going to be very critical if you are auto scaling your application in which case you need to make sure that you are deploying each instance with the same application ID.

+
+
+

If the application does not provide an application ID, then in that case the binder will auto generate a static application ID for you. +This is convenient in development scenarios as it avoids the need for explicitly providing the application ID. +The generated application ID in this manner will be static over application restarts. +In the case of functional model, the generated application ID will be the function bean name followed by the literal applicationID, for e.g process-applicationID if process if the function bean name. +In the case of StreamListener, instead of using the function bean name, the generated application ID will be use the containing class name followed by the method name followed by the literal applicationId.

+
+
+
Summary of setting Application ID
+
+
    +
  • +

    By default, binder will auto generate the application ID per function or StreamListener methods.

    +
  • +
  • +

    If you have a single processor, then you can use spring.kafka.streams.applicationId, spring.application.name or spring.cloud.stream.kafka.streams.binder.applicationId.

    +
  • +
  • +

    If you have multiple processors, then application ID can be set per function using the property - spring.cloud.stream.kafka.streams.binder.functions.<function-name>.applicationId. +In the case of StreamListener, this can be done using spring.cloud.stream.kafka.streams.bindings.input.applicationId, assuming that the input binding name is input.

    +
  • +
+
+
+
+
+

Overriding the default binding names generated by the binder with the functional style

+
+

By default, the binder uses the strategy discussed above to generate the binding name when using the functional style, i.e. <function-bean-name>-<in>|<out>-[0..n], for e.g. process-in-0, process-out-0 etc. +If you want to override those binding names, you can do that by specifying the following properties.

+
+
+

spring.cloud.stream.function.bindings.<default binding name>. Default binding name is the original binding name generated by the binder.

+
+
+

For e.g. lets say, you have this function.

+
+
+
+
@Bean
+public BiFunction<KStream<String, Long>, KTable<String, String>, KStream<String, Long>> process() {
+...
+}
+
+
+
+

Binder will generate bindings with names, process-in-0, process-in-1 and process-out-0. +Now, if you want to change them to something else completely, maybe more domain specific binding names, then you can do so as below.

+
+
+

springc.cloud.stream.function.bindings.process-in-0=users

+
+
+

springc.cloud.stream.function.bindings.process-in-0=regions

+
+
+

and

+
+
+

spring.cloud.stream.function.bindings.process-out-0=clicks

+
+
+

After that, you must set all the binding level properties on these new binding names.

+
+
+

Please keep in mind that with the functional programming model described above, adhering to the default binding names make sense in most situations. +The only reason you may still want to do this overriding is when you have larger number of configuration properties and you want to map the bindings to something more domain friendly.

+
+
+
+

Setting up bootstrap server configuration

+
+

When running Kafka Streams applications, you must provide the Kafka broker server information. +If you don’t provide this information, the binder expects that you are running the broker at the default localhost:9092. +If that is not the case, then you need to override that. There are a couple of ways to do that.

+
+
+
    +
  • +

    Using the boot property - spring.kafka.bootstrapServers

    +
  • +
  • +

    Binder level property - spring.cloud.stream.kafka.streams.binder.brokers

    +
  • +
+
+
+

When it comes to the binder level property, it doesn’t matter if you use the broker property provided through the regular Kafka binder - spring.cloud.stream.kafka.binder.brokers. +Kafka Streams binder will first check if Kafka Streams binder specific broker property is set (spring.cloud.stream.kafka.streams.binder.brokers) and if not found, it looks for spring.cloud.stream.kafka.binder.brokers.

+
+
+
+
+

Record serialization and deserialization

+
+

Kafka Streams binder allows you to serialize and deserialize records in two ways. +One is the native serialization and deserialization facilities provided by Kafka and the other one is the message conversion capabilities of Spring Cloud Stream framework. +Lets look at some details.

+
+
+

Inbound deserialization

+
+

Keys are always deserialized using native Serdes.

+
+
+

For values, by default, deserialization on the inbound is natively performed by Kafka. +Please note that this is a major change on default behavior from previous versions of Kafka Streams binder where the deserialization was done by the framework.

+
+
+

Kafka Streams binder will try to infer matching Serde types by looking at the type signature of java.util.function.Function|Consumer or StreamListener. +Here is the order that it matches the Serdes.

+
+
+
    +
  • +

    If the application provides a bean of type Serde and if the return type is parameterized with the actual type of the incoming key or value type, then it will use that Serde for inbound deserialization. +For e.g. if you have the following in the application, the binder detects that the incoming value type for the KStream matches with a type that is parameterized on a Serde bean. +It will use that for inbound deserialization.

    +
  • +
+
+
+
+
@Bean
+public Serde<Foo() customSerde{
+ ...
+}
+
+@Bean
+public Function<KStream<String, Foo>, KStream<String, Foo>> process() {
+}
+
+
+
+
    +
  • +

    Next, it looks at the types and see if they are one of the types exposed by Kafka Streams. If so, use them. +Here are the Serde types that the binder will try to match from Kafka Streams.

    +
    +
    +
    Integer, Long, Short, Double, Float, byte[], UUID and String.
    +
    +
    +
  • +
  • +

    If none of the Serdes provided by Kafka Streams don’t match the types, then it will use JsonSerde provided by Spring Kafka. In this case, the binder assumes that the types are JSON friendly. +This is useful if you have multiple value objects as inputs since the binder will internally infer them to correct Java types. +Before falling back to the JsonSerde though, the binder checks at the default Serde`s set in the Kafka Streams configuration to see if it is a `Serde that it can match with the incoming KStream’s types.

    +
  • +
+
+
+

If none of the above strategies worked, then the applications must provide the `Serde`s through configuration. +This can be configured in two ways - binding or default.

+
+
+

First the binder will look if a Serde is provided at the binding level. +For e.g. if you have the following processor,

+
+
+
+
@Bean
+public BiFunction<KStream<CustomKey, AvroIn1>, KTable<CustomKey, AvroIn2>, KStream<CustomKey, AvroOutput>> process() {...}
+
+
+
+

then, you can provide a binding level Serde using the following:

+
+
+
+
spring.cloud.stream.kafka.streams.bindings.process-in-0.consumer.keySerde=CustomKeySerde
+spring.cloud.stream.kafka.streams.bindings.process-in-0.consumer.valueSerde=io.confluent.kafka.streams.serdes.avro.SpecificAvroSerde
+
+spring.cloud.stream.kafka.streams.bindings.process-in-1.consumer.keySerde=CustomKeySerde
+spring.cloud.stream.kafka.streams.bindings.process-in-1.consumer.valueSerde=io.confluent.kafka.streams.serdes.avro.SpecificAvroSerde
+
+
+
+ + + + + +
+ + +If you provide Serde as abover per input binding, then that will takes higher precedence and the binder will stay away from any Serde inference. +
+
+
+

If you want the default key/value Serdes to be used for inbound deserialization, you can do so at the binder level.

+
+
+
+
spring.cloud.stream.kafka.streams.binder.configuration.default.key.serde
+spring.cloud.stream.kafka.streams.binder.configuration.default.value.serde
+
+
+
+

If you don’t want the native decoding provided by Kafka, you can rely on the message conversion features that Spring Cloud Stream provides. +Since native decoding is the default, in order to let Spring Cloud Stream deserialize the inbound value object, you need to explicitly disable native decoding.

+
+
+

For e.g. if you have the same BiFunction processor as above, then spring.cloud.stream.bindings.process-in-0.consumer.nativeDecoding: false +You need to disable native decoding for all the inputs individually. Otherwise, native decoding will still be applied for those you do not disable.

+
+
+

By default, Spring Cloud Stream will use application/json as the content type and use an appropriate json message converter. +You can use custom message converters by using the following property and an appropriate MessageConverter bean.

+
+
+
+
spring.cloud.stream.bindings.process-in-0.contentType
+
+
+
+
+

Outbound serialization

+
+

Outbound serialization pretty much follows the same rules as above for inbound deserialization. +As with the inbound deserialization, one major change from the previous versions of Spring Cloud Stream is that the serialization on the outbound is handled by Kafka natively. +Before 3.0 versions of the binder, this was done by the framework itself.

+
+
+

Keys on the outbound are always serialized by Kafka using a matching Serde that is inferred by the binder. +If it can’t infer the type of the key, then that needs to be specified using configuration.

+
+
+

Value serdes are inferred using the same rules used for inbound deserialization. +First it matches to see if the outbound type is from a provided bean in the application. +If not, it checks to see if it matches with a Serde exposed by Kafka such as - Integer, Long, Short, Double, Float, byte[], UUID and String. +If that doesnt’t work, then it falls back to JsonSerde provided by the Spring Kafka project, but first look at the default Serde configuration to see if there is a match. +Keep in mind that all these happen transparently to the application. +If none of these work, then the user has to provide the Serde to use by configuration.

+
+
+

Lets say you are using the same BiFunction processor as above. Then you can configure outbound key/value Serdes as following.

+
+
+
+
spring.cloud.stream.kafka.streams.bindings.process-out-0.producer.keySerde=CustomKeySerde
+spring.cloud.stream.kafka.streams.bindings.process-out-0.producer.valueSerde=io.confluent.kafka.streams.serdes.avro.SpecificAvroSerde
+
+
+
+

If Serde inference fails, and no binding level Serdes are provided, then the binder falls back to the JsonSerde, but look at the default Serdes for a match.

+
+
+

Default serdes are configured in the same way as above where it is described under deserialization.

+
+
+

spring.cloud.stream.kafka.streams.binder.configuration.default.key.serde +spring.cloud.stream.kafka.streams.binder.configuration.default.value.serde

+
+
+

If your application uses the branching feature and has multiple output bindings, then these have to be configured per binding. +Once again, if the binder is capable of inferring the Serde types, you don’t need to do this configuration.

+
+
+

If you don’t want the native encoding provided by Kafka, but want to use the framework provided message conversion, then you need to explicitly disable native encoding since since native encoding is the default. +For e.g. if you have the same BiFunction processor as above, then spring.cloud.stream.bindings.process-out-0.producer.nativeEncoding: false +You need to disable native encoding for all the output individually in the case of branching. Otherwise, native encoding will still be applied for those you don’t disable.

+
+
+

When conversion is done by Spring Cloud Stream, by default, it will use application/json as the content type and use an appropriate json message converter. +You can use custom message converters by using the following property and a corresponding MessageConverter bean.

+
+
+
+
spring.cloud.stream.bindings.process-out-0.contentType
+
+
+
+

When native encoding/decoding is disabled, binder will not do any inference as in the case of native Serdes. +Applications need to explicitly provide all the configuration options. +For that reason, it is generally advised to stay with the default options for de/serialization and stick with native de/serialization provided by Kafka Streams when you write Spring Cloud Stream Kafka Streams applications. +The one scenario in which you must use message conversion capabilities provided by the framework is when your upstream producer is using a specific serialization strategy. +In that case, you want to use a matching deserialization strategy as native mechanisms may fail. +When relying on the default Serde mechanism, the applications must ensure that the binder has a way forward with correctly map the inbound and outbound with a proper Serde, as otherwise things might fail.

+
+
+

It is worth to mention that the data de/serialization approaches outlined above are only applicable on the edges of your processors, i.e. - inbound and outbound. +Your business logic might still need to call Kafka Streams API’s that explicitly need Serde objects. +Those are still the responsibility of the application and must be handled accordingly by the developer.

+
+
+
+
+

Error Handling

+
+

Apache Kafka Streams provides the capability for natively handling exceptions from deserialization errors. +For details on this support, please see this. +Out of the box, Apache Kafka Streams provides two kinds of deserialization exception handlers - LogAndContinueExceptionHandler and LogAndFailExceptionHandler. +As the name indicates, the former will log the error and continue processing the next records and the latter will log the error and fail. LogAndFailExceptionHandler is the default deserialization exception handler.

+
+
+

Handling Deserialization Exceptions in the Binder

+
+

Kafka Streams binder allows to specify the deserialization exception handlers above using the following property.

+
+
+
+
spring.cloud.stream.kafka.streams.binder.deserializationExceptionHandler: logAndContinue
+
+
+
+

or

+
+
+
+
spring.cloud.stream.kafka.streams.binder.deserializationExceptionHandler: logAndFail
+
+
+
+

In addition to the above two deserialization exception handlers, the binder also provides a third one for sending the erroneous records (poison pills) to a DLQ (dead letter queue) topic. +Here is how you enable this DLQ exception handler.

+
+
+
+
spring.cloud.stream.kafka.streams.binder.deserializationExceptionHandler: sendToDlq
+
+
+
+

When the above property is set, all the records in deserialization error are automatically sent to the DLQ topic.

+
+
+

You can set the topic name where the DLQ messages are published as below.

+
+
+
+
spring.cloud.stream.kafka.streams.bindings.process-in-0.consumer.dlqName: custom-dlq (Change the binding name accordingly)
+
+
+
+

If this is set, then the error records are sent to the topic custom-dlq. +If this is not set, then it will create a DLQ topic with the name error.<input-topic-name>.<application-id>. +For instance, if your binding’s destination topic is inputTopic and the application ID is process-applicationId, then the default DLQ topic is error.inputTopic.process-applicationId. +It is always recommended to explicitly create a DLQ topic for each input binding if it is your intention to enable DLQ.

+
+
+
+

DLQ per input consumer binding

+
+

The property spring.cloud.stream.kafka.streams.binder.deserializationExceptionHandler is applicable for the entire application. +This implies that if there are multiple functions or StreamListener methods in the same application, this property is applied to all of them. +However, if you have multiple processors or multiple input bindings within a single processor, then you can use the finer-grained DLQ control that the binder provides per input consumer binding.

+
+
+

If you have the following processor,

+
+
+
+
@Bean
+public BiFunction<KStream<String, Long>, KTable<String, String>, KStream<String, Long>> process() {
+...
+}
+
+
+
+

and you only want to enable DLQ on the first input binding and logAndSkip on the second binding, then you can do so on the consumer as below.

+
+
+

spring.cloud.stream.kafka.streams.bindings.process-in-0.consumer.deserializationExceptionHandler: sendToDlq +spring.cloud.stream.kafka.streams.bindings.process-in-1.consumer.deserializationExceptionHandler: logAndSkip

+
+
+

Setting deserialization exception handlers this way has a higher precedence than setting at the binder level.

+
+
+
+

DLQ partitioning

+
+

By default, records are published to the Dead-Letter topic using the same partition as the original record. +This means the Dead-Letter topic must have at least as many partitions as the original record.

+
+
+

To change this behavior, add a DlqPartitionFunction implementation as a @Bean to the application context. +Only one such bean can be present. +The function is provided with the consumer group (which is the same as the application ID in most situations), the failed ConsumerRecord and the exception. +For example, if you always want to route to partition 0, you might use:

+
+
+
+
@Bean
+public DlqPartitionFunction partitionFunction() {
+    return (group, record, ex) -> 0;
+}
+
+
+
+ + + + + +
+ + +If you set a consumer binding’s dlqPartitions property to 1 (and the binder’s minPartitionCount is equal to 1), there is no need to supply a DlqPartitionFunction; the framework will always use partition 0. +If you set a consumer binding’s dlqPartitions property to a value greater than 1 (or the binder’s minPartitionCount is greater than 1), you must provide a DlqPartitionFunction bean, even if the partition count is the same as the original topic’s. +
+
+
+

A couple of things to keep in mind when using the exception handling feature in Kafka Streams binder.

+
+
+
    +
  • +

    The property spring.cloud.stream.kafka.streams.binder.deserializationExceptionHandler is applicable for the entire application. +This implies that if there are multiple functions or StreamListener methods in the same application, this property is applied to all of them.

    +
  • +
  • +

    The exception handling for deserialization works consistently with native deserialization and framework provided message conversion.

    +
  • +
+
+
+
+

Handling Production Exceptions in the Binder

+
+

Unlike the support for deserialization exception handlers as described above, the binder does not provide such first class mechanisms for handling production exceptions. +However, you still can configure production exception handlers using the StreamsBuilderFactoryBean customizer which you can find more details about, in a subsequent section below.

+
+
+
+
+

State Store

+
+

State stores are created automatically by Kafka Streams when the high level DSL is used and appropriate calls are made those trigger a state store.

+
+
+

If you want to materialize an incoming KTable binding as a named state store, then you can do so by using the following strategy.

+
+
+

Lets say you have the following function.

+
+
+
+
@Bean
+public BiFunction<KStream<String, Long>, KTable<String, String>, KStream<String, Long>> process() {
+   ...
+}
+
+
+
+

Then by setting the following property, the incoming KTable data will be materialized in to the named state store.

+
+
+
+
spring.cloud.stream.kafka.streams.bindings.process-in-1.consumer.materializedAs: incoming-store
+
+
+
+

You can define custom state stores as beans in your application and those will be detected and added to the Kafka Streams builder by the binder. +Especially when the processor API is used, you need to register a state store manually. +In order to do so, you can create the StateStore as a bean in the application. +Here are examples of defining such beans.

+
+
+
+
@Bean
+public StoreBuilder myStore() {
+    return Stores.keyValueStoreBuilder(
+            Stores.persistentKeyValueStore("my-store"), Serdes.Long(),
+            Serdes.Long());
+}
+
+@Bean
+public StoreBuilder otherStore() {
+    return Stores.windowStoreBuilder(
+            Stores.persistentWindowStore("other-store",
+                    1L, 3, 3L, false), Serdes.Long(),
+            Serdes.Long());
+}
+
+
+
+

These state stores can be then accessed by the applications directly.

+
+
+

During the bootstrap, the above beans will be processed by the binder and passed on to the Streams builder object.

+
+
+

Accessing the state store:

+
+
+
+
Processor<Object, Product>() {
+
+    WindowStore<Object, String> state;
+
+    @Override
+    public void init(ProcessorContext processorContext) {
+        state = (WindowStore)processorContext.getStateStore("mystate");
+    }
+    ...
+}
+
+
+
+

This will not work when it comes to registering global state stores. +In order to register a global state store, please see the section below on customizing StreamsBuilderFactoryBean.

+
+
+
+

Interactive Queries

+
+

Kafka Streams binder API exposes a class called InteractiveQueryService to interactively query the state stores. +You can access this as a Spring bean in your application. An easy way to get access to this bean from your application is to autowire the bean.

+
+
+
+
@Autowired
+private InteractiveQueryService interactiveQueryService;
+
+
+
+

Once you gain access to this bean, then you can query for the particular state-store that you are interested. See below.

+
+
+
+
ReadOnlyKeyValueStore<Object, Object> keyValueStore =
+						interactiveQueryService.getQueryableStoreType("my-store", QueryableStoreTypes.keyValueStore());
+
+
+
+

During the startup, the above method call to retrieve the store might fail. +For e.g it might still be in the middle of initializing the state store. +In such cases, it will be useful to retry this operation. +Kafka Streams binder provides a simple retry mechanism to accommodate this.

+
+
+

Following are the two properties that you can use to control this retrying.

+
+
+
    +
  • +

    spring.cloud.stream.kafka.streams.binder.stateStoreRetry.maxAttempts - Default is 1 .

    +
  • +
  • +

    spring.cloud.stream.kafka.streams.binder.stateStoreRetry.backOffInterval - Default is 1000 milliseconds.

    +
  • +
+
+
+

If there are multiple instances of the kafka streams application running, then before you can query them interactively, you need to identify which application instance hosts the particular key that you are querying. +InteractiveQueryService API provides methods for identifying the host information.

+
+
+

In order for this to work, you must configure the property application.server as below:

+
+
+
+
spring.cloud.stream.kafka.streams.binder.configuration.application.server: <server>:<port>
+
+
+
+

Here are some code snippets:

+
+
+
+
org.apache.kafka.streams.state.HostInfo hostInfo = interactiveQueryService.getHostInfo("store-name",
+						key, keySerializer);
+
+if (interactiveQueryService.getCurrentHostInfo().equals(hostInfo)) {
+
+    //query from the store that is locally available
+}
+else {
+    //query from the remote host
+}
+
+
+
+
+

Health Indicator

+
+

The health indicator requires the dependency spring-boot-starter-actuator. For maven use:

+
+
+
+
<dependency>
+  <groupId>org.springframework.boot</groupId>
+  <artifactId>spring-boot-starter-actuator</artifactId>
+</dependency>
+
+
+
+

Spring Cloud Stream Kafka Streams Binder provides a health indicator to check the state of the underlying streams threads. +Spring Cloud Stream defines a property management.health.binders.enabled to enable the health indicator. See the +Spring Cloud Stream documentation.

+
+
+

The health indicator provides the following details for each stream thread’s metadata:

+
+
+
    +
  • +

    Thread name

    +
  • +
  • +

    Thread state: CREATED, RUNNING, PARTITIONS_REVOKED, PARTITIONS_ASSIGNED, PENDING_SHUTDOWN or DEAD

    +
  • +
  • +

    Active tasks: task ID and partitions

    +
  • +
  • +

    Standby tasks: task ID and partitions

    +
  • +
+
+
+

By default, only the global status is visible (UP or DOWN). To show the details, the property management.endpoint.health.show-details must be set to ALWAYS or WHEN_AUTHORIZED. +For more details about the health information, see the +Spring Boot Actuator documentation.

+
+
+ + + + + +
+ + +The status of the health indicator is UP if all the Kafka threads registered are in the RUNNING state. +
+
+
+

Since there are three individual binders in Kafka Streams binder (KStream, KTable and GlobalKTable), all of them will report the health status. +When enabling show-details, some of the information reported may be redundant.

+
+
+

When there are multiple Kafka Streams processors present in the same application, then the health checks will be reported for all of them and will be categorized by the application ID of Kafka Streams.

+
+
+
+

Accessing Kafka Streams Metrics

+
+

Spring Cloud Stream Kafka Streams binder provides a basic mechanism for accessing Kafka Streams metrics exported through a Micrometer MeterRegistry. +Kafka Streams metrics that are available through KafkaStreams#metrics() are exported to this meter registry by the binder. +The metrics exported are from the consumers, producers, admin-client and the stream itself.

+
+
+

The metrics exported by the binder are exported with the format of metrics group name followed by a dot and then the actual metric name. +All dashes in the original metric information is replaced with dots.

+
+
+

For e.g. the metric name network-io-total from the metric group consumer-metrics is available in the micrometer registry as consumer.metrics.network.io.total. +Similarly, the metric commit-total from stream-metrics is available as stream.metrics.commit.total.

+
+
+

If you have multiple Kafka Streams processors in the same application, then the metric name will be prepended with the corresponding application ID of the Kafka Streams. +The application ID in this case will be preserved as is, i.e. no dashes will be converted to dots etc. +For example, if the application ID of the first processor is processor-1, then the metric name network-io-total from the metric group consumer-metrics is available in the micrometer registry as processor-1.consumer.metrics.network.io.total.

+
+
+

You can either programmatically access the Micrometer MeterRegistry in the application and then iterate through the available gauges or use Spring Boot actuator to access the metrics through a REST endpoint. +When accessing through the Boot actuator endpoint, make sure to add metrics to the property management.endpoints.web.exposure.include. +Then you can access /acutator/metrics to get a list of all the available metrics which then can be individually accessed through the same URI (/actuator/metrics/<metric-name>).

+
+
+

Anything beyond the info level metrics available through KafkaStreams#metrics(), (for e.g. the debugging level metrics) are still only available through JMX after you set the metrics.recording.level to DEBUG. +Kafka Streams, by default, set this level to INFO. +Please see this section from Kafka Streams documentation for more details. +In a future release, binder may support exporting these DEBUG level metrics through Micrometer.

+
+
+
+

Mixing high level DSL and low level Processor API

+
+

Kafka Streams provides two variants of APIs. +It has a higher level DSL like API where you can chain various operations that maybe familiar to a lot of functional programmers. +Kafka Streams also gives access to a low level Processor API. +The processor API, although very powerful and gives the ability to control things in a much lower level, is imperative in nature. +Kafka Streams binder for Spring Cloud Stream, allows you to use either the high level DSL or mixing both the DSL and the processor API. +Mixing both of these variants give you a lot of options to control various use cases in an application. +Applications can use the transform or process method API calls to get access to the processor API.

+
+
+

Here is a look at how one may combine both the DSL and the processor API in a Spring Cloud Stream application using the process API.

+
+
+
+
@Bean
+public Consumer<KStream<Object, String>> process() {
+    return input ->
+        input.process(() -> new Processor<Object, String>() {
+            @Override
+            @SuppressWarnings("unchecked")
+            public void init(ProcessorContext context) {
+               this.context = context;
+            }
+
+            @Override
+            public void process(Object key, String value) {
+                //business logic
+            }
+
+            @Override
+            public void close() {
+
+        });
+}
+
+
+
+

Here is an example using the transform API.

+
+
+
+
@Bean
+public Consumer<KStream<Object, String>> process() {
+    return (input, a) ->
+        input.transform(() -> new Transformer<Object, String, KeyValue<Object, String>>() {
+            @Override
+            public void init(ProcessorContext context) {
+
+            }
+
+            @Override
+            public void close() {
+
+            }
+
+            @Override
+            public KeyValue<Object, String> transform(Object key, String value) {
+                // business logic - return transformed KStream;
+            }
+        });
+}
+
+
+
+

The process API method call is a terminal operation while the transform API is non terminal and gives you a potentially transformed KStream using which you can continue further processing using either the DSL or the processor API.

+
+
+
+

Partition support on the outbound

+
+

A Kafka Streams processor usually sends the processed output into an outbound Kafka topic. +If the outbound topic is partitioned and the processor needs to send the outgoing data into particular partitions, the applications needs to provide a bean of type StreamPartitioner. +See StreamPartitioner for more details. +Let’s see some examples.

+
+
+

This is the same processor we already saw multiple times,

+
+
+
+
@Bean
+public Function<KStream<Object, String>, KStream<?, WordCount>> process() {
+
+    ...
+}
+
+
+
+

Here is the output binding destination:

+
+
+
+
spring.cloud.stream.bindings.process-out-0.destination: outputTopic
+
+
+
+

If the topic outputTopic has 4 partitions, if you don’t provide a partitioning strategy, Kafka Streams will use default partitioning strategy which may not be the outcome you want depending on the particular use case. +Let’s say, you want to send any key that matches to spring to partition 0, cloud to partition 1, stream to partition 2, and everything else to partition 3. +This is what you need to do in the application.

+
+
+
+
@Bean
+public StreamPartitioner<String, WordCount> streamPartitioner() {
+    return (t, k, v, n) -> {
+        if (k.equals("spring")) {
+            return 0;
+        }
+        else if (k.equals("cloud")) {
+            return 1;
+        }
+        else if (k.equals("stream")) {
+            return 2;
+        }
+        else {
+            return 3;
+        }
+    };
+}
+
+
+
+

This is a rudimentary implementation, however, you have access to the key/value of the record, the topic name and the total number of partitions. +Therefore, you can implement complex partitioning strategies if need be.

+
+
+

You also need to provide this bean name along with the application configuration.

+
+
+
+
spring.cloud.stream.kafka.streams.bindings.process-out-0.producer.streamPartitionerBeanName: streamPartitioner
+
+
+
+

Each output topic in the application needs to be configured separately like this.

+
+
+
+

StreamsBuilderFactoryBean customizer

+
+

It is often required to customize the StreamsBuilderFactoryBean that creates the KafkaStreams objects. +Based on the underlying support provided by Spring Kafka, the binder allows you to customize the StreamsBuilderFactoryBean. +You can use the StreamsBuilderFactoryBeanCustomizer to customize the StreamsBuilderFactoryBean itself. +Then, once you get access to the StreamsBuilderFactoryBean through this customizer, you can customize the corresponding KafkaStreams using KafkaStreamsCustomzier. +Both of these customizers are part of the Spring for Apache Kafka project.

+
+
+

Here is an example of using the StreamsBuilderFactoryBeanCustomizer.

+
+
+
+
@Bean
+public StreamsBuilderFactoryBeanCustomizer streamsBuilderFactoryBeanCustomizer() {
+    return sfb -> sfb.setStateListener((newState, oldState) -> {
+         //Do some action here!
+    });
+}
+
+
+
+

The above is shown as an illustration of the things you can do to customize the StreamsBuilderFactoryBean. +You can essentially call any available mutation operations from StreamsBuilderFactoryBean to customize it. +This customizer will be invoked by the binder right before the factory bean is started.

+
+
+

Once you get access to the StreamsBuilderFactoryBean, you can also customize the underlying KafkaStreams object. +Here is a blueprint for doing so.

+
+
+
+
@Bean
+public StreamsBuilderFactoryBeanCustomizer streamsBuilderFactoryBeanCustomizer() {
+    return factoryBean -> {
+        factoryBean.setKafkaStreamsCustomizer(new KafkaStreamsCustomizer() {
+            @Override
+            public void customize(KafkaStreams kafkaStreams) {
+                kafkaStreams.setUncaughtExceptionHandler((t, e) -> {
+
+                });
+            }
+        });
+    };
+}
+
+
+
+

KafkaStreamsCustomizer will be called by the StreamsBuilderFactoryBeabn right before the underlying KafkaStreams gets started.

+
+
+

There can only be one StreamsBuilderFactoryBeanCustomizer in the entire application. +Then how do we account for multiple Kafka Streams processors as each of them are backed up by individual StreamsBuilderFactoryBean objects? +In that case, if the customization needs to be different for those processors, then the application needs to apply some filter based on the application ID.

+
+
+

For e.g,

+
+
+
+
@Bean
+public StreamsBuilderFactoryBeanCustomizer streamsBuilderFactoryBeanCustomizer() {
+
+    return factoryBean -> {
+        if (factoryBean.getStreamsConfiguration().getProperty(StreamsConfig.APPLICATION_ID_CONFIG)
+                .equals("processor1-application-id")) {
+            factoryBean.setKafkaStreamsCustomizer(new KafkaStreamsCustomizer() {
+                @Override
+                public void customize(KafkaStreams kafkaStreams) {
+                    kafkaStreams.setUncaughtExceptionHandler((t, e) -> {
+
+                    });
+                }
+            });
+        }
+    };
+
+
+
+

Using Customizer to register a global state store

+
+

As mentioned above, the binder does not provide a first class way to register global state stores as a feature. +For that, you need to use the customizer. +Here is how that can be done.

+
+
+
+
@Bean
+public StreamsBuilderFactoryBeanCustomizer customizer() {
+    return fb -> {
+        try {
+            final StreamsBuilder streamsBuilder = fb.getObject();
+            streamsBuilder.addGlobalStore(...);
+        }
+        catch (Exception e) {
+
+        }
+    };
+}
+
+
+
+

Again, if you have multiple processors, you want to attach the global state store to the right StreamsBuilder by filtering out the other StreamsBuilderFactoryBean objects using the application id as outlined above.

+
+
+
+

Using customizer to register a production exception handler

+
+

In the error handling section, we indicated that the binder does not provide a first class way to deal with production exceptions. +Though that is the case, you can still use the StreamsBuilderFacotryBean customizer to register production exception handlers. See below.

+
+
+
+
@Bean
+public StreamsBuilderFactoryBeanCustomizer customizer() {
+    return fb -> {
+        fb.getStreamsConfiguration().put(StreamsConfig.DEFAULT_PRODUCTION_EXCEPTION_HANDLER_CLASS_CONFIG,
+                            CustomProductionExceptionHandler.class);
+    };
+}
+
+
+
+

Once again, if you have multiple processors, you may want to set it appropriately against the correct StreamsBuilderFactoryBean. +You may also add such production exception handlers using the configuration property (See below for more on that), but this is an option if you choose to go with a programmatic approach.

+
+
+
+
+

Timestamp extractor

+
+

Kafka Streams allows you to control the processing of the consumer records based on various notions of timestamp. +By default, Kafka Streams extracts the timestamp metadata embedded in the consumer record. +You can change this default behavior by providing a different TimestampExtractor implementation per input binding. +Here are some details on how that can be done.

+
+
+
+
@Bean
+public Function<KStream<Long, Order>,
+        Function<KTable<Long, Customer>,
+                Function<GlobalKTable<Long, Product>, KStream<Long, Order>>>> process() {
+    return orderStream ->
+            customers ->
+                products -> orderStream;
+}
+
+@Bean
+public TimestampExtractor timestampExtractor() {
+    return new WallclockTimestampExtractor();
+}
+
+
+
+

Then you set the above TimestampExtractor bean name per consumer binding.

+
+
+
+
spring.cloud.stream.kafka.streams.bindings.process-in-0.consumer.timestampExtractorBeanName=timestampExtractor
+spring.cloud.stream.kafka.streams.bindings.process-in-1.consumer.timestampExtractorBeanName=timestampExtractor
+spring.cloud.stream.kafka.streams.bindings.process-in-2.consumer.timestampExtractorBeanName=timestampExtractor"
+
+
+
+

If you skip an input consumer binding for setting a custom timestamp extractor, that consumer will use the default settings.

+
+
+
+

Multi binders with Kafka Streams based binders and regular Kafka Binder

+
+

You can have an application where you have both a function/consumer/supplier that is based on the regular Kafka binder and a Kafka Streams based processor. +However, you cannot mix both of them within a single function or consumer.

+
+
+

Here is an example, where you have both binder based components within the same application.

+
+
+
+
@Bean
+public Function<String, String> process() {
+    return s -> s;
+}
+
+@Bean
+public Function<KStream<Object, String>, KStream<?, WordCount>> kstreamProcess() {
+
+    return input -> input;
+}
+
+
+
+

This is the relevant parts from the configuration:

+
+
+
+
spring.cloud.stream.function.definition=process;kstreamProcess
+spring.cloud.stream.bindings.process-in-0.destination=foo
+spring.cloud.stream.bindings.process-out-0.destination=bar
+spring.cloud.stream.bindings.kstreamProcess-in-0.destination=bar
+spring.cloud.stream.bindings.kstreamProcess-out-0.destination=foobar
+
+
+
+

Things become a bit more complex if you have the same application as above, but is dealing with two different Kafka clusters, for e.g. the regular process is acting upon both Kafka cluster 1 and cluster 2 (receiving data from cluster-1 and sending to cluster-2) and the Kafka Streams processor is acting upon Kafka cluster 2. +Then you have to use the multi binder facilities provided by Spring Cloud Stream.

+
+
+

Here is how your configuration may change in that scenario.

+
+
+
+
# multi binder configuration
+spring.cloud.stream.binders.kafka1.type: kafka
+spring.cloud.stream.binders.kafka1.environment.spring.cloud.stream.kafka.streams.binder.brokers=${kafkaCluster-1} #Replace kafkaCluster-1 with the approprate IP of the cluster
+spring.cloud.stream.binders.kafka2.type: kafka
+spring.cloud.stream.binders.kafka2.environment.spring.cloud.stream.kafka.streams.binder.brokers=${kafkaCluster-2} #Replace kafkaCluster-2 with the approprate IP of the cluster
+spring.cloud.stream.binders.kafka3.type: kstream
+spring.cloud.stream.binders.kafka3.environment.spring.cloud.stream.kafka.streams.binder.brokers=${kafkaCluster-2} #Replace kafkaCluster-2 with the approprate IP of the cluster
+
+spring.cloud.stream.function.definition=process;kstreamProcess
+
+# From cluster 1 to cluster 2 with regular process function
+spring.cloud.stream.bindings.process-in-0.destination=foo
+spring.cloud.stream.bindings.process-in-0.binder=kafka1 # source from cluster 1
+spring.cloud.stream.bindings.process-out-0.destination=bar
+spring.cloud.stream.bindings.process-out-0.binder=kafka2 # send to cluster 2
+
+# Kafka Streams processor on cluster 2
+spring.cloud.stream.bindings.kstreamProcess-in-0.destination=bar
+spring.cloud.stream.bindings.kstreamProcess-in-0.binder=kafka3
+spring.cloud.stream.bindings.kstreamProcess-out-0.destination=foobar
+spring.cloud.stream.bindings.kstreamProcess-out-0.binder=kafka3
+
+
+
+

Pay attention to the above configuration. +We have two kinds of binders, but 3 binders all in all, first one is the regular Kafka binder based on cluster 1 (kafka1), then another Kafka binder based on cluster 2 (kafka2) and finally the kstream one (kafka3). +The first processor in the application receives data from kafka1 and publishes to kafka2 where both binders are based on regular Kafka binder but differnt clusters. +The second processor, which is a Kafka Streams processor consumes data from kafka3 which is the same cluster as kafka2, but a different binder type.

+
+
+

Since there are three different binder types available in the Kafka Streams family of binders - kstream, ktable and globalktable - if your application has multiple bindings based on any of these binders, that needs to be explicitly provided as the binder type.

+
+
+

For e.g if you have a processor as below,

+
+
+
+
@Bean
+public Function<KStream<Long, Order>,
+        Function<KTable<Long, Customer>,
+                Function<GlobalKTable<Long, Product>, KStream<Long, EnrichedOrder>>>> enrichOrder() {
+
+    ...
+}
+
+
+
+

then, this has to be configured in a multi binder scenario as the following. +Please note that this is only needed if you have a true multi-binder scenario where there are multiple processors dealing with multiple clusters within a single application. +In that case, the binders need to be explicitly provided with the bindings to distinguish from other processor’s binder types and clusters.

+
+
+
+
spring.cloud.stream.binders.kafka1.type: kstream
+spring.cloud.stream.binders.kafka1.environment.spring.cloud.stream.kafka.streams.binder.brokers=${kafkaCluster-2}
+spring.cloud.stream.binders.kafka2.type: ktable
+spring.cloud.stream.binders.kafka2.environment.spring.cloud.stream.kafka.streams.binder.brokers=${kafkaCluster-2}
+spring.cloud.stream.binders.kafka3.type: globalktable
+spring.cloud.stream.binders.kafka3.environment.spring.cloud.stream.kafka.streams.binder.brokers=${kafkaCluster-2}
+
+spring.cloud.stream.bindings.enrichOrder-in-0.binder=kafka1  #kstream
+spring.cloud.stream.bindings.enrichOrder-in-1.binder=kafka2  #ktablr
+spring.cloud.stream.bindings.enrichOrder-in-2.binder=kafka3  #globalktable
+spring.cloud.stream.bindings.enrichOrder-out-0.binder=kafka1 #kstream
+
+# rest of the configuration is omitted.
+
+
+
+
+

State Cleanup

+
+

By default, the Kafkastreams.cleanup() method is called when the binding is stopped. +See the Spring Kafka documentation. +To modify this behavior simply add a single CleanupConfig @Bean (configured to clean up on start, stop, or neither) to the application context; the bean will be detected and wired into the factory bean.

+
+
+
+

Kafka Streams topology visualization

+
+

Kafka Streams binder provides the following actuator endpoints for retrieving the topology description using which you can visualize the topology using external tools.

+
+
+

/actuator/kafkastreamstopology

+
+
+

/actuator/kafkastreamstopology/<applicaiton-id of the processor>

+
+
+

You need to include the actuator and web dependencies from Spring Boot to access these endpoints. +Further, you also need to add kafkastreamstopology to management.endpoints.web.exposure.include property. +By default, the kafkastreamstopology endpoint is disabled.

+
+
+
+

Configuration Options

+
+

This section contains the configuration options used by the Kafka Streams binder.

+
+
+

For common configuration options and properties pertaining to binder, refer to the core documentation.

+
+
+

Kafka Streams Binder Properties

+
+

The following properties are available at the binder level and must be prefixed with spring.cloud.stream.kafka.streams.binder.

+
+
+
+
configuration
+
+

Map with a key/value pair containing properties pertaining to Apache Kafka Streams API. + This property must be prefixed with spring.cloud.stream.kafka.streams.binder.. +Following are some examples of using this property.

+
+
+
+
+
+
spring.cloud.stream.kafka.streams.binder.configuration.default.key.serde=org.apache.kafka.common.serialization.Serdes$StringSerde
+spring.cloud.stream.kafka.streams.binder.configuration.default.value.serde=org.apache.kafka.common.serialization.Serdes$StringSerde
+spring.cloud.stream.kafka.streams.binder.configuration.commit.interval.ms=1000
+
+
+
+

For more information about all the properties that may go into streams configuration, see StreamsConfig JavaDocs in Apache Kafka Streams docs. +All configuration that you can set from StreamsConfig can be set through this. +When using this property, it is applicable against the entire application since this is a binder level property. +If you have more than processors in the application, all of them will acquire these properties. +In the case of properties like application.id, this will become problematic and therefore you have to carefully examine how the properties from StreamsConfig are mapped using this binder level configuration property.

+
+
+
+
functions.<function-bean-name>.applicationId
+
+

Applicable only for functional style processors. +This can be used for setting application ID per function in the application. +In the case of multiple functions, this is a handy way to set the application ID.

+
+
functions.<function-bean-name>.configuration
+
+

Applicable only for functional style processors. +Map with a key/value pair containing properties pertaining to Apache Kafka Streams API. +This is similar to the binder level configuration property describe above, but this level of configuration property is restricted only against the named function. +When you have multiple processors and you want to restrict access to the configuration based on particular functions, you might want to use this. +All StreamsConfig properties can be used here.

+
+
brokers
+
+

Broker URL

+
+

Default: localhost

+
+
+
zkNodes
+
+

Zookeeper URL

+
+

Default: localhost

+
+
+
deserializationExceptionHandler
+
+

Deserialization error handler type. +This handler is applied at the binder level and thus applied against all input binding in the application. +There is a way to control it in a more fine-grained way at the consumer binding level. +Possible values are - logAndContinue, logAndFail or sendToDlq

+
+

Default: logAndFail

+
+
+
applicationId
+
+

Convenient way to set the application.id for the Kafka Streams application globally at the binder level. +If the application contains multiple functions or StreamListener methods, then the application id should be set differently. +See above where setting the application id is discussed in detail.

+
+

Default: application will generate a static application ID. See the application ID section for more details.

+
+
+
stateStoreRetry.maxAttempts
+
+

Max attempts for trying to connect to a state store.

+
+

Default: 1

+
+
+
stateStoreRetry.backoffPeriod
+
+

Backoff period when trying to connect to a state store on a retry.

+
+

Default: 1000 ms

+
+
+
+
+
+
+

Kafka Streams Producer Properties

+
+

The following properties are only available for Kafka Streams producers and must be prefixed with spring.cloud.stream.kafka.streams.bindings.<binding name>.producer. +For convenience, if there are multiple output bindings and they all require a common value, that can be configured by using the prefix spring.cloud.stream.kafka.streams.default.producer..

+
+
+
+
keySerde
+
+

key serde to use

+
+

Default: See the above discussion on message de/serialization

+
+
+
valueSerde
+
+

value serde to use

+
+

Default: See the above discussion on message de/serialization

+
+
+
useNativeEncoding
+
+

flag to enable/disable native encoding

+
+

Default: true.

+
+
+
+
+
+

streamPartitionerBeanName: + Custom outbound partitioner bean name to be used at the consumer. + Applications can provide custom StreamPartitioner as a Spring bean and the name of this bean can be provided to the producer to use instead of the default one.

+
+
+

+ +Default: See the discussion above on outbound partition support.

+
+
+
+

Kafka Streams Consumer Properties

+
+

The following properties are available for Kafka Streams consumers and must be prefixed with spring.cloud.stream.kafka.streams.bindings.<binding-name>.consumer. +For convenience, if there are multiple input bindings and they all require a common value, that can be configured by using the prefix spring.cloud.stream.kafka.streams.default.consumer..

+
+
+
+
applicationId
+
+

Setting application.id per input binding. This is only preferred for StreamListener based processors, for function based processors see other approaches outlined above.

+
+

Default: See above.

+
+
+
keySerde
+
+

key serde to use

+
+

Default: See the above discussion on message de/serialization

+
+
+
valueSerde
+
+

value serde to use

+
+

Default: See the above discussion on message de/serialization

+
+
+
materializedAs
+
+

state store to materialize when using incoming KTable types

+
+

Default: none.

+
+
+
useNativeDecoding
+
+

flag to enable/disable native decoding

+
+

Default: true.

+
+
+
dlqName
+
+

DLQ topic name.

+
+

Default: See above on the discussion of error handling and DLQ.

+
+
+
startOffset
+
+

Offset to start from if there is no committed offset to consume from. +This is mostly used when the consumer is consuming from a topic for the first time. +Kafka Streams uses earliest as the default strategy and the binder uses the same default. +This can be overridden to latest using this property.

+
+

Default: earliest.

+
+
+
+
+
+

Note: Using resetOffsets on the consumer does not have any effect on Kafka Streams binder. +Unlike the message channel based binder, Kafka Streams binder does not seek to beginning or end on demand.

+
+
+
+
deserializationExceptionHandler
+
+

Deserialization error handler type. +This handler is applied per consumer binding as opposed to the binder level property described before. +Possible values are - logAndContinue, logAndFail or sendToDlq

+
+

Default: logAndFail

+
+
+
timestampExtractorBeanName
+
+

Specific time stamp extractor bean name to be used at the consumer. +Applications can provide TimestampExtractor as a Spring bean and the name of this bean can be provided to the consumer to use instead of the default one.

+
+

Default: See the discussion above on timestamp extractors.

+
+
+
+
+
+
+

Special note on concurrency

+
+

In Kafka Streams, you can control of the number of threads a processor can create using the num.stream.threads property. +This, you can do using the various configuration options described above under binder, functions, producer or consumer level. +You can also use the concurrency property that core Spring Cloud Stream provides for this purpose. +When using this, you need to use it on the consumer. +When you have more than one input bindings either in a function or StreamListener, set this on the first input binding. +For e.g. when setting spring.cloud.stream.bindings.process-in-0.consumer.concurrency, it will be translated as num.stream.threads by the binder. +If you have multiple processors and one processor defines binding level concurrency, but not the others, those ones with no binding level concurrency will default back to the binder wide property specified through +spring.cloud.stream.binder.configuration.num.stream.threads. +If this binder configuration is not available, then the application will use the default set by Kafka Streams.

+
+
+
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/overview.html b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/overview.html new file mode 100644 index 00000000..f66e1075 --- /dev/null +++ b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/overview.html @@ -0,0 +1,1141 @@ + + + + + + + +Apache Kafka Binder + + + + + + + + + + +
+
+
+ +
+
+
+

Apache Kafka Binder

+
+
+

Usage

+
+

To use Apache Kafka binder, you need to add spring-cloud-stream-binder-kafka as a dependency to your Spring Cloud Stream application, as shown in the following example for Maven:

+
+
+
+
<dependency>
+  <groupId>org.springframework.cloud</groupId>
+  <artifactId>spring-cloud-stream-binder-kafka</artifactId>
+</dependency>
+
+
+
+

Alternatively, you can also use the Spring Cloud Stream Kafka Starter, as shown in the following example for Maven:

+
+
+
+
<dependency>
+  <groupId>org.springframework.cloud</groupId>
+  <artifactId>spring-cloud-starter-stream-kafka</artifactId>
+</dependency>
+
+
+
+
+

Overview

+
+

The following image shows a simplified diagram of how the Apache Kafka binder operates:

+
+
+
+kafka binder +
+
Figure 1. Kafka Binder
+
+
+

The Apache Kafka Binder implementation maps each destination to an Apache Kafka topic. +The consumer group maps directly to the same Apache Kafka concept. +Partitioning also maps directly to Apache Kafka partitions as well.

+
+
+

The binder currently uses the Apache Kafka kafka-clients version 2.3.1. +This client can communicate with older brokers (see the Kafka documentation), but certain features may not be available. +For example, with versions earlier than 0.11.x.x, native headers are not supported. +Also, 0.11.x.x does not support the autoAddPartitions property.

+
+
+
+

Configuration Options

+
+

This section contains the configuration options used by the Apache Kafka binder.

+
+
+

For common configuration options and properties pertaining to binder, see the core documentation.

+
+
+

Kafka Binder Properties

+
+
+
spring.cloud.stream.kafka.binder.brokers
+
+

A list of brokers to which the Kafka binder connects.

+
+

Default: localhost.

+
+
+
spring.cloud.stream.kafka.binder.defaultBrokerPort
+
+

brokers allows hosts specified with or without port information (for example, host1,host2:port2). +This sets the default port when no port is configured in the broker list.

+
+

Default: 9092.

+
+
+
spring.cloud.stream.kafka.binder.configuration
+
+

Key/Value map of client properties (both producers and consumer) passed to all clients created by the binder. +Due to the fact that these properties are used by both producers and consumers, usage should be restricted to common properties — for example, security settings. +Unknown Kafka producer or consumer properties provided through this configuration are filtered out and not allowed to propagate. +Properties here supersede any properties set in boot.

+
+

Default: Empty map.

+
+
+
spring.cloud.stream.kafka.binder.consumerProperties
+
+

Key/Value map of arbitrary Kafka client consumer properties. +In addition to support known Kafka consumer properties, unknown consumer properties are allowed here as well. +Properties here supersede any properties set in boot and in the configuration property above.

+
+

Default: Empty map.

+
+
+
spring.cloud.stream.kafka.binder.headers
+
+

The list of custom headers that are transported by the binder. +Only required when communicating with older applications (⇐ 1.3.x) with a kafka-clients version < 0.11.0.0. Newer versions support headers natively.

+
+

Default: empty.

+
+
+
spring.cloud.stream.kafka.binder.healthTimeout
+
+

The time to wait to get partition information, in seconds. +Health reports as down if this timer expires.

+
+

Default: 10.

+
+
+
spring.cloud.stream.kafka.binder.requiredAcks
+
+

The number of required acks on the broker. +See the Kafka documentation for the producer acks property.

+
+

Default: 1.

+
+
+
spring.cloud.stream.kafka.binder.minPartitionCount
+
+

Effective only if autoCreateTopics or autoAddPartitions is set. +The global minimum number of partitions that the binder configures on topics on which it produces or consumes data. +It can be superseded by the partitionCount setting of the producer or by the value of instanceCount * concurrency settings of the producer (if either is larger).

+
+

Default: 1.

+
+
+
spring.cloud.stream.kafka.binder.producerProperties
+
+

Key/Value map of arbitrary Kafka client producer properties. +In addition to support known Kafka producer properties, unknown producer properties are allowed here as well. +Properties here supersede any properties set in boot and in the configuration property above.

+
+

Default: Empty map.

+
+
+
spring.cloud.stream.kafka.binder.replicationFactor
+
+

The replication factor of auto-created topics if autoCreateTopics is active. +Can be overridden on each binding.

+
+

Default: 1.

+
+
+
spring.cloud.stream.kafka.binder.autoCreateTopics
+
+

If set to true, the binder creates new topics automatically. +If set to false, the binder relies on the topics being already configured. +In the latter case, if the topics do not exist, the binder fails to start.

+
+ + + + + +
+ + +This setting is independent of the auto.create.topics.enable setting of the broker and does not influence it. +If the server is set to auto-create topics, they may be created as part of the metadata retrieval request, with default broker settings. +
+
+
+

Default: true.

+
+
+
spring.cloud.stream.kafka.binder.autoAddPartitions
+
+

If set to true, the binder creates new partitions if required. +If set to false, the binder relies on the partition size of the topic being already configured. +If the partition count of the target topic is smaller than the expected value, the binder fails to start.

+
+

Default: false.

+
+
+
spring.cloud.stream.kafka.binder.transaction.transactionIdPrefix
+
+

Enables transactions in the binder. See transaction.id in the Kafka documentation and Transactions in the spring-kafka documentation. +When transactions are enabled, individual producer properties are ignored and all producers use the spring.cloud.stream.kafka.binder.transaction.producer.* properties.

+
+

Default null (no transactions)

+
+
+
spring.cloud.stream.kafka.binder.transaction.producer.*
+
+

Global producer properties for producers in a transactional binder. +See spring.cloud.stream.kafka.binder.transaction.transactionIdPrefix and Kafka Producer Properties and the general producer properties supported by all binders.

+
+

Default: See individual producer properties.

+
+
+
spring.cloud.stream.kafka.binder.headerMapperBeanName
+
+

The bean name of a KafkaHeaderMapper used for mapping spring-messaging headers to and from Kafka headers. +Use this, for example, if you wish to customize the trusted packages in a BinderHeaderMapper bean that uses JSON deserialization for the headers. +If this custom BinderHeaderMapper bean is not made available to the binder using this property, then the binder will look for a header mapper bean with the name kafkaBinderHeaderMapper that is of type BinderHeaderMapper before falling back to a default BinderHeaderMapper created by the binder.

+
+

Default: none.

+
+
+
+
+
+
+

Kafka Consumer Properties

+
+ + + + + +
+ + +To avoid repetition, Spring Cloud Stream supports setting values for all channels, in the format of spring.cloud.stream.kafka.default.consumer.<property>=<value>. +
+
+
+

The following properties are available for Kafka consumers only and +must be prefixed with spring.cloud.stream.kafka.bindings.<channelName>.consumer..

+
+
+
+
admin.configuration
+
+

Since version 2.1.1, this property is deprecated in favor of topic.properties, and support for it will be removed in a future version.

+
+
admin.replicas-assignment
+
+

Since version 2.1.1, this property is deprecated in favor of topic.replicas-assignment, and support for it will be removed in a future version.

+
+
admin.replication-factor
+
+

Since version 2.1.1, this property is deprecated in favor of topic.replication-factor, and support for it will be removed in a future version.

+
+
autoRebalanceEnabled
+
+

When true, topic partitions is automatically rebalanced between the members of a consumer group. +When false, each consumer is assigned a fixed set of partitions based on spring.cloud.stream.instanceCount and spring.cloud.stream.instanceIndex. +This requires both the spring.cloud.stream.instanceCount and spring.cloud.stream.instanceIndex properties to be set appropriately on each launched instance. +The value of the spring.cloud.stream.instanceCount property must typically be greater than 1 in this case.

+
+

Default: true.

+
+
+
ackEachRecord
+
+

When autoCommitOffset is true, this setting dictates whether to commit the offset after each record is processed. +By default, offsets are committed after all records in the batch of records returned by consumer.poll() have been processed. +The number of records returned by a poll can be controlled with the max.poll.records Kafka property, which is set through the consumer configuration property. +Setting this to true may cause a degradation in performance, but doing so reduces the likelihood of redelivered records when a failure occurs. +Also, see the binder requiredAcks property, which also affects the performance of committing offsets.

+
+

Default: false.

+
+
+
autoCommitOffset
+
+

Whether to autocommit offsets when a message has been processed. +If set to false, a header with the key kafka_acknowledgment of the type org.springframework.kafka.support.Acknowledgment header is present in the inbound message. +Applications may use this header for acknowledging messages. +See the examples section for details. +When this property is set to false, Kafka binder sets the ack mode to org.springframework.kafka.listener.AbstractMessageListenerContainer.AckMode.MANUAL and the application is responsible for acknowledging records. +Also see ackEachRecord.

+
+

Default: true.

+
+
+
autoCommitOnError
+
+

Effective only if autoCommitOffset is set to true. +If set to false, it suppresses auto-commits for messages that result in errors and commits only for successful messages. It allows a stream to automatically replay from the last successfully processed message, in case of persistent failures. +If set to true, it always auto-commits (if auto-commit is enabled). +If not set (the default), it effectively has the same value as enableDlq, auto-committing erroneous messages if they are sent to a DLQ and not committing them otherwise.

+
+

Default: not set.

+
+
+
resetOffsets
+
+

Whether to reset offsets on the consumer to the value provided by startOffset. +Must be false if a KafkaRebalanceListener is provided; see Using a KafkaRebalanceListener.

+
+

Default: false.

+
+
+
startOffset
+
+

The starting offset for new groups. +Allowed values: earliest and latest. +If the consumer group is set explicitly for the consumer 'binding' (through spring.cloud.stream.bindings.<channelName>.group), 'startOffset' is set to earliest. Otherwise, it is set to latest for the anonymous consumer group. +Also see resetOffsets (earlier in this list).

+
+

Default: null (equivalent to earliest).

+
+
+
enableDlq
+
+

When set to true, it enables DLQ behavior for the consumer. +By default, messages that result in errors are forwarded to a topic named error.<destination>.<group>. +The DLQ topic name can be configurable by setting the dlqName property. +This provides an alternative option to the more common Kafka replay scenario for the case when the number of errors is relatively small and replaying the entire original topic may be too cumbersome. +See [kafka-dlq-processing] processing for more information. +Starting with version 2.0, messages sent to the DLQ topic are enhanced with the following headers: x-original-topic, x-exception-message, and x-exception-stacktrace as byte[]. +By default, a failed record is sent to the same partition number in the DLQ topic as the original record. +See [dlq-partition-selection] for how to change that behavior. +Not allowed when destinationIsPattern is true.

+
+

Default: false.

+
+
+
dlqPartitions
+
+

When enableDlq is true, and this property is not set, a dead letter topic with the same number of partitions as the primary topic(s) is created. +Usually, dead-letter records are sent to the same partition in the dead-letter topic as the original record. +This behavior can be changed; see [dlq-partition-selection]. +If this property is set to 1 and there is no DqlPartitionFunction bean, all dead-letter records will be written to partition 0. +If this property is greater than 1, you MUST provide a DlqPartitionFunction bean. +Note that the actual partition count is affected by the binder’s minPartitionCount property.

+
+

Default: none

+
+
+
configuration
+
+

Map with a key/value pair containing generic Kafka consumer properties. +In addition to having Kafka consumer properties, other configuration properties can be passed here. +For example some properties needed by the application such as spring.cloud.stream.kafka.bindings.input.consumer.configuration.foo=bar.

+
+

Default: Empty map.

+
+
+
dlqName
+
+

The name of the DLQ topic to receive the error messages.

+
+

Default: null (If not specified, messages that result in errors are forwarded to a topic named error.<destination>.<group>).

+
+
+
dlqProducerProperties
+
+

Using this, DLQ-specific producer properties can be set. +All the properties available through kafka producer properties can be set through this property. +When native decoding is enabled on the consumer (i.e., useNativeDecoding: true) , the application must provide corresponding key/value serializers for DLQ. +This must be provided in the form of dlqProducerProperties.configuration.key.serializer and dlqProducerProperties.configuration.value.serializer.

+
+

Default: Default Kafka producer properties.

+
+
+
standardHeaders
+
+

Indicates which standard headers are populated by the inbound channel adapter. +Allowed values: none, id, timestamp, or both. +Useful if using native deserialization and the first component to receive a message needs an id (such as an aggregator that is configured to use a JDBC message store).

+
+

Default: none

+
+
+
converterBeanName
+
+

The name of a bean that implements RecordMessageConverter. Used in the inbound channel adapter to replace the default MessagingMessageConverter.

+
+

Default: null

+
+
+
idleEventInterval
+
+

The interval, in milliseconds, between events indicating that no messages have recently been received. +Use an ApplicationListener<ListenerContainerIdleEvent> to receive these events. +See Example: Pausing and Resuming the Consumer for a usage example.

+
+

Default: 30000

+
+
+
destinationIsPattern
+
+

When true, the destination is treated as a regular expression Pattern used to match topic names by the broker. +When true, topics are not provisioned, and enableDlq is not allowed, because the binder does not know the topic names during the provisioning phase. +Note, the time taken to detect new topics that match the pattern is controlled by the consumer property metadata.max.age.ms, which (at the time of writing) defaults to 300,000ms (5 minutes). +This can be configured using the configuration property above.

+
+

Default: false

+
+
+
topic.properties
+
+

A Map of Kafka topic properties used when provisioning new topics — for example, spring.cloud.stream.kafka.bindings.input.consumer.topic.properties.message.format.version=0.9.0.0

+
+

Default: none.

+
+
+
topic.replicas-assignment
+
+

A Map<Integer, List<Integer>> of replica assignments, with the key being the partition and the value being the assignments. +Used when provisioning new topics. +See the NewTopic Javadocs in the kafka-clients jar.

+
+

Default: none.

+
+
+
topic.replication-factor
+
+

The replication factor to use when provisioning topics. Overrides the binder-wide setting. +Ignored if replicas-assignments is present.

+
+

Default: none (the binder-wide default of 1 is used).

+
+
+
pollTimeout
+
+

Timeout used for polling in pollable consumers.

+
+

Default: 5 seconds.

+
+
+
+
+
+
+

Consuming Batches

+
+

Starting with version 3.0, when spring.cloud.stream.binding.<name>.consumer.batch-mode is set to true, all of the records received by polling the Kafka Consumer will be presented as a List<?> to the listener method. +Otherwise, the method will be called with one record at a time. +The size of the batch is controlled by Kafka consumer properties max.poll.records, min.fetch.bytes, fetch.max.wait.ms; refer to the Kafka documentation for more information.

+
+
+

Bear in mind that batch mode is not supported with @StreamListener - it only works with the newer functional programming model.

+
+
+ + + + + +
+ + +Retry within the binder is not supported when using batch mode, so maxAttempts will be overridden to 1. +You can configure a SeekToCurrentBatchErrorHandler (using a ListenerContainerCustomizer) to achieve similar functionality to retry in the binder. +You can also use a manual AckMode and call Ackowledgment.nack(index, sleep) to commit the offsets for a partial batch and have the remaining records redelivered. +Refer to the Spring for Apache Kafka documentation for more information about these techniques. +
+
+
+
+

Kafka Producer Properties

+
+ + + + + +
+ + +To avoid repetition, Spring Cloud Stream supports setting values for all channels, in the format of spring.cloud.stream.kafka.default.producer.<property>=<value>. +
+
+
+

The following properties are available for Kafka producers only and +must be prefixed with spring.cloud.stream.kafka.bindings.<channelName>.producer..

+
+
+
+
admin.configuration
+
+

Since version 2.1.1, this property is deprecated in favor of topic.properties, and support for it will be removed in a future version.

+
+
admin.replicas-assignment
+
+

Since version 2.1.1, this property is deprecated in favor of topic.replicas-assignment, and support for it will be removed in a future version.

+
+
admin.replication-factor
+
+

Since version 2.1.1, this property is deprecated in favor of topic.replication-factor, and support for it will be removed in a future version.

+
+
bufferSize
+
+

Upper limit, in bytes, of how much data the Kafka producer attempts to batch before sending.

+
+

Default: 16384.

+
+
+
sync
+
+

Whether the producer is synchronous.

+
+

Default: false.

+
+
+
sendTimeoutExpression
+
+

A SpEL expression evaluated against the outgoing message used to evaluate the time to wait for ack when synchronous publish is enabled — for example, headers['mySendTimeout']. +The value of the timeout is in milliseconds. +With versions before 3.0, the payload could not be used unless native encoding was being used because, by the time this expression was evaluated, the payload was already in the form of a byte[]. +Now, the expression is evaluated before the payload is converted.

+
+

Default: none.

+
+
+
batchTimeout
+
+

How long the producer waits to allow more messages to accumulate in the same batch before sending the messages. +(Normally, the producer does not wait at all and simply sends all the messages that accumulated while the previous send was in progress.) A non-zero value may increase throughput at the expense of latency.

+
+

Default: 0.

+
+
+
messageKeyExpression
+
+

A SpEL expression evaluated against the outgoing message used to populate the key of the produced Kafka message — for example, headers['myKey']. +With versions before 3.0, the payload could not be used unless native encoding was being used because, by the time this expression was evaluated, the payload was already in the form of a byte[]. +Now, the expression is evaluated before the payload is converted.

+
+

Default: none.

+
+
+
headerPatterns
+
+

A comma-delimited list of simple patterns to match Spring messaging headers to be mapped to the Kafka Headers in the ProducerRecord. +Patterns can begin or end with the wildcard character (asterisk). +Patterns can be negated by prefixing with !. +Matching stops after the first match (positive or negative). +For example !ask,as* will pass ash but not ask. +id and timestamp are never mapped.

+
+

Default: * (all headers - except the id and timestamp)

+
+
+
configuration
+
+

Map with a key/value pair containing generic Kafka producer properties.

+
+

Default: Empty map.

+
+
+
topic.properties
+
+

A Map of Kafka topic properties used when provisioning new topics — for example, spring.cloud.stream.kafka.bindings.output.producer.topic.properties.message.format.version=0.9.0.0

+
+
topic.replicas-assignment
+
+

A Map<Integer, List<Integer>> of replica assignments, with the key being the partition and the value being the assignments. +Used when provisioning new topics. +See the NewTopic Javadocs in the kafka-clients jar.

+
+

Default: none.

+
+
+
topic.replication-factor
+
+

The replication factor to use when provisioning topics. Overrides the binder-wide setting. +Ignored if replicas-assignments is present.

+
+

Default: none (the binder-wide default of 1 is used).

+
+
+
useTopicHeader
+
+

Set to true to override the default binding destination (topic name) with the value of the KafkaHeaders.TOPIC message header in the outbound message. +If the header is not present, the default binding destination is used. +Default: false.

+
+
recordMetadataChannel
+
+

The bean name of a MessageChannel to which successful send results should be sent; the bean must exist in the application context. +The message sent to the channel is the sent message (after conversion, if any) with an additional header KafkaHeaders.RECORD_METADATA. +The header contains a RecordMetadata object provided by the Kafka client; it includes the partition and offset where the record was written in the topic.

+
+
+
+
+

ResultMetadata meta = sendResultMsg.getHeaders().get(KafkaHeaders.RECORD_METADATA, RecordMetadata.class)

+
+
+

Failed sends go the producer error channel (if configured); see Error Channels. +Default: null

+
+
+

+

+
+
+ + + + + +
+ + +The Kafka binder uses the partitionCount setting of the producer as a hint to create a topic with the given partition count (in conjunction with the minPartitionCount, the maximum of the two being the value being used). +Exercise caution when configuring both minPartitionCount for a binder and partitionCount for an application, as the larger value is used. +If a topic already exists with a smaller partition count and autoAddPartitions is disabled (the default), the binder fails to start. +If a topic already exists with a smaller partition count and autoAddPartitions is enabled, new partitions are added. +If a topic already exists with a larger number of partitions than the maximum of (minPartitionCount or partitionCount), the existing partition count is used. +
+
+
+
+
compression
+
+

Set the compression.type producer property. +Supported values are none, gzip, snappy and lz4. +If you override the kafka-clients jar to 2.1.0 (or later), as discussed in the Spring for Apache Kafka documentation, and wish to use zstd compression, use spring.cloud.stream.kafka.bindings.<binding-name>.producer.configuration.compression.type=zstd.

+
+

Default: none.

+
+
+
closeTimeout
+
+

Timeout in number of seconds to wait for when closing the producer.

+
+

Default: 30

+
+
+
+
+
+
+

Usage examples

+
+

In this section, we show the use of the preceding properties for specific scenarios.

+
+
+
Example: Setting autoCommitOffset to false and Relying on Manual Acking
+
+

This example illustrates how one may manually acknowledge offsets in a consumer application.

+
+
+

This example requires that spring.cloud.stream.kafka.bindings.input.consumer.autoCommitOffset be set to false. +Use the corresponding input channel name for your example.

+
+
+
+
@SpringBootApplication
+@EnableBinding(Sink.class)
+public class ManuallyAcknowdledgingConsumer {
+
+ public static void main(String[] args) {
+     SpringApplication.run(ManuallyAcknowdledgingConsumer.class, args);
+ }
+
+ @StreamListener(Sink.INPUT)
+ public void process(Message<?> message) {
+     Acknowledgment acknowledgment = message.getHeaders().get(KafkaHeaders.ACKNOWLEDGMENT, Acknowledgment.class);
+     if (acknowledgment != null) {
+         System.out.println("Acknowledgment provided");
+         acknowledgment.acknowledge();
+     }
+ }
+}
+
+
+
+
+
Example: Security Configuration
+
+

Apache Kafka 0.9 supports secure connections between client and brokers. +To take advantage of this feature, follow the guidelines in the Apache Kafka Documentation as well as the Kafka 0.9 security guidelines from the Confluent documentation. +Use the spring.cloud.stream.kafka.binder.configuration option to set security properties for all clients created by the binder.

+
+
+

For example, to set security.protocol to SASL_SSL, set the following property:

+
+
+
+
spring.cloud.stream.kafka.binder.configuration.security.protocol=SASL_SSL
+
+
+
+

All the other security properties can be set in a similar manner.

+
+
+

When using Kerberos, follow the instructions in the reference documentation for creating and referencing the JAAS configuration.

+
+
+

Spring Cloud Stream supports passing JAAS configuration information to the application by using a JAAS configuration file and using Spring Boot properties.

+
+
+
Using JAAS Configuration Files
+
+

The JAAS and (optionally) krb5 file locations can be set for Spring Cloud Stream applications by using system properties. +The following example shows how to launch a Spring Cloud Stream application with SASL and Kerberos by using a JAAS configuration file:

+
+
+
+
 java -Djava.security.auth.login.config=/path.to/kafka_client_jaas.conf -jar log.jar \
+   --spring.cloud.stream.kafka.binder.brokers=secure.server:9092 \
+   --spring.cloud.stream.bindings.input.destination=stream.ticktock \
+   --spring.cloud.stream.kafka.binder.configuration.security.protocol=SASL_PLAINTEXT
+
+
+
+
+
Using Spring Boot Properties
+
+

As an alternative to having a JAAS configuration file, Spring Cloud Stream provides a mechanism for setting up the JAAS configuration for Spring Cloud Stream applications by using Spring Boot properties.

+
+
+

The following properties can be used to configure the login context of the Kafka client:

+
+
+
+
spring.cloud.stream.kafka.binder.jaas.loginModule
+
+

The login module name. Not necessary to be set in normal cases.

+
+

Default: com.sun.security.auth.module.Krb5LoginModule.

+
+
+
spring.cloud.stream.kafka.binder.jaas.controlFlag
+
+

The control flag of the login module.

+
+

Default: required.

+
+
+
spring.cloud.stream.kafka.binder.jaas.options
+
+

Map with a key/value pair containing the login module options.

+
+

Default: Empty map.

+
+
+
+
+
+

The following example shows how to launch a Spring Cloud Stream application with SASL and Kerberos by using Spring Boot configuration properties:

+
+
+
+
 java --spring.cloud.stream.kafka.binder.brokers=secure.server:9092 \
+   --spring.cloud.stream.bindings.input.destination=stream.ticktock \
+   --spring.cloud.stream.kafka.binder.autoCreateTopics=false \
+   --spring.cloud.stream.kafka.binder.configuration.security.protocol=SASL_PLAINTEXT \
+   --spring.cloud.stream.kafka.binder.jaas.options.useKeyTab=true \
+   --spring.cloud.stream.kafka.binder.jaas.options.storeKey=true \
+   --spring.cloud.stream.kafka.binder.jaas.options.keyTab=/etc/security/keytabs/kafka_client.keytab \
+   --spring.cloud.stream.kafka.binder.jaas.options.principal=kafka-client-1@EXAMPLE.COM
+
+
+
+

The preceding example represents the equivalent of the following JAAS file:

+
+
+
+
KafkaClient {
+    com.sun.security.auth.module.Krb5LoginModule required
+    useKeyTab=true
+    storeKey=true
+    keyTab="/etc/security/keytabs/kafka_client.keytab"
+    principal="kafka-client-1@EXAMPLE.COM";
+};
+
+
+
+

If the topics required already exist on the broker or will be created by an administrator, autocreation can be turned off and only client JAAS properties need to be sent.

+
+
+ + + + + +
+ + +Do not mix JAAS configuration files and Spring Boot properties in the same application. +If the -Djava.security.auth.login.config system property is already present, Spring Cloud Stream ignores the Spring Boot properties. +
+
+
+ + + + + +
+ + +Be careful when using the autoCreateTopics and autoAddPartitions with Kerberos. +Usually, applications may use principals that do not have administrative rights in Kafka and Zookeeper. +Consequently, relying on Spring Cloud Stream to create/modify topics may fail. +In secure environments, we strongly recommend creating topics and managing ACLs administratively by using Kafka tooling. +
+
+
+
+
+
Example: Pausing and Resuming the Consumer
+
+

If you wish to suspend consumption but not cause a partition rebalance, you can pause and resume the consumer. +This is facilitated by adding the Consumer as a parameter to your @StreamListener. +To resume, you need an ApplicationListener for ListenerContainerIdleEvent instances. +The frequency at which events are published is controlled by the idleEventInterval property. +Since the consumer is not thread-safe, you must call these methods on the calling thread.

+
+
+

The following simple application shows how to pause and resume:

+
+
+
+
@SpringBootApplication
+@EnableBinding(Sink.class)
+public class Application {
+
+	public static void main(String[] args) {
+		SpringApplication.run(Application.class, args);
+	}
+
+	@StreamListener(Sink.INPUT)
+	public void in(String in, @Header(KafkaHeaders.CONSUMER) Consumer<?, ?> consumer) {
+		System.out.println(in);
+		consumer.pause(Collections.singleton(new TopicPartition("myTopic", 0)));
+	}
+
+	@Bean
+	public ApplicationListener<ListenerContainerIdleEvent> idleListener() {
+		return event -> {
+			System.out.println(event);
+			if (event.getConsumer().paused().size() > 0) {
+				event.getConsumer().resume(event.getConsumer().paused());
+			}
+		};
+	}
+
+}
+
+
+
+
+
+
+

Transactional Binder

+
+

Enable transactions by setting spring.cloud.stream.kafka.binder.transaction.transactionIdPrefix to a non-empty value, e.g. tx-. +When used in a processor application, the consumer starts the transaction; any records sent on the consumer thread participate in the same transaction. +When the listener exits normally, the listener container will send the offset to the transaction and commit it. +A common producer factory is used for all producer bindings configured using spring.cloud.stream.kafka.binder.transaction.producer.* properties; individual binding Kafka producer properties are ignored.

+
+
+ + + + + +
+ + +Normal binder retries (and dead lettering) are not supported with transactions because the retries will run in the original transaction, which may be rolled back and any published records will be rolled back too. +When retries are enabled (the common property maxAttempts is greater than zero) the retry properties are used to configure a DefaultAfterRollbackProcessor to enable retries at the container level. +Similarly, instead of publishing dead-letter records within the transaction, this functionality is moved to the listener container, again via the DefaultAfterRollbackProcessor which runs after the main transaction has rolled back. +
+
+
+

If you wish to use transactions in a source application, or from some arbitrary thread for producer-only transaction (e.g. @Scheduled method), you must get a reference to the transactional producer factory and define a KafkaTransactionManager bean using it.

+
+
+
+
+
+
@Bean
+public PlatformTransactionManager transactionManager(BinderFactory binders) {
+    ProducerFactory<byte[], byte[]> pf = ((KafkaMessageChannelBinder) binders.getBinder(null,
+            MessageChannel.class)).getTransactionalProducerFactory();
+    return new KafkaTransactionManager<>(pf);
+}
+
+
+
+
+
+

Notice that we get a reference to the binder using the BinderFactory; use null in the first argument when there is only one binder configured. +If more than one binder is configured, use the binder name to get the reference. +Once we have a reference to the binder, we can obtain a reference to the ProducerFactory and create a transaction manager.

+
+
+

Then you would use normal Spring transaction support, e.g. TransactionTemplate or @Transactional, for example:

+
+
+
+
+
+
public static class Sender {
+
+    @Transactional
+    public void doInTransaction(MessageChannel output, List<String> stuffToSend) {
+        stuffToSend.forEach(stuff -> output.send(new GenericMessage<>(stuff)));
+    }
+
+}
+
+
+
+
+
+

If you wish to synchronize producer-only transactions with those from some other transaction manager, use a ChainedTransactionManager.

+
+
+
+

Error Channels

+
+

Starting with version 1.3, the binder unconditionally sends exceptions to an error channel for each consumer destination and can also be configured to send async producer send failures to an error channel. +See [spring-cloud-stream-overview-error-handling] for more information.

+
+
+

The payload of the ErrorMessage for a send failure is a KafkaSendFailureException with properties:

+
+
+
    +
  • +

    failedMessage: The Spring Messaging Message<?> that failed to be sent.

    +
  • +
  • +

    record: The raw ProducerRecord that was created from the failedMessage

    +
  • +
+
+
+

There is no automatic handling of producer exceptions (such as sending to a Dead-Letter queue). +You can consume these exceptions with your own Spring Integration flow.

+
+
+
+

Kafka Metrics

+
+

Kafka binder module exposes the following metrics:

+
+
+

spring.cloud.stream.binder.kafka.offset: This metric indicates how many messages have not been yet consumed from a given binder’s topic by a given consumer group. +The metrics provided are based on the Mircometer metrics library. The metric contains the consumer group information, topic and the actual lag in committed offset from the latest offset on the topic. +This metric is particularly useful for providing auto-scaling feedback to a PaaS platform.

+
+
+
+

Tombstone Records (null record values)

+
+

When using compacted topics, a record with a null value (also called a tombstone record) represents the deletion of a key. +To receive such messages in a @StreamListener method, the parameter must be marked as not required to receive a null value argument.

+
+
+
+
+
+
@StreamListener(Sink.INPUT)
+public void in(@Header(KafkaHeaders.RECEIVED_MESSAGE_KEY) byte[] key,
+               @Payload(required = false) Customer customer) {
+    // customer is null if a tombstone record
+    ...
+}
+
+
+
+
+
+
+

Using a KafkaRebalanceListener

+
+

Applications may wish to seek topics/partitions to arbitrary offsets when the partitions are initially assigned, or perform other operations on the consumer. +Starting with version 2.1, if you provide a single KafkaRebalanceListener bean in the application context, it will be wired into all Kafka consumer bindings.

+
+
+
+
+
+
public interface KafkaBindingRebalanceListener {
+
+	/**
+	 * Invoked by the container before any pending offsets are committed.
+	 * @param bindingName the name of the binding.
+	 * @param consumer the consumer.
+	 * @param partitions the partitions.
+	 */
+	default void onPartitionsRevokedBeforeCommit(String bindingName, Consumer<?, ?> consumer,
+			Collection<TopicPartition> partitions) {
+
+	}
+
+	/**
+	 * Invoked by the container after any pending offsets are committed.
+	 * @param bindingName the name of the binding.
+	 * @param consumer the consumer.
+	 * @param partitions the partitions.
+	 */
+	default void onPartitionsRevokedAfterCommit(String bindingName, Consumer<?, ?> consumer, Collection<TopicPartition> partitions) {
+
+	}
+
+	/**
+	 * Invoked when partitions are initially assigned or after a rebalance.
+	 * Applications might only want to perform seek operations on an initial assignment.
+	 * @param bindingName the name of the binding.
+	 * @param consumer the consumer.
+	 * @param partitions the partitions.
+	 * @param initial true if this is the initial assignment.
+	 */
+	default void onPartitionsAssigned(String bindingName, Consumer<?, ?> consumer, Collection<TopicPartition> partitions,
+			boolean initial) {
+
+	}
+
+}
+
+
+
+
+
+

You cannot set the resetOffsets consumer property to true when you provide a rebalance listener.

+
+
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/partitions.html b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/partitions.html new file mode 100644 index 00000000..adc49245 --- /dev/null +++ b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/partitions.html @@ -0,0 +1,241 @@ + + + + + + + +Partitioning with the Kafka Binder + + + + + + + + + + +
+
+

Partitioning with the Kafka Binder

+
+

Apache Kafka supports topic partitioning natively.

+
+
+

Sometimes it is advantageous to send data to specific partitions — for example, when you want to strictly order message processing (all messages for a particular customer should go to the same partition).

+
+
+

The following example shows how to configure the producer and consumer side:

+
+
+
+
@SpringBootApplication
+@EnableBinding(Source.class)
+public class KafkaPartitionProducerApplication {
+
+    private static final Random RANDOM = new Random(System.currentTimeMillis());
+
+    private static final String[] data = new String[] {
+            "foo1", "bar1", "qux1",
+            "foo2", "bar2", "qux2",
+            "foo3", "bar3", "qux3",
+            "foo4", "bar4", "qux4",
+            };
+
+    public static void main(String[] args) {
+        new SpringApplicationBuilder(KafkaPartitionProducerApplication.class)
+            .web(false)
+            .run(args);
+    }
+
+    @InboundChannelAdapter(channel = Source.OUTPUT, poller = @Poller(fixedRate = "5000"))
+    public Message<?> generate() {
+        String value = data[RANDOM.nextInt(data.length)];
+        System.out.println("Sending: " + value);
+        return MessageBuilder.withPayload(value)
+                .setHeader("partitionKey", value)
+                .build();
+    }
+
+}
+
+
+
+
application.yml
+
+
spring:
+  cloud:
+    stream:
+      bindings:
+        output:
+          destination: partitioned.topic
+          producer:
+            partition-key-expression: headers['partitionKey']
+            partition-count: 12
+
+
+
+ + + + + +
+ + +The topic must be provisioned to have enough partitions to achieve the desired concurrency for all consumer groups. +The above configuration supports up to 12 consumer instances (6 if their concurrency is 2, 4 if their concurrency is 3, and so on). +It is generally best to “over-provision” the partitions to allow for future increases in consumers or concurrency. +
+
+
+ + + + + +
+ + +The preceding configuration uses the default partitioning (key.hashCode() % partitionCount). +This may or may not provide a suitably balanced algorithm, depending on the key values. +You can override this default by using the partitionSelectorExpression or partitionSelectorClass properties. +
+
+
+

Since partitions are natively handled by Kafka, no special configuration is needed on the consumer side. +Kafka allocates partitions across the instances.

+
+
+

The following Spring Boot application listens to a Kafka stream and prints (to the console) the partition ID to which each message goes:

+
+
+
+
@SpringBootApplication
+@EnableBinding(Sink.class)
+public class KafkaPartitionConsumerApplication {
+
+    public static void main(String[] args) {
+        new SpringApplicationBuilder(KafkaPartitionConsumerApplication.class)
+            .web(false)
+            .run(args);
+    }
+
+    @StreamListener(Sink.INPUT)
+    public void listen(@Payload String in, @Header(KafkaHeaders.RECEIVED_PARTITION_ID) int partition) {
+        System.out.println(in + " received from partition " + partition);
+    }
+
+}
+
+
+
+
application.yml
+
+
spring:
+  cloud:
+    stream:
+      bindings:
+        input:
+          destination: partitioned.topic
+          group: myGroup
+
+
+
+

You can add instances as needed. +Kafka rebalances the partition allocations. +If the instance count (or instance count * concurrency) exceeds the number of partitions, some consumers are idle.

+
+
+
+ + + + + + + \ No newline at end of file diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/spring-cloud-stream-binder-kafka-aggregate.html b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/spring-cloud-stream-binder-kafka-aggregate.html new file mode 100644 index 00000000..270f3513 --- /dev/null +++ b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/spring-cloud-stream-binder-kafka-aggregate.html @@ -0,0 +1,1417 @@ + + + + + + + +Apache Kafka Binder + + + + + + + + + + +
+
+
+ +
+
+
+

Apache Kafka Binder

+
+

Usage

+
+

To use Apache Kafka binder, you need to add spring-cloud-stream-binder-kafka as a dependency to your Spring Cloud Stream application, as shown in the following example for Maven:

+
+
+
+
<dependency>
+  <groupId>org.springframework.cloud</groupId>
+  <artifactId>spring-cloud-stream-binder-kafka</artifactId>
+</dependency>
+
+
+
+

Alternatively, you can also use the Spring Cloud Stream Kafka Starter, as shown in the following example for Maven:

+
+
+
+
<dependency>
+  <groupId>org.springframework.cloud</groupId>
+  <artifactId>spring-cloud-starter-stream-kafka</artifactId>
+</dependency>
+
+
+
+
+

Overview

+
+

The following image shows a simplified diagram of how the Apache Kafka binder operates:

+
+
+
+kafka binder +
+
Figure 1. Kafka Binder
+
+
+

The Apache Kafka Binder implementation maps each destination to an Apache Kafka topic. +The consumer group maps directly to the same Apache Kafka concept. +Partitioning also maps directly to Apache Kafka partitions as well.

+
+
+

The binder currently uses the Apache Kafka kafka-clients version 2.3.1. +This client can communicate with older brokers (see the Kafka documentation), but certain features may not be available. +For example, with versions earlier than 0.11.x.x, native headers are not supported. +Also, 0.11.x.x does not support the autoAddPartitions property.

+
+
+
+

Configuration Options

+
+

This section contains the configuration options used by the Apache Kafka binder.

+
+
+

For common configuration options and properties pertaining to binder, see the core documentation.

+
+
+
Kafka Binder Properties
+
+
+
spring.cloud.stream.kafka.binder.brokers
+
+

A list of brokers to which the Kafka binder connects.

+
+

Default: localhost.

+
+
+
spring.cloud.stream.kafka.binder.defaultBrokerPort
+
+

brokers allows hosts specified with or without port information (for example, host1,host2:port2). +This sets the default port when no port is configured in the broker list.

+
+

Default: 9092.

+
+
+
spring.cloud.stream.kafka.binder.configuration
+
+

Key/Value map of client properties (both producers and consumer) passed to all clients created by the binder. +Due to the fact that these properties are used by both producers and consumers, usage should be restricted to common properties — for example, security settings. +Unknown Kafka producer or consumer properties provided through this configuration are filtered out and not allowed to propagate. +Properties here supersede any properties set in boot.

+
+

Default: Empty map.

+
+
+
spring.cloud.stream.kafka.binder.consumerProperties
+
+

Key/Value map of arbitrary Kafka client consumer properties. +In addition to support known Kafka consumer properties, unknown consumer properties are allowed here as well. +Properties here supersede any properties set in boot and in the configuration property above.

+
+

Default: Empty map.

+
+
+
spring.cloud.stream.kafka.binder.headers
+
+

The list of custom headers that are transported by the binder. +Only required when communicating with older applications (⇐ 1.3.x) with a kafka-clients version < 0.11.0.0. Newer versions support headers natively.

+
+

Default: empty.

+
+
+
spring.cloud.stream.kafka.binder.healthTimeout
+
+

The time to wait to get partition information, in seconds. +Health reports as down if this timer expires.

+
+

Default: 10.

+
+
+
spring.cloud.stream.kafka.binder.requiredAcks
+
+

The number of required acks on the broker. +See the Kafka documentation for the producer acks property.

+
+

Default: 1.

+
+
+
spring.cloud.stream.kafka.binder.minPartitionCount
+
+

Effective only if autoCreateTopics or autoAddPartitions is set. +The global minimum number of partitions that the binder configures on topics on which it produces or consumes data. +It can be superseded by the partitionCount setting of the producer or by the value of instanceCount * concurrency settings of the producer (if either is larger).

+
+

Default: 1.

+
+
+
spring.cloud.stream.kafka.binder.producerProperties
+
+

Key/Value map of arbitrary Kafka client producer properties. +In addition to support known Kafka producer properties, unknown producer properties are allowed here as well. +Properties here supersede any properties set in boot and in the configuration property above.

+
+

Default: Empty map.

+
+
+
spring.cloud.stream.kafka.binder.replicationFactor
+
+

The replication factor of auto-created topics if autoCreateTopics is active. +Can be overridden on each binding.

+
+

Default: 1.

+
+
+
spring.cloud.stream.kafka.binder.autoCreateTopics
+
+

If set to true, the binder creates new topics automatically. +If set to false, the binder relies on the topics being already configured. +In the latter case, if the topics do not exist, the binder fails to start.

+
+ + + + + +
+ + +This setting is independent of the auto.create.topics.enable setting of the broker and does not influence it. +If the server is set to auto-create topics, they may be created as part of the metadata retrieval request, with default broker settings. +
+
+
+

Default: true.

+
+
+
spring.cloud.stream.kafka.binder.autoAddPartitions
+
+

If set to true, the binder creates new partitions if required. +If set to false, the binder relies on the partition size of the topic being already configured. +If the partition count of the target topic is smaller than the expected value, the binder fails to start.

+
+

Default: false.

+
+
+
spring.cloud.stream.kafka.binder.transaction.transactionIdPrefix
+
+

Enables transactions in the binder. See transaction.id in the Kafka documentation and Transactions in the spring-kafka documentation. +When transactions are enabled, individual producer properties are ignored and all producers use the spring.cloud.stream.kafka.binder.transaction.producer.* properties.

+
+

Default null (no transactions)

+
+
+
spring.cloud.stream.kafka.binder.transaction.producer.*
+
+

Global producer properties for producers in a transactional binder. +See spring.cloud.stream.kafka.binder.transaction.transactionIdPrefix and Kafka Producer Properties and the general producer properties supported by all binders.

+
+

Default: See individual producer properties.

+
+
+
spring.cloud.stream.kafka.binder.headerMapperBeanName
+
+

The bean name of a KafkaHeaderMapper used for mapping spring-messaging headers to and from Kafka headers. +Use this, for example, if you wish to customize the trusted packages in a BinderHeaderMapper bean that uses JSON deserialization for the headers. +If this custom BinderHeaderMapper bean is not made available to the binder using this property, then the binder will look for a header mapper bean with the name kafkaBinderHeaderMapper that is of type BinderHeaderMapper before falling back to a default BinderHeaderMapper created by the binder.

+
+

Default: none.

+
+
+
+
+
+
+
Kafka Consumer Properties
+
+ + + + + +
+ + +To avoid repetition, Spring Cloud Stream supports setting values for all channels, in the format of spring.cloud.stream.kafka.default.consumer.<property>=<value>. +
+
+
+

The following properties are available for Kafka consumers only and +must be prefixed with spring.cloud.stream.kafka.bindings.<channelName>.consumer..

+
+
+
+
admin.configuration
+
+

Since version 2.1.1, this property is deprecated in favor of topic.properties, and support for it will be removed in a future version.

+
+
admin.replicas-assignment
+
+

Since version 2.1.1, this property is deprecated in favor of topic.replicas-assignment, and support for it will be removed in a future version.

+
+
admin.replication-factor
+
+

Since version 2.1.1, this property is deprecated in favor of topic.replication-factor, and support for it will be removed in a future version.

+
+
autoRebalanceEnabled
+
+

When true, topic partitions is automatically rebalanced between the members of a consumer group. +When false, each consumer is assigned a fixed set of partitions based on spring.cloud.stream.instanceCount and spring.cloud.stream.instanceIndex. +This requires both the spring.cloud.stream.instanceCount and spring.cloud.stream.instanceIndex properties to be set appropriately on each launched instance. +The value of the spring.cloud.stream.instanceCount property must typically be greater than 1 in this case.

+
+

Default: true.

+
+
+
ackEachRecord
+
+

When autoCommitOffset is true, this setting dictates whether to commit the offset after each record is processed. +By default, offsets are committed after all records in the batch of records returned by consumer.poll() have been processed. +The number of records returned by a poll can be controlled with the max.poll.records Kafka property, which is set through the consumer configuration property. +Setting this to true may cause a degradation in performance, but doing so reduces the likelihood of redelivered records when a failure occurs. +Also, see the binder requiredAcks property, which also affects the performance of committing offsets.

+
+

Default: false.

+
+
+
autoCommitOffset
+
+

Whether to autocommit offsets when a message has been processed. +If set to false, a header with the key kafka_acknowledgment of the type org.springframework.kafka.support.Acknowledgment header is present in the inbound message. +Applications may use this header for acknowledging messages. +See the examples section for details. +When this property is set to false, Kafka binder sets the ack mode to org.springframework.kafka.listener.AbstractMessageListenerContainer.AckMode.MANUAL and the application is responsible for acknowledging records. +Also see ackEachRecord.

+
+

Default: true.

+
+
+
autoCommitOnError
+
+

Effective only if autoCommitOffset is set to true. +If set to false, it suppresses auto-commits for messages that result in errors and commits only for successful messages. It allows a stream to automatically replay from the last successfully processed message, in case of persistent failures. +If set to true, it always auto-commits (if auto-commit is enabled). +If not set (the default), it effectively has the same value as enableDlq, auto-committing erroneous messages if they are sent to a DLQ and not committing them otherwise.

+
+

Default: not set.

+
+
+
resetOffsets
+
+

Whether to reset offsets on the consumer to the value provided by startOffset. +Must be false if a KafkaRebalanceListener is provided; see Using a KafkaRebalanceListener.

+
+

Default: false.

+
+
+
startOffset
+
+

The starting offset for new groups. +Allowed values: earliest and latest. +If the consumer group is set explicitly for the consumer 'binding' (through spring.cloud.stream.bindings.<channelName>.group), 'startOffset' is set to earliest. Otherwise, it is set to latest for the anonymous consumer group. +Also see resetOffsets (earlier in this list).

+
+

Default: null (equivalent to earliest).

+
+
+
enableDlq
+
+

When set to true, it enables DLQ behavior for the consumer. +By default, messages that result in errors are forwarded to a topic named error.<destination>.<group>. +The DLQ topic name can be configurable by setting the dlqName property. +This provides an alternative option to the more common Kafka replay scenario for the case when the number of errors is relatively small and replaying the entire original topic may be too cumbersome. +See Dead-Letter Topic Processing processing for more information. +Starting with version 2.0, messages sent to the DLQ topic are enhanced with the following headers: x-original-topic, x-exception-message, and x-exception-stacktrace as byte[]. +By default, a failed record is sent to the same partition number in the DLQ topic as the original record. +See Dead-Letter Topic Partition Selection for how to change that behavior. +Not allowed when destinationIsPattern is true.

+
+

Default: false.

+
+
+
dlqPartitions
+
+

When enableDlq is true, and this property is not set, a dead letter topic with the same number of partitions as the primary topic(s) is created. +Usually, dead-letter records are sent to the same partition in the dead-letter topic as the original record. +This behavior can be changed; see Dead-Letter Topic Partition Selection. +If this property is set to 1 and there is no DqlPartitionFunction bean, all dead-letter records will be written to partition 0. +If this property is greater than 1, you MUST provide a DlqPartitionFunction bean. +Note that the actual partition count is affected by the binder’s minPartitionCount property.

+
+

Default: none

+
+
+
configuration
+
+

Map with a key/value pair containing generic Kafka consumer properties. +In addition to having Kafka consumer properties, other configuration properties can be passed here. +For example some properties needed by the application such as spring.cloud.stream.kafka.bindings.input.consumer.configuration.foo=bar.

+
+

Default: Empty map.

+
+
+
dlqName
+
+

The name of the DLQ topic to receive the error messages.

+
+

Default: null (If not specified, messages that result in errors are forwarded to a topic named error.<destination>.<group>).

+
+
+
dlqProducerProperties
+
+

Using this, DLQ-specific producer properties can be set. +All the properties available through kafka producer properties can be set through this property. +When native decoding is enabled on the consumer (i.e., useNativeDecoding: true) , the application must provide corresponding key/value serializers for DLQ. +This must be provided in the form of dlqProducerProperties.configuration.key.serializer and dlqProducerProperties.configuration.value.serializer.

+
+

Default: Default Kafka producer properties.

+
+
+
standardHeaders
+
+

Indicates which standard headers are populated by the inbound channel adapter. +Allowed values: none, id, timestamp, or both. +Useful if using native deserialization and the first component to receive a message needs an id (such as an aggregator that is configured to use a JDBC message store).

+
+

Default: none

+
+
+
converterBeanName
+
+

The name of a bean that implements RecordMessageConverter. Used in the inbound channel adapter to replace the default MessagingMessageConverter.

+
+

Default: null

+
+
+
idleEventInterval
+
+

The interval, in milliseconds, between events indicating that no messages have recently been received. +Use an ApplicationListener<ListenerContainerIdleEvent> to receive these events. +See Example: Pausing and Resuming the Consumer for a usage example.

+
+

Default: 30000

+
+
+
destinationIsPattern
+
+

When true, the destination is treated as a regular expression Pattern used to match topic names by the broker. +When true, topics are not provisioned, and enableDlq is not allowed, because the binder does not know the topic names during the provisioning phase. +Note, the time taken to detect new topics that match the pattern is controlled by the consumer property metadata.max.age.ms, which (at the time of writing) defaults to 300,000ms (5 minutes). +This can be configured using the configuration property above.

+
+

Default: false

+
+
+
topic.properties
+
+

A Map of Kafka topic properties used when provisioning new topics — for example, spring.cloud.stream.kafka.bindings.input.consumer.topic.properties.message.format.version=0.9.0.0

+
+

Default: none.

+
+
+
topic.replicas-assignment
+
+

A Map<Integer, List<Integer>> of replica assignments, with the key being the partition and the value being the assignments. +Used when provisioning new topics. +See the NewTopic Javadocs in the kafka-clients jar.

+
+

Default: none.

+
+
+
topic.replication-factor
+
+

The replication factor to use when provisioning topics. Overrides the binder-wide setting. +Ignored if replicas-assignments is present.

+
+

Default: none (the binder-wide default of 1 is used).

+
+
+
pollTimeout
+
+

Timeout used for polling in pollable consumers.

+
+

Default: 5 seconds.

+
+
+
+
+
+
+
Consuming Batches
+
+

Starting with version 3.0, when spring.cloud.stream.binding.<name>.consumer.batch-mode is set to true, all of the records received by polling the Kafka Consumer will be presented as a List<?> to the listener method. +Otherwise, the method will be called with one record at a time. +The size of the batch is controlled by Kafka consumer properties max.poll.records, min.fetch.bytes, fetch.max.wait.ms; refer to the Kafka documentation for more information.

+
+
+

Bear in mind that batch mode is not supported with @StreamListener - it only works with the newer functional programming model.

+
+
+ + + + + +
+ + +Retry within the binder is not supported when using batch mode, so maxAttempts will be overridden to 1. +You can configure a SeekToCurrentBatchErrorHandler (using a ListenerContainerCustomizer) to achieve similar functionality to retry in the binder. +You can also use a manual AckMode and call Ackowledgment.nack(index, sleep) to commit the offsets for a partial batch and have the remaining records redelivered. +Refer to the Spring for Apache Kafka documentation for more information about these techniques. +
+
+
+
+
Kafka Producer Properties
+
+ + + + + +
+ + +To avoid repetition, Spring Cloud Stream supports setting values for all channels, in the format of spring.cloud.stream.kafka.default.producer.<property>=<value>. +
+
+
+

The following properties are available for Kafka producers only and +must be prefixed with spring.cloud.stream.kafka.bindings.<channelName>.producer..

+
+
+
+
admin.configuration
+
+

Since version 2.1.1, this property is deprecated in favor of topic.properties, and support for it will be removed in a future version.

+
+
admin.replicas-assignment
+
+

Since version 2.1.1, this property is deprecated in favor of topic.replicas-assignment, and support for it will be removed in a future version.

+
+
admin.replication-factor
+
+

Since version 2.1.1, this property is deprecated in favor of topic.replication-factor, and support for it will be removed in a future version.

+
+
bufferSize
+
+

Upper limit, in bytes, of how much data the Kafka producer attempts to batch before sending.

+
+

Default: 16384.

+
+
+
sync
+
+

Whether the producer is synchronous.

+
+

Default: false.

+
+
+
sendTimeoutExpression
+
+

A SpEL expression evaluated against the outgoing message used to evaluate the time to wait for ack when synchronous publish is enabled — for example, headers['mySendTimeout']. +The value of the timeout is in milliseconds. +With versions before 3.0, the payload could not be used unless native encoding was being used because, by the time this expression was evaluated, the payload was already in the form of a byte[]. +Now, the expression is evaluated before the payload is converted.

+
+

Default: none.

+
+
+
batchTimeout
+
+

How long the producer waits to allow more messages to accumulate in the same batch before sending the messages. +(Normally, the producer does not wait at all and simply sends all the messages that accumulated while the previous send was in progress.) A non-zero value may increase throughput at the expense of latency.

+
+

Default: 0.

+
+
+
messageKeyExpression
+
+

A SpEL expression evaluated against the outgoing message used to populate the key of the produced Kafka message — for example, headers['myKey']. +With versions before 3.0, the payload could not be used unless native encoding was being used because, by the time this expression was evaluated, the payload was already in the form of a byte[]. +Now, the expression is evaluated before the payload is converted.

+
+

Default: none.

+
+
+
headerPatterns
+
+

A comma-delimited list of simple patterns to match Spring messaging headers to be mapped to the Kafka Headers in the ProducerRecord. +Patterns can begin or end with the wildcard character (asterisk). +Patterns can be negated by prefixing with !. +Matching stops after the first match (positive or negative). +For example !ask,as* will pass ash but not ask. +id and timestamp are never mapped.

+
+

Default: * (all headers - except the id and timestamp)

+
+
+
configuration
+
+

Map with a key/value pair containing generic Kafka producer properties.

+
+

Default: Empty map.

+
+
+
topic.properties
+
+

A Map of Kafka topic properties used when provisioning new topics — for example, spring.cloud.stream.kafka.bindings.output.producer.topic.properties.message.format.version=0.9.0.0

+
+
topic.replicas-assignment
+
+

A Map<Integer, List<Integer>> of replica assignments, with the key being the partition and the value being the assignments. +Used when provisioning new topics. +See the NewTopic Javadocs in the kafka-clients jar.

+
+

Default: none.

+
+
+
topic.replication-factor
+
+

The replication factor to use when provisioning topics. Overrides the binder-wide setting. +Ignored if replicas-assignments is present.

+
+

Default: none (the binder-wide default of 1 is used).

+
+
+
useTopicHeader
+
+

Set to true to override the default binding destination (topic name) with the value of the KafkaHeaders.TOPIC message header in the outbound message. +If the header is not present, the default binding destination is used. +Default: false.

+
+
recordMetadataChannel
+
+

The bean name of a MessageChannel to which successful send results should be sent; the bean must exist in the application context. +The message sent to the channel is the sent message (after conversion, if any) with an additional header KafkaHeaders.RECORD_METADATA. +The header contains a RecordMetadata object provided by the Kafka client; it includes the partition and offset where the record was written in the topic.

+
+
+
+
+

ResultMetadata meta = sendResultMsg.getHeaders().get(KafkaHeaders.RECORD_METADATA, RecordMetadata.class)

+
+
+

Failed sends go the producer error channel (if configured); see Error Channels. +Default: null

+
+
+

+

+
+
+ + + + + +
+ + +The Kafka binder uses the partitionCount setting of the producer as a hint to create a topic with the given partition count (in conjunction with the minPartitionCount, the maximum of the two being the value being used). +Exercise caution when configuring both minPartitionCount for a binder and partitionCount for an application, as the larger value is used. +If a topic already exists with a smaller partition count and autoAddPartitions is disabled (the default), the binder fails to start. +If a topic already exists with a smaller partition count and autoAddPartitions is enabled, new partitions are added. +If a topic already exists with a larger number of partitions than the maximum of (minPartitionCount or partitionCount), the existing partition count is used. +
+
+
+
+
compression
+
+

Set the compression.type producer property. +Supported values are none, gzip, snappy and lz4. +If you override the kafka-clients jar to 2.1.0 (or later), as discussed in the Spring for Apache Kafka documentation, and wish to use zstd compression, use spring.cloud.stream.kafka.bindings.<binding-name>.producer.configuration.compression.type=zstd.

+
+

Default: none.

+
+
+
closeTimeout
+
+

Timeout in number of seconds to wait for when closing the producer.

+
+

Default: 30

+
+
+
+
+
+
+
Usage examples
+
+

In this section, we show the use of the preceding properties for specific scenarios.

+
+
+
Example: Setting autoCommitOffset to false and Relying on Manual Acking
+
+

This example illustrates how one may manually acknowledge offsets in a consumer application.

+
+
+

This example requires that spring.cloud.stream.kafka.bindings.input.consumer.autoCommitOffset be set to false. +Use the corresponding input channel name for your example.

+
+
+
+
@SpringBootApplication
+@EnableBinding(Sink.class)
+public class ManuallyAcknowdledgingConsumer {
+
+ public static void main(String[] args) {
+     SpringApplication.run(ManuallyAcknowdledgingConsumer.class, args);
+ }
+
+ @StreamListener(Sink.INPUT)
+ public void process(Message<?> message) {
+     Acknowledgment acknowledgment = message.getHeaders().get(KafkaHeaders.ACKNOWLEDGMENT, Acknowledgment.class);
+     if (acknowledgment != null) {
+         System.out.println("Acknowledgment provided");
+         acknowledgment.acknowledge();
+     }
+ }
+}
+
+
+
+
+
Example: Security Configuration
+
+

Apache Kafka 0.9 supports secure connections between client and brokers. +To take advantage of this feature, follow the guidelines in the Apache Kafka Documentation as well as the Kafka 0.9 security guidelines from the Confluent documentation. +Use the spring.cloud.stream.kafka.binder.configuration option to set security properties for all clients created by the binder.

+
+
+

For example, to set security.protocol to SASL_SSL, set the following property:

+
+
+
+
spring.cloud.stream.kafka.binder.configuration.security.protocol=SASL_SSL
+
+
+
+

All the other security properties can be set in a similar manner.

+
+
+

When using Kerberos, follow the instructions in the reference documentation for creating and referencing the JAAS configuration.

+
+
+

Spring Cloud Stream supports passing JAAS configuration information to the application by using a JAAS configuration file and using Spring Boot properties.

+
+
+Using JAAS Configuration Files +
+

The JAAS and (optionally) krb5 file locations can be set for Spring Cloud Stream applications by using system properties. +The following example shows how to launch a Spring Cloud Stream application with SASL and Kerberos by using a JAAS configuration file:

+
+
+
+
 java -Djava.security.auth.login.config=/path.to/kafka_client_jaas.conf -jar log.jar \
+   --spring.cloud.stream.kafka.binder.brokers=secure.server:9092 \
+   --spring.cloud.stream.bindings.input.destination=stream.ticktock \
+   --spring.cloud.stream.kafka.binder.configuration.security.protocol=SASL_PLAINTEXT
+
+
+
+
+Using Spring Boot Properties +
+

As an alternative to having a JAAS configuration file, Spring Cloud Stream provides a mechanism for setting up the JAAS configuration for Spring Cloud Stream applications by using Spring Boot properties.

+
+
+

The following properties can be used to configure the login context of the Kafka client:

+
+
+
+
spring.cloud.stream.kafka.binder.jaas.loginModule
+
+

The login module name. Not necessary to be set in normal cases.

+
+

Default: com.sun.security.auth.module.Krb5LoginModule.

+
+
+
spring.cloud.stream.kafka.binder.jaas.controlFlag
+
+

The control flag of the login module.

+
+

Default: required.

+
+
+
spring.cloud.stream.kafka.binder.jaas.options
+
+

Map with a key/value pair containing the login module options.

+
+

Default: Empty map.

+
+
+
+
+
+

The following example shows how to launch a Spring Cloud Stream application with SASL and Kerberos by using Spring Boot configuration properties:

+
+
+
+
 java --spring.cloud.stream.kafka.binder.brokers=secure.server:9092 \
+   --spring.cloud.stream.bindings.input.destination=stream.ticktock \
+   --spring.cloud.stream.kafka.binder.autoCreateTopics=false \
+   --spring.cloud.stream.kafka.binder.configuration.security.protocol=SASL_PLAINTEXT \
+   --spring.cloud.stream.kafka.binder.jaas.options.useKeyTab=true \
+   --spring.cloud.stream.kafka.binder.jaas.options.storeKey=true \
+   --spring.cloud.stream.kafka.binder.jaas.options.keyTab=/etc/security/keytabs/kafka_client.keytab \
+   --spring.cloud.stream.kafka.binder.jaas.options.principal=kafka-client-1@EXAMPLE.COM
+
+
+
+

The preceding example represents the equivalent of the following JAAS file:

+
+
+
+
KafkaClient {
+    com.sun.security.auth.module.Krb5LoginModule required
+    useKeyTab=true
+    storeKey=true
+    keyTab="/etc/security/keytabs/kafka_client.keytab"
+    principal="kafka-client-1@EXAMPLE.COM";
+};
+
+
+
+

If the topics required already exist on the broker or will be created by an administrator, autocreation can be turned off and only client JAAS properties need to be sent.

+
+
+ + + + + +
+ + +Do not mix JAAS configuration files and Spring Boot properties in the same application. +If the -Djava.security.auth.login.config system property is already present, Spring Cloud Stream ignores the Spring Boot properties. +
+
+
+ + + + + +
+ + +Be careful when using the autoCreateTopics and autoAddPartitions with Kerberos. +Usually, applications may use principals that do not have administrative rights in Kafka and Zookeeper. +Consequently, relying on Spring Cloud Stream to create/modify topics may fail. +In secure environments, we strongly recommend creating topics and managing ACLs administratively by using Kafka tooling. +
+
+
+
+
+
Example: Pausing and Resuming the Consumer
+
+

If you wish to suspend consumption but not cause a partition rebalance, you can pause and resume the consumer. +This is facilitated by adding the Consumer as a parameter to your @StreamListener. +To resume, you need an ApplicationListener for ListenerContainerIdleEvent instances. +The frequency at which events are published is controlled by the idleEventInterval property. +Since the consumer is not thread-safe, you must call these methods on the calling thread.

+
+
+

The following simple application shows how to pause and resume:

+
+
+
+
@SpringBootApplication
+@EnableBinding(Sink.class)
+public class Application {
+
+	public static void main(String[] args) {
+		SpringApplication.run(Application.class, args);
+	}
+
+	@StreamListener(Sink.INPUT)
+	public void in(String in, @Header(KafkaHeaders.CONSUMER) Consumer<?, ?> consumer) {
+		System.out.println(in);
+		consumer.pause(Collections.singleton(new TopicPartition("myTopic", 0)));
+	}
+
+	@Bean
+	public ApplicationListener<ListenerContainerIdleEvent> idleListener() {
+		return event -> {
+			System.out.println(event);
+			if (event.getConsumer().paused().size() > 0) {
+				event.getConsumer().resume(event.getConsumer().paused());
+			}
+		};
+	}
+
+}
+
+
+
+
+
+
+

Transactional Binder

+
+

Enable transactions by setting spring.cloud.stream.kafka.binder.transaction.transactionIdPrefix to a non-empty value, e.g. tx-. +When used in a processor application, the consumer starts the transaction; any records sent on the consumer thread participate in the same transaction. +When the listener exits normally, the listener container will send the offset to the transaction and commit it. +A common producer factory is used for all producer bindings configured using spring.cloud.stream.kafka.binder.transaction.producer.* properties; individual binding Kafka producer properties are ignored.

+
+
+ + + + + +
+ + +Normal binder retries (and dead lettering) are not supported with transactions because the retries will run in the original transaction, which may be rolled back and any published records will be rolled back too. +When retries are enabled (the common property maxAttempts is greater than zero) the retry properties are used to configure a DefaultAfterRollbackProcessor to enable retries at the container level. +Similarly, instead of publishing dead-letter records within the transaction, this functionality is moved to the listener container, again via the DefaultAfterRollbackProcessor which runs after the main transaction has rolled back. +
+
+
+

If you wish to use transactions in a source application, or from some arbitrary thread for producer-only transaction (e.g. @Scheduled method), you must get a reference to the transactional producer factory and define a KafkaTransactionManager bean using it.

+
+
+
+
+
+
@Bean
+public PlatformTransactionManager transactionManager(BinderFactory binders) {
+    ProducerFactory<byte[], byte[]> pf = ((KafkaMessageChannelBinder) binders.getBinder(null,
+            MessageChannel.class)).getTransactionalProducerFactory();
+    return new KafkaTransactionManager<>(pf);
+}
+
+
+
+
+
+

Notice that we get a reference to the binder using the BinderFactory; use null in the first argument when there is only one binder configured. +If more than one binder is configured, use the binder name to get the reference. +Once we have a reference to the binder, we can obtain a reference to the ProducerFactory and create a transaction manager.

+
+
+

Then you would use normal Spring transaction support, e.g. TransactionTemplate or @Transactional, for example:

+
+
+
+
+
+
public static class Sender {
+
+    @Transactional
+    public void doInTransaction(MessageChannel output, List<String> stuffToSend) {
+        stuffToSend.forEach(stuff -> output.send(new GenericMessage<>(stuff)));
+    }
+
+}
+
+
+
+
+
+

If you wish to synchronize producer-only transactions with those from some other transaction manager, use a ChainedTransactionManager.

+
+
+
+

Error Channels

+
+

Starting with version 1.3, the binder unconditionally sends exceptions to an error channel for each consumer destination and can also be configured to send async producer send failures to an error channel. +See [spring-cloud-stream-overview-error-handling] for more information.

+
+
+

The payload of the ErrorMessage for a send failure is a KafkaSendFailureException with properties:

+
+
+
    +
  • +

    failedMessage: The Spring Messaging Message<?> that failed to be sent.

    +
  • +
  • +

    record: The raw ProducerRecord that was created from the failedMessage

    +
  • +
+
+
+

There is no automatic handling of producer exceptions (such as sending to a Dead-Letter queue). +You can consume these exceptions with your own Spring Integration flow.

+
+
+
+

Kafka Metrics

+
+

Kafka binder module exposes the following metrics:

+
+
+

spring.cloud.stream.binder.kafka.offset: This metric indicates how many messages have not been yet consumed from a given binder’s topic by a given consumer group. +The metrics provided are based on the Mircometer metrics library. The metric contains the consumer group information, topic and the actual lag in committed offset from the latest offset on the topic. +This metric is particularly useful for providing auto-scaling feedback to a PaaS platform.

+
+
+
+

Tombstone Records (null record values)

+
+

When using compacted topics, a record with a null value (also called a tombstone record) represents the deletion of a key. +To receive such messages in a @StreamListener method, the parameter must be marked as not required to receive a null value argument.

+
+
+
+
+
+
@StreamListener(Sink.INPUT)
+public void in(@Header(KafkaHeaders.RECEIVED_MESSAGE_KEY) byte[] key,
+               @Payload(required = false) Customer customer) {
+    // customer is null if a tombstone record
+    ...
+}
+
+
+
+
+
+
+

Using a KafkaRebalanceListener

+
+

Applications may wish to seek topics/partitions to arbitrary offsets when the partitions are initially assigned, or perform other operations on the consumer. +Starting with version 2.1, if you provide a single KafkaRebalanceListener bean in the application context, it will be wired into all Kafka consumer bindings.

+
+
+
+
+
+
public interface KafkaBindingRebalanceListener {
+
+	/**
+	 * Invoked by the container before any pending offsets are committed.
+	 * @param bindingName the name of the binding.
+	 * @param consumer the consumer.
+	 * @param partitions the partitions.
+	 */
+	default void onPartitionsRevokedBeforeCommit(String bindingName, Consumer<?, ?> consumer,
+			Collection<TopicPartition> partitions) {
+
+	}
+
+	/**
+	 * Invoked by the container after any pending offsets are committed.
+	 * @param bindingName the name of the binding.
+	 * @param consumer the consumer.
+	 * @param partitions the partitions.
+	 */
+	default void onPartitionsRevokedAfterCommit(String bindingName, Consumer<?, ?> consumer, Collection<TopicPartition> partitions) {
+
+	}
+
+	/**
+	 * Invoked when partitions are initially assigned or after a rebalance.
+	 * Applications might only want to perform seek operations on an initial assignment.
+	 * @param bindingName the name of the binding.
+	 * @param consumer the consumer.
+	 * @param partitions the partitions.
+	 * @param initial true if this is the initial assignment.
+	 */
+	default void onPartitionsAssigned(String bindingName, Consumer<?, ?> consumer, Collection<TopicPartition> partitions,
+			boolean initial) {
+
+	}
+
+}
+
+
+
+
+
+

You cannot set the resetOffsets consumer property to true when you provide a rebalance listener.

+
+
+
+

Dead-Letter Topic Processing

+
+
Dead-Letter Topic Partition Selection
+
+

By default, records are published to the Dead-Letter topic using the same partition as the original record. +This means the Dead-Letter topic must have at least as many partitions as the original record.

+
+
+

To change this behavior, add a DlqPartitionFunction implementation as a @Bean to the application context. +Only one such bean can be present. +The function is provided with the consumer group, the failed ConsumerRecord and the exception. +For example, if you always want to route to partition 0, you might use:

+
+
+
+
+
+
@Bean
+public DlqPartitionFunction partitionFunction() {
+    return (group, record, ex) -> 0;
+}
+
+
+
+
+
+ + + + + +
+ + +If you set a consumer binding’s dlqPartitions property to 1 (and the binder’s minPartitionCount is equal to 1), there is no need to supply a DlqPartitionFunction; the framework will always use partition 0. +If you set a consumer binding’s dlqPartitions property to a value greater than 1 (or the binder’s minPartitionCount is greater than 1), you must provide a DlqPartitionFunction bean, even if the partition count is the same as the original topic’s. +
+
+
+
+
Handling Records in a Dead-Letter Topic
+
+

Because the framework cannot anticipate how users would want to dispose of dead-lettered messages, it does not provide any standard mechanism to handle them. +If the reason for the dead-lettering is transient, you may wish to route the messages back to the original topic. +However, if the problem is a permanent issue, that could cause an infinite loop. +The sample Spring Boot application within this topic is an example of how to route those messages back to the original topic, but it moves them to a “parking lot” topic after three attempts. +The application is another spring-cloud-stream application that reads from the dead-letter topic. +It terminates when no messages are received for 5 seconds.

+
+
+

The examples assume the original destination is so8400out and the consumer group is so8400.

+
+
+

There are a couple of strategies to consider:

+
+
+
    +
  • +

    Consider running the rerouting only when the main application is not running. +Otherwise, the retries for transient errors are used up very quickly.

    +
  • +
  • +

    Alternatively, use a two-stage approach: Use this application to route to a third topic and another to route from there back to the main topic.

    +
  • +
+
+
+

The following code listings show the sample application:

+
+
+
application.properties
+
+
spring.cloud.stream.bindings.input.group=so8400replay
+spring.cloud.stream.bindings.input.destination=error.so8400out.so8400
+
+spring.cloud.stream.bindings.output.destination=so8400out
+
+spring.cloud.stream.bindings.parkingLot.destination=so8400in.parkingLot
+
+spring.cloud.stream.kafka.binder.configuration.auto.offset.reset=earliest
+
+spring.cloud.stream.kafka.binder.headers=x-retries
+
+
+
+
Application
+
+
@SpringBootApplication
+@EnableBinding(TwoOutputProcessor.class)
+public class ReRouteDlqKApplication implements CommandLineRunner {
+
+    private static final String X_RETRIES_HEADER = "x-retries";
+
+    public static void main(String[] args) {
+        SpringApplication.run(ReRouteDlqKApplication.class, args).close();
+    }
+
+    private final AtomicInteger processed = new AtomicInteger();
+
+    @Autowired
+    private MessageChannel parkingLot;
+
+    @StreamListener(Processor.INPUT)
+    @SendTo(Processor.OUTPUT)
+    public Message<?> reRoute(Message<?> failed) {
+        processed.incrementAndGet();
+        Integer retries = failed.getHeaders().get(X_RETRIES_HEADER, Integer.class);
+        if (retries == null) {
+            System.out.println("First retry for " + failed);
+            return MessageBuilder.fromMessage(failed)
+                    .setHeader(X_RETRIES_HEADER, new Integer(1))
+                    .setHeader(BinderHeaders.PARTITION_OVERRIDE,
+                            failed.getHeaders().get(KafkaHeaders.RECEIVED_PARTITION_ID))
+                    .build();
+        }
+        else if (retries.intValue() < 3) {
+            System.out.println("Another retry for " + failed);
+            return MessageBuilder.fromMessage(failed)
+                    .setHeader(X_RETRIES_HEADER, new Integer(retries.intValue() + 1))
+                    .setHeader(BinderHeaders.PARTITION_OVERRIDE,
+                            failed.getHeaders().get(KafkaHeaders.RECEIVED_PARTITION_ID))
+                    .build();
+        }
+        else {
+            System.out.println("Retries exhausted for " + failed);
+            parkingLot.send(MessageBuilder.fromMessage(failed)
+                    .setHeader(BinderHeaders.PARTITION_OVERRIDE,
+                            failed.getHeaders().get(KafkaHeaders.RECEIVED_PARTITION_ID))
+                    .build());
+        }
+        return null;
+    }
+
+    @Override
+    public void run(String... args) throws Exception {
+        while (true) {
+            int count = this.processed.get();
+            Thread.sleep(5000);
+            if (count == this.processed.get()) {
+                System.out.println("Idle, terminating");
+                return;
+            }
+        }
+    }
+
+    public interface TwoOutputProcessor extends Processor {
+
+        @Output("parkingLot")
+        MessageChannel parkingLot();
+
+    }
+
+}
+
+
+
+
+
+

Partitioning with the Kafka Binder

+
+

Apache Kafka supports topic partitioning natively.

+
+
+

Sometimes it is advantageous to send data to specific partitions — for example, when you want to strictly order message processing (all messages for a particular customer should go to the same partition).

+
+
+

The following example shows how to configure the producer and consumer side:

+
+
+
+
@SpringBootApplication
+@EnableBinding(Source.class)
+public class KafkaPartitionProducerApplication {
+
+    private static final Random RANDOM = new Random(System.currentTimeMillis());
+
+    private static final String[] data = new String[] {
+            "foo1", "bar1", "qux1",
+            "foo2", "bar2", "qux2",
+            "foo3", "bar3", "qux3",
+            "foo4", "bar4", "qux4",
+            };
+
+    public static void main(String[] args) {
+        new SpringApplicationBuilder(KafkaPartitionProducerApplication.class)
+            .web(false)
+            .run(args);
+    }
+
+    @InboundChannelAdapter(channel = Source.OUTPUT, poller = @Poller(fixedRate = "5000"))
+    public Message<?> generate() {
+        String value = data[RANDOM.nextInt(data.length)];
+        System.out.println("Sending: " + value);
+        return MessageBuilder.withPayload(value)
+                .setHeader("partitionKey", value)
+                .build();
+    }
+
+}
+
+
+
+
application.yml
+
+
spring:
+  cloud:
+    stream:
+      bindings:
+        output:
+          destination: partitioned.topic
+          producer:
+            partition-key-expression: headers['partitionKey']
+            partition-count: 12
+
+
+
+ + + + + +
+ + +The topic must be provisioned to have enough partitions to achieve the desired concurrency for all consumer groups. +The above configuration supports up to 12 consumer instances (6 if their concurrency is 2, 4 if their concurrency is 3, and so on). +It is generally best to “over-provision” the partitions to allow for future increases in consumers or concurrency. +
+
+
+ + + + + +
+ + +The preceding configuration uses the default partitioning (key.hashCode() % partitionCount). +This may or may not provide a suitably balanced algorithm, depending on the key values. +You can override this default by using the partitionSelectorExpression or partitionSelectorClass properties. +
+
+
+

Since partitions are natively handled by Kafka, no special configuration is needed on the consumer side. +Kafka allocates partitions across the instances.

+
+
+

The following Spring Boot application listens to a Kafka stream and prints (to the console) the partition ID to which each message goes:

+
+
+
+
@SpringBootApplication
+@EnableBinding(Sink.class)
+public class KafkaPartitionConsumerApplication {
+
+    public static void main(String[] args) {
+        new SpringApplicationBuilder(KafkaPartitionConsumerApplication.class)
+            .web(false)
+            .run(args);
+    }
+
+    @StreamListener(Sink.INPUT)
+    public void listen(@Payload String in, @Header(KafkaHeaders.RECEIVED_PARTITION_ID) int partition) {
+        System.out.println(in + " received from partition " + partition);
+    }
+
+}
+
+
+
+
application.yml
+
+
spring:
+  cloud:
+    stream:
+      bindings:
+        input:
+          destination: partitioned.topic
+          group: myGroup
+
+
+
+

You can add instances as needed. +Kafka rebalances the partition allocations. +If the instance count (or instance count * concurrency) exceeds the number of partitions, some consumers are idle.

+
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/spring-cloud-stream-binder-kafka.html b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/spring-cloud-stream-binder-kafka.html new file mode 100644 index 00000000..9753c62d --- /dev/null +++ b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/html/spring-cloud-stream-binder-kafka.html @@ -0,0 +1,3855 @@ + + + + + + + + +Spring Cloud Stream Kafka Binder Reference Guide + + + + + + + + + + +
+
+
+
+

3.0.6.RELEASE

+
+
+
+

Reference Guide

+
+
+
+

This guide describes the Apache Kafka implementation of the Spring Cloud Stream Binder. +It contains information about its design, usage, and configuration options, as well as information on how the Stream Cloud Stream concepts map onto Apache Kafka specific constructs. +In addition, this guide explains the Kafka Streams binding capabilities of Spring Cloud Stream.

+
+
+
+
+

1. Apache Kafka Binder

+
+
+

1.1. Usage

+
+

To use Apache Kafka binder, you need to add spring-cloud-stream-binder-kafka as a dependency to your Spring Cloud Stream application, as shown in the following example for Maven:

+
+
+
+
<dependency>
+  <groupId>org.springframework.cloud</groupId>
+  <artifactId>spring-cloud-stream-binder-kafka</artifactId>
+</dependency>
+
+
+
+

Alternatively, you can also use the Spring Cloud Stream Kafka Starter, as shown in the following example for Maven:

+
+
+
+
<dependency>
+  <groupId>org.springframework.cloud</groupId>
+  <artifactId>spring-cloud-starter-stream-kafka</artifactId>
+</dependency>
+
+
+
+
+

1.2. Overview

+
+

The following image shows a simplified diagram of how the Apache Kafka binder operates:

+
+
+
+kafka binder +
+
Figure 1. Kafka Binder
+
+
+

The Apache Kafka Binder implementation maps each destination to an Apache Kafka topic. +The consumer group maps directly to the same Apache Kafka concept. +Partitioning also maps directly to Apache Kafka partitions as well.

+
+
+

The binder currently uses the Apache Kafka kafka-clients version 2.3.1. +This client can communicate with older brokers (see the Kafka documentation), but certain features may not be available. +For example, with versions earlier than 0.11.x.x, native headers are not supported. +Also, 0.11.x.x does not support the autoAddPartitions property.

+
+
+
+

1.3. Configuration Options

+
+

This section contains the configuration options used by the Apache Kafka binder.

+
+
+

For common configuration options and properties pertaining to binder, see the core documentation.

+
+
+

1.3.1. Kafka Binder Properties

+
+
+
spring.cloud.stream.kafka.binder.brokers
+
+

A list of brokers to which the Kafka binder connects.

+
+

Default: localhost.

+
+
+
spring.cloud.stream.kafka.binder.defaultBrokerPort
+
+

brokers allows hosts specified with or without port information (for example, host1,host2:port2). +This sets the default port when no port is configured in the broker list.

+
+

Default: 9092.

+
+
+
spring.cloud.stream.kafka.binder.configuration
+
+

Key/Value map of client properties (both producers and consumer) passed to all clients created by the binder. +Due to the fact that these properties are used by both producers and consumers, usage should be restricted to common properties — for example, security settings. +Unknown Kafka producer or consumer properties provided through this configuration are filtered out and not allowed to propagate. +Properties here supersede any properties set in boot.

+
+

Default: Empty map.

+
+
+
spring.cloud.stream.kafka.binder.consumerProperties
+
+

Key/Value map of arbitrary Kafka client consumer properties. +In addition to support known Kafka consumer properties, unknown consumer properties are allowed here as well. +Properties here supersede any properties set in boot and in the configuration property above.

+
+

Default: Empty map.

+
+
+
spring.cloud.stream.kafka.binder.headers
+
+

The list of custom headers that are transported by the binder. +Only required when communicating with older applications (⇐ 1.3.x) with a kafka-clients version < 0.11.0.0. Newer versions support headers natively.

+
+

Default: empty.

+
+
+
spring.cloud.stream.kafka.binder.healthTimeout
+
+

The time to wait to get partition information, in seconds. +Health reports as down if this timer expires.

+
+

Default: 10.

+
+
+
spring.cloud.stream.kafka.binder.requiredAcks
+
+

The number of required acks on the broker. +See the Kafka documentation for the producer acks property.

+
+

Default: 1.

+
+
+
spring.cloud.stream.kafka.binder.minPartitionCount
+
+

Effective only if autoCreateTopics or autoAddPartitions is set. +The global minimum number of partitions that the binder configures on topics on which it produces or consumes data. +It can be superseded by the partitionCount setting of the producer or by the value of instanceCount * concurrency settings of the producer (if either is larger).

+
+

Default: 1.

+
+
+
spring.cloud.stream.kafka.binder.producerProperties
+
+

Key/Value map of arbitrary Kafka client producer properties. +In addition to support known Kafka producer properties, unknown producer properties are allowed here as well. +Properties here supersede any properties set in boot and in the configuration property above.

+
+

Default: Empty map.

+
+
+
spring.cloud.stream.kafka.binder.replicationFactor
+
+

The replication factor of auto-created topics if autoCreateTopics is active. +Can be overridden on each binding.

+
+

Default: 1.

+
+
+
spring.cloud.stream.kafka.binder.autoCreateTopics
+
+

If set to true, the binder creates new topics automatically. +If set to false, the binder relies on the topics being already configured. +In the latter case, if the topics do not exist, the binder fails to start.

+
+ + + + + +
+ + +This setting is independent of the auto.create.topics.enable setting of the broker and does not influence it. +If the server is set to auto-create topics, they may be created as part of the metadata retrieval request, with default broker settings. +
+
+
+

Default: true.

+
+
+
spring.cloud.stream.kafka.binder.autoAddPartitions
+
+

If set to true, the binder creates new partitions if required. +If set to false, the binder relies on the partition size of the topic being already configured. +If the partition count of the target topic is smaller than the expected value, the binder fails to start.

+
+

Default: false.

+
+
+
spring.cloud.stream.kafka.binder.transaction.transactionIdPrefix
+
+

Enables transactions in the binder. See transaction.id in the Kafka documentation and Transactions in the spring-kafka documentation. +When transactions are enabled, individual producer properties are ignored and all producers use the spring.cloud.stream.kafka.binder.transaction.producer.* properties.

+
+

Default null (no transactions)

+
+
+
spring.cloud.stream.kafka.binder.transaction.producer.*
+
+

Global producer properties for producers in a transactional binder. +See spring.cloud.stream.kafka.binder.transaction.transactionIdPrefix and Kafka Producer Properties and the general producer properties supported by all binders.

+
+

Default: See individual producer properties.

+
+
+
spring.cloud.stream.kafka.binder.headerMapperBeanName
+
+

The bean name of a KafkaHeaderMapper used for mapping spring-messaging headers to and from Kafka headers. +Use this, for example, if you wish to customize the trusted packages in a BinderHeaderMapper bean that uses JSON deserialization for the headers. +If this custom BinderHeaderMapper bean is not made available to the binder using this property, then the binder will look for a header mapper bean with the name kafkaBinderHeaderMapper that is of type BinderHeaderMapper before falling back to a default BinderHeaderMapper created by the binder.

+
+

Default: none.

+
+
+
+
+
+
+

1.3.2. Kafka Consumer Properties

+
+ + + + + +
+ + +To avoid repetition, Spring Cloud Stream supports setting values for all channels, in the format of spring.cloud.stream.kafka.default.consumer.<property>=<value>. +
+
+
+

The following properties are available for Kafka consumers only and +must be prefixed with spring.cloud.stream.kafka.bindings.<channelName>.consumer..

+
+
+
+
admin.configuration
+
+

Since version 2.1.1, this property is deprecated in favor of topic.properties, and support for it will be removed in a future version.

+
+
admin.replicas-assignment
+
+

Since version 2.1.1, this property is deprecated in favor of topic.replicas-assignment, and support for it will be removed in a future version.

+
+
admin.replication-factor
+
+

Since version 2.1.1, this property is deprecated in favor of topic.replication-factor, and support for it will be removed in a future version.

+
+
autoRebalanceEnabled
+
+

When true, topic partitions is automatically rebalanced between the members of a consumer group. +When false, each consumer is assigned a fixed set of partitions based on spring.cloud.stream.instanceCount and spring.cloud.stream.instanceIndex. +This requires both the spring.cloud.stream.instanceCount and spring.cloud.stream.instanceIndex properties to be set appropriately on each launched instance. +The value of the spring.cloud.stream.instanceCount property must typically be greater than 1 in this case.

+
+

Default: true.

+
+
+
ackEachRecord
+
+

When autoCommitOffset is true, this setting dictates whether to commit the offset after each record is processed. +By default, offsets are committed after all records in the batch of records returned by consumer.poll() have been processed. +The number of records returned by a poll can be controlled with the max.poll.records Kafka property, which is set through the consumer configuration property. +Setting this to true may cause a degradation in performance, but doing so reduces the likelihood of redelivered records when a failure occurs. +Also, see the binder requiredAcks property, which also affects the performance of committing offsets.

+
+

Default: false.

+
+
+
autoCommitOffset
+
+

Whether to autocommit offsets when a message has been processed. +If set to false, a header with the key kafka_acknowledgment of the type org.springframework.kafka.support.Acknowledgment header is present in the inbound message. +Applications may use this header for acknowledging messages. +See the examples section for details. +When this property is set to false, Kafka binder sets the ack mode to org.springframework.kafka.listener.AbstractMessageListenerContainer.AckMode.MANUAL and the application is responsible for acknowledging records. +Also see ackEachRecord.

+
+

Default: true.

+
+
+
autoCommitOnError
+
+

Effective only if autoCommitOffset is set to true. +If set to false, it suppresses auto-commits for messages that result in errors and commits only for successful messages. It allows a stream to automatically replay from the last successfully processed message, in case of persistent failures. +If set to true, it always auto-commits (if auto-commit is enabled). +If not set (the default), it effectively has the same value as enableDlq, auto-committing erroneous messages if they are sent to a DLQ and not committing them otherwise.

+
+

Default: not set.

+
+
+
resetOffsets
+
+

Whether to reset offsets on the consumer to the value provided by startOffset. +Must be false if a KafkaRebalanceListener is provided; see Using a KafkaRebalanceListener.

+
+

Default: false.

+
+
+
startOffset
+
+

The starting offset for new groups. +Allowed values: earliest and latest. +If the consumer group is set explicitly for the consumer 'binding' (through spring.cloud.stream.bindings.<channelName>.group), 'startOffset' is set to earliest. Otherwise, it is set to latest for the anonymous consumer group. +Also see resetOffsets (earlier in this list).

+
+

Default: null (equivalent to earliest).

+
+
+
enableDlq
+
+

When set to true, it enables DLQ behavior for the consumer. +By default, messages that result in errors are forwarded to a topic named error.<destination>.<group>. +The DLQ topic name can be configurable by setting the dlqName property. +This provides an alternative option to the more common Kafka replay scenario for the case when the number of errors is relatively small and replaying the entire original topic may be too cumbersome. +See Dead-Letter Topic Processing processing for more information. +Starting with version 2.0, messages sent to the DLQ topic are enhanced with the following headers: x-original-topic, x-exception-message, and x-exception-stacktrace as byte[]. +By default, a failed record is sent to the same partition number in the DLQ topic as the original record. +See Dead-Letter Topic Partition Selection for how to change that behavior. +Not allowed when destinationIsPattern is true.

+
+

Default: false.

+
+
+
dlqPartitions
+
+

When enableDlq is true, and this property is not set, a dead letter topic with the same number of partitions as the primary topic(s) is created. +Usually, dead-letter records are sent to the same partition in the dead-letter topic as the original record. +This behavior can be changed; see Dead-Letter Topic Partition Selection. +If this property is set to 1 and there is no DqlPartitionFunction bean, all dead-letter records will be written to partition 0. +If this property is greater than 1, you MUST provide a DlqPartitionFunction bean. +Note that the actual partition count is affected by the binder’s minPartitionCount property.

+
+

Default: none

+
+
+
configuration
+
+

Map with a key/value pair containing generic Kafka consumer properties. +In addition to having Kafka consumer properties, other configuration properties can be passed here. +For example some properties needed by the application such as spring.cloud.stream.kafka.bindings.input.consumer.configuration.foo=bar.

+
+

Default: Empty map.

+
+
+
dlqName
+
+

The name of the DLQ topic to receive the error messages.

+
+

Default: null (If not specified, messages that result in errors are forwarded to a topic named error.<destination>.<group>).

+
+
+
dlqProducerProperties
+
+

Using this, DLQ-specific producer properties can be set. +All the properties available through kafka producer properties can be set through this property. +When native decoding is enabled on the consumer (i.e., useNativeDecoding: true) , the application must provide corresponding key/value serializers for DLQ. +This must be provided in the form of dlqProducerProperties.configuration.key.serializer and dlqProducerProperties.configuration.value.serializer.

+
+

Default: Default Kafka producer properties.

+
+
+
standardHeaders
+
+

Indicates which standard headers are populated by the inbound channel adapter. +Allowed values: none, id, timestamp, or both. +Useful if using native deserialization and the first component to receive a message needs an id (such as an aggregator that is configured to use a JDBC message store).

+
+

Default: none

+
+
+
converterBeanName
+
+

The name of a bean that implements RecordMessageConverter. Used in the inbound channel adapter to replace the default MessagingMessageConverter.

+
+

Default: null

+
+
+
idleEventInterval
+
+

The interval, in milliseconds, between events indicating that no messages have recently been received. +Use an ApplicationListener<ListenerContainerIdleEvent> to receive these events. +See Example: Pausing and Resuming the Consumer for a usage example.

+
+

Default: 30000

+
+
+
destinationIsPattern
+
+

When true, the destination is treated as a regular expression Pattern used to match topic names by the broker. +When true, topics are not provisioned, and enableDlq is not allowed, because the binder does not know the topic names during the provisioning phase. +Note, the time taken to detect new topics that match the pattern is controlled by the consumer property metadata.max.age.ms, which (at the time of writing) defaults to 300,000ms (5 minutes). +This can be configured using the configuration property above.

+
+

Default: false

+
+
+
topic.properties
+
+

A Map of Kafka topic properties used when provisioning new topics — for example, spring.cloud.stream.kafka.bindings.input.consumer.topic.properties.message.format.version=0.9.0.0

+
+

Default: none.

+
+
+
topic.replicas-assignment
+
+

A Map<Integer, List<Integer>> of replica assignments, with the key being the partition and the value being the assignments. +Used when provisioning new topics. +See the NewTopic Javadocs in the kafka-clients jar.

+
+

Default: none.

+
+
+
topic.replication-factor
+
+

The replication factor to use when provisioning topics. Overrides the binder-wide setting. +Ignored if replicas-assignments is present.

+
+

Default: none (the binder-wide default of 1 is used).

+
+
+
pollTimeout
+
+

Timeout used for polling in pollable consumers.

+
+

Default: 5 seconds.

+
+
+
+
+
+
+

1.3.3. Consuming Batches

+
+

Starting with version 3.0, when spring.cloud.stream.binding.<name>.consumer.batch-mode is set to true, all of the records received by polling the Kafka Consumer will be presented as a List<?> to the listener method. +Otherwise, the method will be called with one record at a time. +The size of the batch is controlled by Kafka consumer properties max.poll.records, min.fetch.bytes, fetch.max.wait.ms; refer to the Kafka documentation for more information.

+
+
+

Bear in mind that batch mode is not supported with @StreamListener - it only works with the newer functional programming model.

+
+
+ + + + + +
+ + +Retry within the binder is not supported when using batch mode, so maxAttempts will be overridden to 1. +You can configure a SeekToCurrentBatchErrorHandler (using a ListenerContainerCustomizer) to achieve similar functionality to retry in the binder. +You can also use a manual AckMode and call Ackowledgment.nack(index, sleep) to commit the offsets for a partial batch and have the remaining records redelivered. +Refer to the Spring for Apache Kafka documentation for more information about these techniques. +
+
+
+
+

1.3.4. Kafka Producer Properties

+
+ + + + + +
+ + +To avoid repetition, Spring Cloud Stream supports setting values for all channels, in the format of spring.cloud.stream.kafka.default.producer.<property>=<value>. +
+
+
+

The following properties are available for Kafka producers only and +must be prefixed with spring.cloud.stream.kafka.bindings.<channelName>.producer..

+
+
+
+
admin.configuration
+
+

Since version 2.1.1, this property is deprecated in favor of topic.properties, and support for it will be removed in a future version.

+
+
admin.replicas-assignment
+
+

Since version 2.1.1, this property is deprecated in favor of topic.replicas-assignment, and support for it will be removed in a future version.

+
+
admin.replication-factor
+
+

Since version 2.1.1, this property is deprecated in favor of topic.replication-factor, and support for it will be removed in a future version.

+
+
bufferSize
+
+

Upper limit, in bytes, of how much data the Kafka producer attempts to batch before sending.

+
+

Default: 16384.

+
+
+
sync
+
+

Whether the producer is synchronous.

+
+

Default: false.

+
+
+
sendTimeoutExpression
+
+

A SpEL expression evaluated against the outgoing message used to evaluate the time to wait for ack when synchronous publish is enabled — for example, headers['mySendTimeout']. +The value of the timeout is in milliseconds. +With versions before 3.0, the payload could not be used unless native encoding was being used because, by the time this expression was evaluated, the payload was already in the form of a byte[]. +Now, the expression is evaluated before the payload is converted.

+
+

Default: none.

+
+
+
batchTimeout
+
+

How long the producer waits to allow more messages to accumulate in the same batch before sending the messages. +(Normally, the producer does not wait at all and simply sends all the messages that accumulated while the previous send was in progress.) A non-zero value may increase throughput at the expense of latency.

+
+

Default: 0.

+
+
+
messageKeyExpression
+
+

A SpEL expression evaluated against the outgoing message used to populate the key of the produced Kafka message — for example, headers['myKey']. +With versions before 3.0, the payload could not be used unless native encoding was being used because, by the time this expression was evaluated, the payload was already in the form of a byte[]. +Now, the expression is evaluated before the payload is converted.

+
+

Default: none.

+
+
+
headerPatterns
+
+

A comma-delimited list of simple patterns to match Spring messaging headers to be mapped to the Kafka Headers in the ProducerRecord. +Patterns can begin or end with the wildcard character (asterisk). +Patterns can be negated by prefixing with !. +Matching stops after the first match (positive or negative). +For example !ask,as* will pass ash but not ask. +id and timestamp are never mapped.

+
+

Default: * (all headers - except the id and timestamp)

+
+
+
configuration
+
+

Map with a key/value pair containing generic Kafka producer properties.

+
+

Default: Empty map.

+
+
+
topic.properties
+
+

A Map of Kafka topic properties used when provisioning new topics — for example, spring.cloud.stream.kafka.bindings.output.producer.topic.properties.message.format.version=0.9.0.0

+
+
topic.replicas-assignment
+
+

A Map<Integer, List<Integer>> of replica assignments, with the key being the partition and the value being the assignments. +Used when provisioning new topics. +See the NewTopic Javadocs in the kafka-clients jar.

+
+

Default: none.

+
+
+
topic.replication-factor
+
+

The replication factor to use when provisioning topics. Overrides the binder-wide setting. +Ignored if replicas-assignments is present.

+
+

Default: none (the binder-wide default of 1 is used).

+
+
+
useTopicHeader
+
+

Set to true to override the default binding destination (topic name) with the value of the KafkaHeaders.TOPIC message header in the outbound message. +If the header is not present, the default binding destination is used. +Default: false.

+
+
recordMetadataChannel
+
+

The bean name of a MessageChannel to which successful send results should be sent; the bean must exist in the application context. +The message sent to the channel is the sent message (after conversion, if any) with an additional header KafkaHeaders.RECORD_METADATA. +The header contains a RecordMetadata object provided by the Kafka client; it includes the partition and offset where the record was written in the topic.

+
+
+
+
+

ResultMetadata meta = sendResultMsg.getHeaders().get(KafkaHeaders.RECORD_METADATA, RecordMetadata.class)

+
+
+

Failed sends go the producer error channel (if configured); see Error Channels. +Default: null

+
+
+

+

+
+
+ + + + + +
+ + +The Kafka binder uses the partitionCount setting of the producer as a hint to create a topic with the given partition count (in conjunction with the minPartitionCount, the maximum of the two being the value being used). +Exercise caution when configuring both minPartitionCount for a binder and partitionCount for an application, as the larger value is used. +If a topic already exists with a smaller partition count and autoAddPartitions is disabled (the default), the binder fails to start. +If a topic already exists with a smaller partition count and autoAddPartitions is enabled, new partitions are added. +If a topic already exists with a larger number of partitions than the maximum of (minPartitionCount or partitionCount), the existing partition count is used. +
+
+
+
+
compression
+
+

Set the compression.type producer property. +Supported values are none, gzip, snappy and lz4. +If you override the kafka-clients jar to 2.1.0 (or later), as discussed in the Spring for Apache Kafka documentation, and wish to use zstd compression, use spring.cloud.stream.kafka.bindings.<binding-name>.producer.configuration.compression.type=zstd.

+
+

Default: none.

+
+
+
closeTimeout
+
+

Timeout in number of seconds to wait for when closing the producer.

+
+

Default: 30

+
+
+
+
+
+
+

1.3.5. Usage examples

+
+

In this section, we show the use of the preceding properties for specific scenarios.

+
+
+
Example: Setting autoCommitOffset to false and Relying on Manual Acking
+
+

This example illustrates how one may manually acknowledge offsets in a consumer application.

+
+
+

This example requires that spring.cloud.stream.kafka.bindings.input.consumer.autoCommitOffset be set to false. +Use the corresponding input channel name for your example.

+
+
+
+
@SpringBootApplication
+@EnableBinding(Sink.class)
+public class ManuallyAcknowdledgingConsumer {
+
+ public static void main(String[] args) {
+     SpringApplication.run(ManuallyAcknowdledgingConsumer.class, args);
+ }
+
+ @StreamListener(Sink.INPUT)
+ public void process(Message<?> message) {
+     Acknowledgment acknowledgment = message.getHeaders().get(KafkaHeaders.ACKNOWLEDGMENT, Acknowledgment.class);
+     if (acknowledgment != null) {
+         System.out.println("Acknowledgment provided");
+         acknowledgment.acknowledge();
+     }
+ }
+}
+
+
+
+
+
Example: Security Configuration
+
+

Apache Kafka 0.9 supports secure connections between client and brokers. +To take advantage of this feature, follow the guidelines in the Apache Kafka Documentation as well as the Kafka 0.9 security guidelines from the Confluent documentation. +Use the spring.cloud.stream.kafka.binder.configuration option to set security properties for all clients created by the binder.

+
+
+

For example, to set security.protocol to SASL_SSL, set the following property:

+
+
+
+
spring.cloud.stream.kafka.binder.configuration.security.protocol=SASL_SSL
+
+
+
+

All the other security properties can be set in a similar manner.

+
+
+

When using Kerberos, follow the instructions in the reference documentation for creating and referencing the JAAS configuration.

+
+
+

Spring Cloud Stream supports passing JAAS configuration information to the application by using a JAAS configuration file and using Spring Boot properties.

+
+
+
Using JAAS Configuration Files
+
+

The JAAS and (optionally) krb5 file locations can be set for Spring Cloud Stream applications by using system properties. +The following example shows how to launch a Spring Cloud Stream application with SASL and Kerberos by using a JAAS configuration file:

+
+
+
+
 java -Djava.security.auth.login.config=/path.to/kafka_client_jaas.conf -jar log.jar \
+   --spring.cloud.stream.kafka.binder.brokers=secure.server:9092 \
+   --spring.cloud.stream.bindings.input.destination=stream.ticktock \
+   --spring.cloud.stream.kafka.binder.configuration.security.protocol=SASL_PLAINTEXT
+
+
+
+
+
Using Spring Boot Properties
+
+

As an alternative to having a JAAS configuration file, Spring Cloud Stream provides a mechanism for setting up the JAAS configuration for Spring Cloud Stream applications by using Spring Boot properties.

+
+
+

The following properties can be used to configure the login context of the Kafka client:

+
+
+
+
spring.cloud.stream.kafka.binder.jaas.loginModule
+
+

The login module name. Not necessary to be set in normal cases.

+
+

Default: com.sun.security.auth.module.Krb5LoginModule.

+
+
+
spring.cloud.stream.kafka.binder.jaas.controlFlag
+
+

The control flag of the login module.

+
+

Default: required.

+
+
+
spring.cloud.stream.kafka.binder.jaas.options
+
+

Map with a key/value pair containing the login module options.

+
+

Default: Empty map.

+
+
+
+
+
+

The following example shows how to launch a Spring Cloud Stream application with SASL and Kerberos by using Spring Boot configuration properties:

+
+
+
+
 java --spring.cloud.stream.kafka.binder.brokers=secure.server:9092 \
+   --spring.cloud.stream.bindings.input.destination=stream.ticktock \
+   --spring.cloud.stream.kafka.binder.autoCreateTopics=false \
+   --spring.cloud.stream.kafka.binder.configuration.security.protocol=SASL_PLAINTEXT \
+   --spring.cloud.stream.kafka.binder.jaas.options.useKeyTab=true \
+   --spring.cloud.stream.kafka.binder.jaas.options.storeKey=true \
+   --spring.cloud.stream.kafka.binder.jaas.options.keyTab=/etc/security/keytabs/kafka_client.keytab \
+   --spring.cloud.stream.kafka.binder.jaas.options.principal=kafka-client-1@EXAMPLE.COM
+
+
+
+

The preceding example represents the equivalent of the following JAAS file:

+
+
+
+
KafkaClient {
+    com.sun.security.auth.module.Krb5LoginModule required
+    useKeyTab=true
+    storeKey=true
+    keyTab="/etc/security/keytabs/kafka_client.keytab"
+    principal="kafka-client-1@EXAMPLE.COM";
+};
+
+
+
+

If the topics required already exist on the broker or will be created by an administrator, autocreation can be turned off and only client JAAS properties need to be sent.

+
+
+ + + + + +
+ + +Do not mix JAAS configuration files and Spring Boot properties in the same application. +If the -Djava.security.auth.login.config system property is already present, Spring Cloud Stream ignores the Spring Boot properties. +
+
+
+ + + + + +
+ + +Be careful when using the autoCreateTopics and autoAddPartitions with Kerberos. +Usually, applications may use principals that do not have administrative rights in Kafka and Zookeeper. +Consequently, relying on Spring Cloud Stream to create/modify topics may fail. +In secure environments, we strongly recommend creating topics and managing ACLs administratively by using Kafka tooling. +
+
+
+
+
+
Example: Pausing and Resuming the Consumer
+
+

If you wish to suspend consumption but not cause a partition rebalance, you can pause and resume the consumer. +This is facilitated by adding the Consumer as a parameter to your @StreamListener. +To resume, you need an ApplicationListener for ListenerContainerIdleEvent instances. +The frequency at which events are published is controlled by the idleEventInterval property. +Since the consumer is not thread-safe, you must call these methods on the calling thread.

+
+
+

The following simple application shows how to pause and resume:

+
+
+
+
@SpringBootApplication
+@EnableBinding(Sink.class)
+public class Application {
+
+	public static void main(String[] args) {
+		SpringApplication.run(Application.class, args);
+	}
+
+	@StreamListener(Sink.INPUT)
+	public void in(String in, @Header(KafkaHeaders.CONSUMER) Consumer<?, ?> consumer) {
+		System.out.println(in);
+		consumer.pause(Collections.singleton(new TopicPartition("myTopic", 0)));
+	}
+
+	@Bean
+	public ApplicationListener<ListenerContainerIdleEvent> idleListener() {
+		return event -> {
+			System.out.println(event);
+			if (event.getConsumer().paused().size() > 0) {
+				event.getConsumer().resume(event.getConsumer().paused());
+			}
+		};
+	}
+
+}
+
+
+
+
+
+
+

1.4. Transactional Binder

+
+

Enable transactions by setting spring.cloud.stream.kafka.binder.transaction.transactionIdPrefix to a non-empty value, e.g. tx-. +When used in a processor application, the consumer starts the transaction; any records sent on the consumer thread participate in the same transaction. +When the listener exits normally, the listener container will send the offset to the transaction and commit it. +A common producer factory is used for all producer bindings configured using spring.cloud.stream.kafka.binder.transaction.producer.* properties; individual binding Kafka producer properties are ignored.

+
+
+ + + + + +
+ + +Normal binder retries (and dead lettering) are not supported with transactions because the retries will run in the original transaction, which may be rolled back and any published records will be rolled back too. +When retries are enabled (the common property maxAttempts is greater than zero) the retry properties are used to configure a DefaultAfterRollbackProcessor to enable retries at the container level. +Similarly, instead of publishing dead-letter records within the transaction, this functionality is moved to the listener container, again via the DefaultAfterRollbackProcessor which runs after the main transaction has rolled back. +
+
+
+

If you wish to use transactions in a source application, or from some arbitrary thread for producer-only transaction (e.g. @Scheduled method), you must get a reference to the transactional producer factory and define a KafkaTransactionManager bean using it.

+
+
+
+
+
+
@Bean
+public PlatformTransactionManager transactionManager(BinderFactory binders) {
+    ProducerFactory<byte[], byte[]> pf = ((KafkaMessageChannelBinder) binders.getBinder(null,
+            MessageChannel.class)).getTransactionalProducerFactory();
+    return new KafkaTransactionManager<>(pf);
+}
+
+
+
+
+
+

Notice that we get a reference to the binder using the BinderFactory; use null in the first argument when there is only one binder configured. +If more than one binder is configured, use the binder name to get the reference. +Once we have a reference to the binder, we can obtain a reference to the ProducerFactory and create a transaction manager.

+
+
+

Then you would use normal Spring transaction support, e.g. TransactionTemplate or @Transactional, for example:

+
+
+
+
+
+
public static class Sender {
+
+    @Transactional
+    public void doInTransaction(MessageChannel output, List<String> stuffToSend) {
+        stuffToSend.forEach(stuff -> output.send(new GenericMessage<>(stuff)));
+    }
+
+}
+
+
+
+
+
+

If you wish to synchronize producer-only transactions with those from some other transaction manager, use a ChainedTransactionManager.

+
+
+
+

1.5. Error Channels

+
+

Starting with version 1.3, the binder unconditionally sends exceptions to an error channel for each consumer destination and can also be configured to send async producer send failures to an error channel. +See [spring-cloud-stream-overview-error-handling] for more information.

+
+
+

The payload of the ErrorMessage for a send failure is a KafkaSendFailureException with properties:

+
+
+
    +
  • +

    failedMessage: The Spring Messaging Message<?> that failed to be sent.

    +
  • +
  • +

    record: The raw ProducerRecord that was created from the failedMessage

    +
  • +
+
+
+

There is no automatic handling of producer exceptions (such as sending to a Dead-Letter queue). +You can consume these exceptions with your own Spring Integration flow.

+
+
+
+

1.6. Kafka Metrics

+
+

Kafka binder module exposes the following metrics:

+
+
+

spring.cloud.stream.binder.kafka.offset: This metric indicates how many messages have not been yet consumed from a given binder’s topic by a given consumer group. +The metrics provided are based on the Mircometer metrics library. The metric contains the consumer group information, topic and the actual lag in committed offset from the latest offset on the topic. +This metric is particularly useful for providing auto-scaling feedback to a PaaS platform.

+
+
+
+

1.7. Tombstone Records (null record values)

+
+

When using compacted topics, a record with a null value (also called a tombstone record) represents the deletion of a key. +To receive such messages in a @StreamListener method, the parameter must be marked as not required to receive a null value argument.

+
+
+
+
+
+
@StreamListener(Sink.INPUT)
+public void in(@Header(KafkaHeaders.RECEIVED_MESSAGE_KEY) byte[] key,
+               @Payload(required = false) Customer customer) {
+    // customer is null if a tombstone record
+    ...
+}
+
+
+
+
+
+
+

1.8. Using a KafkaRebalanceListener

+
+

Applications may wish to seek topics/partitions to arbitrary offsets when the partitions are initially assigned, or perform other operations on the consumer. +Starting with version 2.1, if you provide a single KafkaRebalanceListener bean in the application context, it will be wired into all Kafka consumer bindings.

+
+
+
+
+
+
public interface KafkaBindingRebalanceListener {
+
+	/**
+	 * Invoked by the container before any pending offsets are committed.
+	 * @param bindingName the name of the binding.
+	 * @param consumer the consumer.
+	 * @param partitions the partitions.
+	 */
+	default void onPartitionsRevokedBeforeCommit(String bindingName, Consumer<?, ?> consumer,
+			Collection<TopicPartition> partitions) {
+
+	}
+
+	/**
+	 * Invoked by the container after any pending offsets are committed.
+	 * @param bindingName the name of the binding.
+	 * @param consumer the consumer.
+	 * @param partitions the partitions.
+	 */
+	default void onPartitionsRevokedAfterCommit(String bindingName, Consumer<?, ?> consumer, Collection<TopicPartition> partitions) {
+
+	}
+
+	/**
+	 * Invoked when partitions are initially assigned or after a rebalance.
+	 * Applications might only want to perform seek operations on an initial assignment.
+	 * @param bindingName the name of the binding.
+	 * @param consumer the consumer.
+	 * @param partitions the partitions.
+	 * @param initial true if this is the initial assignment.
+	 */
+	default void onPartitionsAssigned(String bindingName, Consumer<?, ?> consumer, Collection<TopicPartition> partitions,
+			boolean initial) {
+
+	}
+
+}
+
+
+
+
+
+

You cannot set the resetOffsets consumer property to true when you provide a rebalance listener.

+
+
+
+

1.9. Dead-Letter Topic Processing

+
+

1.9.1. Dead-Letter Topic Partition Selection

+
+

By default, records are published to the Dead-Letter topic using the same partition as the original record. +This means the Dead-Letter topic must have at least as many partitions as the original record.

+
+
+

To change this behavior, add a DlqPartitionFunction implementation as a @Bean to the application context. +Only one such bean can be present. +The function is provided with the consumer group, the failed ConsumerRecord and the exception. +For example, if you always want to route to partition 0, you might use:

+
+
+
+
+
+
@Bean
+public DlqPartitionFunction partitionFunction() {
+    return (group, record, ex) -> 0;
+}
+
+
+
+
+
+ + + + + +
+ + +If you set a consumer binding’s dlqPartitions property to 1 (and the binder’s minPartitionCount is equal to 1), there is no need to supply a DlqPartitionFunction; the framework will always use partition 0. +If you set a consumer binding’s dlqPartitions property to a value greater than 1 (or the binder’s minPartitionCount is greater than 1), you must provide a DlqPartitionFunction bean, even if the partition count is the same as the original topic’s. +
+
+
+
+

1.9.2. Handling Records in a Dead-Letter Topic

+
+

Because the framework cannot anticipate how users would want to dispose of dead-lettered messages, it does not provide any standard mechanism to handle them. +If the reason for the dead-lettering is transient, you may wish to route the messages back to the original topic. +However, if the problem is a permanent issue, that could cause an infinite loop. +The sample Spring Boot application within this topic is an example of how to route those messages back to the original topic, but it moves them to a “parking lot” topic after three attempts. +The application is another spring-cloud-stream application that reads from the dead-letter topic. +It terminates when no messages are received for 5 seconds.

+
+
+

The examples assume the original destination is so8400out and the consumer group is so8400.

+
+
+

There are a couple of strategies to consider:

+
+
+
    +
  • +

    Consider running the rerouting only when the main application is not running. +Otherwise, the retries for transient errors are used up very quickly.

    +
  • +
  • +

    Alternatively, use a two-stage approach: Use this application to route to a third topic and another to route from there back to the main topic.

    +
  • +
+
+
+

The following code listings show the sample application:

+
+
+
application.properties
+
+
spring.cloud.stream.bindings.input.group=so8400replay
+spring.cloud.stream.bindings.input.destination=error.so8400out.so8400
+
+spring.cloud.stream.bindings.output.destination=so8400out
+
+spring.cloud.stream.bindings.parkingLot.destination=so8400in.parkingLot
+
+spring.cloud.stream.kafka.binder.configuration.auto.offset.reset=earliest
+
+spring.cloud.stream.kafka.binder.headers=x-retries
+
+
+
+
Application
+
+
@SpringBootApplication
+@EnableBinding(TwoOutputProcessor.class)
+public class ReRouteDlqKApplication implements CommandLineRunner {
+
+    private static final String X_RETRIES_HEADER = "x-retries";
+
+    public static void main(String[] args) {
+        SpringApplication.run(ReRouteDlqKApplication.class, args).close();
+    }
+
+    private final AtomicInteger processed = new AtomicInteger();
+
+    @Autowired
+    private MessageChannel parkingLot;
+
+    @StreamListener(Processor.INPUT)
+    @SendTo(Processor.OUTPUT)
+    public Message<?> reRoute(Message<?> failed) {
+        processed.incrementAndGet();
+        Integer retries = failed.getHeaders().get(X_RETRIES_HEADER, Integer.class);
+        if (retries == null) {
+            System.out.println("First retry for " + failed);
+            return MessageBuilder.fromMessage(failed)
+                    .setHeader(X_RETRIES_HEADER, new Integer(1))
+                    .setHeader(BinderHeaders.PARTITION_OVERRIDE,
+                            failed.getHeaders().get(KafkaHeaders.RECEIVED_PARTITION_ID))
+                    .build();
+        }
+        else if (retries.intValue() < 3) {
+            System.out.println("Another retry for " + failed);
+            return MessageBuilder.fromMessage(failed)
+                    .setHeader(X_RETRIES_HEADER, new Integer(retries.intValue() + 1))
+                    .setHeader(BinderHeaders.PARTITION_OVERRIDE,
+                            failed.getHeaders().get(KafkaHeaders.RECEIVED_PARTITION_ID))
+                    .build();
+        }
+        else {
+            System.out.println("Retries exhausted for " + failed);
+            parkingLot.send(MessageBuilder.fromMessage(failed)
+                    .setHeader(BinderHeaders.PARTITION_OVERRIDE,
+                            failed.getHeaders().get(KafkaHeaders.RECEIVED_PARTITION_ID))
+                    .build());
+        }
+        return null;
+    }
+
+    @Override
+    public void run(String... args) throws Exception {
+        while (true) {
+            int count = this.processed.get();
+            Thread.sleep(5000);
+            if (count == this.processed.get()) {
+                System.out.println("Idle, terminating");
+                return;
+            }
+        }
+    }
+
+    public interface TwoOutputProcessor extends Processor {
+
+        @Output("parkingLot")
+        MessageChannel parkingLot();
+
+    }
+
+}
+
+
+
+
+
+

1.10. Partitioning with the Kafka Binder

+
+

Apache Kafka supports topic partitioning natively.

+
+
+

Sometimes it is advantageous to send data to specific partitions — for example, when you want to strictly order message processing (all messages for a particular customer should go to the same partition).

+
+
+

The following example shows how to configure the producer and consumer side:

+
+
+
+
@SpringBootApplication
+@EnableBinding(Source.class)
+public class KafkaPartitionProducerApplication {
+
+    private static final Random RANDOM = new Random(System.currentTimeMillis());
+
+    private static final String[] data = new String[] {
+            "foo1", "bar1", "qux1",
+            "foo2", "bar2", "qux2",
+            "foo3", "bar3", "qux3",
+            "foo4", "bar4", "qux4",
+            };
+
+    public static void main(String[] args) {
+        new SpringApplicationBuilder(KafkaPartitionProducerApplication.class)
+            .web(false)
+            .run(args);
+    }
+
+    @InboundChannelAdapter(channel = Source.OUTPUT, poller = @Poller(fixedRate = "5000"))
+    public Message<?> generate() {
+        String value = data[RANDOM.nextInt(data.length)];
+        System.out.println("Sending: " + value);
+        return MessageBuilder.withPayload(value)
+                .setHeader("partitionKey", value)
+                .build();
+    }
+
+}
+
+
+
+
application.yml
+
+
spring:
+  cloud:
+    stream:
+      bindings:
+        output:
+          destination: partitioned.topic
+          producer:
+            partition-key-expression: headers['partitionKey']
+            partition-count: 12
+
+
+
+ + + + + +
+ + +The topic must be provisioned to have enough partitions to achieve the desired concurrency for all consumer groups. +The above configuration supports up to 12 consumer instances (6 if their concurrency is 2, 4 if their concurrency is 3, and so on). +It is generally best to “over-provision” the partitions to allow for future increases in consumers or concurrency. +
+
+
+ + + + + +
+ + +The preceding configuration uses the default partitioning (key.hashCode() % partitionCount). +This may or may not provide a suitably balanced algorithm, depending on the key values. +You can override this default by using the partitionSelectorExpression or partitionSelectorClass properties. +
+
+
+

Since partitions are natively handled by Kafka, no special configuration is needed on the consumer side. +Kafka allocates partitions across the instances.

+
+
+

The following Spring Boot application listens to a Kafka stream and prints (to the console) the partition ID to which each message goes:

+
+
+
+
@SpringBootApplication
+@EnableBinding(Sink.class)
+public class KafkaPartitionConsumerApplication {
+
+    public static void main(String[] args) {
+        new SpringApplicationBuilder(KafkaPartitionConsumerApplication.class)
+            .web(false)
+            .run(args);
+    }
+
+    @StreamListener(Sink.INPUT)
+    public void listen(@Payload String in, @Header(KafkaHeaders.RECEIVED_PARTITION_ID) int partition) {
+        System.out.println(in + " received from partition " + partition);
+    }
+
+}
+
+
+
+
application.yml
+
+
spring:
+  cloud:
+    stream:
+      bindings:
+        input:
+          destination: partitioned.topic
+          group: myGroup
+
+
+
+

You can add instances as needed. +Kafka rebalances the partition allocations. +If the instance count (or instance count * concurrency) exceeds the number of partitions, some consumers are idle.

+
+
+
+
+
+

2. Kafka Streams Binder

+
+
+

2.1. Usage

+
+

For using the Kafka Streams binder, you just need to add it to your Spring Cloud Stream application, using the following maven coordinates:

+
+
+
+
<dependency>
+  <groupId>org.springframework.cloud</groupId>
+  <artifactId>spring-cloud-stream-binder-kafka-streams</artifactId>
+</dependency>
+
+
+
+

A quick way to bootstrap a new project for Kafka Streams binder is to use Spring Initializr and then select "Cloud Streams" and "Spring for Kafka Streams" as shown below

+
+
+
+spring initializr kafka streams +
+
+
+
+

2.2. Overview

+
+

Spring Cloud Stream includes a binder implementation designed explicitly for Apache Kafka Streams binding. +With this native integration, a Spring Cloud Stream "processor" application can directly use the +Apache Kafka Streams APIs in the core business logic.

+
+
+

Kafka Streams binder implementation builds on the foundations provided by the Spring for Apache Kafka project.

+
+
+

Kafka Streams binder provides binding capabilities for the three major types in Kafka Streams - KStream, KTable and GlobalKTable.

+
+
+

Kafka Streams applications typically follow a model in which the records are read from an inbound topic, apply business logic, and then write the transformed records to an outbound topic. +Alternatively, a Processor application with no outbound destination can be defined as well.

+
+
+

In the following sections, we are going to look at the details of Spring Cloud Stream’s integration with Kafka Streams.

+
+
+
+

2.3. Programming Model

+
+

When using the programming model provided by Kafka Streams binder, both the high-level Streams DSL and a mix of both the higher level and the lower level Processor-API can be used as options. +When mixing both higher and lower level API’s, this is usually achieved by invoking transform or process API methods on KStream.

+
+
+

2.3.1. Functional Style

+
+

Starting with Spring Cloud Stream 3.0.0, Kafka Streams binder allows the applications to be designed and developed using the functional programming style that is available in Java 8. +This means that the applications can be concisely represented as a lambda expression of types java.util.function.Function or java.util.function.Consumer.

+
+
+

Let’s take a very basic example.

+
+
+
+
@SpringBootApplication
+public class SimpleConsumerApplication {
+
+    @Bean
+    public java.util.function.Consumer<KStream<Object, String>> process() {
+
+        return input ->
+                input.foreach((key, value) -> {
+                    System.out.println("Key: " + key + " Value: " + value);
+                });
+    }
+}
+
+
+
+

Albeit simple, this is a complete standalone Spring Boot application that is leveraging Kafka Streams for stream processing. +This is a consumer application with no outbound binding and only a single inbound binding. +The application consumes data and it simply logs the information from the KStream key and value on the standard output. +The application contains the SpringBootApplication annotation and a method that is marked as Bean. +The bean method is of type java.util.function.Consumer which is parameterized with KStream. +Then in the implementation, we are returning a Consumer object that is essentially a lambda expression. +Inside the lambda expression, the code for processing the data is provided.

+
+
+

In this application, there is a single input binding that is of type KStream. +The binder creates this binding for the application with a name process-in-0, i.e. the name of the function bean name followed by a dash character (-) and the literal in followed by another dash and then the ordinal position of the parameter. +You use this binding name to set other properties such as destination. +For example, spring.cloud.stream.bindings.process-in-0.destination=my-topic.

+
+
+ + + + + +
+ + +If the destination property is not set on the binding, a topic is created with the same name as the binding (if there are sufficient privileges for the application) or that topic is expected to be already available. +
+
+
+

Once built as a uber-jar (e.g., kstream-consumer-app.jar), you can run the above example like the following.

+
+
+
+
java -jar kstream-consumer-app.jar --spring.cloud.stream.bindings.process-in-0.destination=my-topic
+
+
+
+

Here is another example, where it is a full processor with both input and output bindings. +This is the classic word-count example in which the application receives data from a topic, the number of occurrences for each word is then computed in a tumbling time-window.

+
+
+
+
@SpringBootApplication
+public class WordCountProcessorApplication {
+
+  @Bean
+  public Function<KStream<Object, String>, KStream<?, WordCount>> process() {
+
+    return input -> input
+                .flatMapValues(value -> Arrays.asList(value.toLowerCase().split("\\W+")))
+                .map((key, value) -> new KeyValue<>(value, value))
+                .groupByKey(Serialized.with(Serdes.String(), Serdes.String()))
+                .windowedBy(TimeWindows.of(5000))
+                .count(Materialized.as("word-counts-state-store"))
+                .toStream()
+                .map((key, value) -> new KeyValue<>(key.key(), new WordCount(key.key(), value,
+                        new Date(key.window().start()), new Date(key.window().end()))));
+  }
+
+	public static void main(String[] args) {
+		SpringApplication.run(WordCountProcessorApplication.class, args);
+	}
+}
+
+
+
+

Here again, this is a complete Spring Boot application. The difference here from the first application is that the bean method is of type java.util.function.Function. +The first parameterized type for the Function is for the input KStream and the second one is for the output. +In the method body, a lambda expression is provided that is of type Function and as implementation, the actual business logic is given. +Similar to the previously discussed Consumer based application, the input binding here is named as process-in-0 by default. For the output, the binding name is automatically also set to process-out-0.

+
+
+

Once built as an uber-jar (e.g., wordcount-processor.jar), you can run the above example like the following.

+
+
+
+
java -jar wordcount-processor.jar --spring.cloud.stream.bindings.process-in-0.destination=words --spring.cloud.stream.bindings.process-out-0.destination=counts
+
+
+
+

This application will consume messages from the Kafka topic words and the computed results are published to an output +topic counts.

+
+
+

Spring Cloud Stream will ensure that the messages from both the incoming and outgoing topics are automatically bound as +KStream objects. As a developer, you can exclusively focus on the business aspects of the code, i.e. writing the logic +required in the processor. Setting up Kafka Streams specific configuration required by the Kafka Streams infrastructure +is automatically handled by the framework.

+
+
+

The two examples we saw above have a single KStream input binding. In both cases, the bindings received the records from a single topic. +If you want to multiplex multiple topics into a single KStream binding, you can provide comma separated Kafka topics as destinations below.

+
+
+

spring.cloud.stream.bindings.process-in-0.destination=topic-1,topic-2,topic-3

+
+
+

In addition, you can also provide topic patterns as destinations if you want to match topics against a regular exression.

+
+
+

spring.cloud.stream.bindings.process-in-0.destination=input.*

+
+
+
Multiple Input Bindings
+
+

Many non-trivial Kafka Streams applications often consume data from more than one topic through multiple bindings. +For instance, one topic is consumed as Kstream and another as KTable or GlobalKTable. +There are many reasons why an application might want to receive data as a table type. +Think of a use-case where the underlying topic is populated through a change data capture (CDC) mechanism from a database or perhaps the application only cares about the latest updates for downstream processing. +If the application specifies that the data needs to be bound as KTable or GlobalKTable, then Kafka Streams binder will properly bind the destination to a KTable or GlobalKTable and make them available for the application to operate upon. +We will look at a few different scenarios how multiple input bindings are handled in the Kafka Streams binder.

+
+
+
BiFunction in Kafka Streams Binder
+
+

Here is an example where we have two inputs and an output. In this case, the application can leverage on java.util.function.BiFunction.

+
+
+
+
@Bean
+public BiFunction<KStream<String, Long>, KTable<String, String>, KStream<String, Long>> process() {
+    return (userClicksStream, userRegionsTable) -> (userClicksStream
+            .leftJoin(userRegionsTable, (clicks, region) -> new RegionWithClicks(region == null ?
+                            "UNKNOWN" : region, clicks),
+                    Joined.with(Serdes.String(), Serdes.Long(), null))
+            .map((user, regionWithClicks) -> new KeyValue<>(regionWithClicks.getRegion(),
+                    regionWithClicks.getClicks()))
+            .groupByKey(Grouped.with(Serdes.String(), Serdes.Long()))
+            .reduce(Long::sum)
+            .toStream());
+}
+
+
+
+

Here again, the basic theme is the same as in the previous examples, but here we have two inputs. +Java’s BiFunction support is used to bind the inputs to the desired destinations. +The default binding names generated by the binder for the inputs are process-in-0 and process-in-1 respectively. The default output binding is process-out-0. +In this example, the first parameter of BiFunction is bound as a KStream for the first input and the second parameter is bound as a KTable for the second input.

+
+
+
+
BiConsumer in Kafka Streams Binder
+
+

If there are two inputs, but no outputs, in that case we can use java.util.function.BiConsumer as shown below.

+
+
+
+
@Bean
+public BiConsumer<KStream<String, Long>, KTable<String, String>> process() {
+    return (userClicksStream, userRegionsTable) -> {}
+}
+
+
+
+
+
Beyond two inputs
+
+

What if you have more than two inputs? +There are situations in which you need more than two inputs. In that case, the binder allows you to chain partial functions. +In functional programming jargon, this technique is generally known as currying. +With the functional programming support added as part of Java 8, Java now enables you to write curried functions. +Spring Cloud Stream Kafka Streams binder can make use of this feature to enable multiple input bindings.

+
+
+

Let’s see an example.

+
+
+
+
@Bean
+public Function<KStream<Long, Order>,
+        Function<GlobalKTable<Long, Customer>,
+                Function<GlobalKTable<Long, Product>, KStream<Long, EnrichedOrder>>>> enrichOrder() {
+
+    return orders -> (
+              customers -> (
+                    products -> (
+                        orders.join(customers,
+                            (orderId, order) -> order.getCustomerId(),
+                                (order, customer) -> new CustomerOrder(customer, order))
+                                .join(products,
+                                        (orderId, customerOrder) -> customerOrder
+                                                .productId(),
+                                        (customerOrder, product) -> {
+                                            EnrichedOrder enrichedOrder = new EnrichedOrder();
+                                            enrichedOrder.setProduct(product);
+                                            enrichedOrder.setCustomer(customerOrder.customer);
+                                            enrichedOrder.setOrder(customerOrder.order);
+                                            return enrichedOrder;
+                                        })
+                        )
+                )
+    );
+}
+
+
+
+

Let’s look at the details of the binding model presented above. +In this model, we have 3 partially applied functions on the inbound. Let’s call them as f(x), f(y) and f(z). +If we expand these functions in the sense of true mathematical functions, it will look like these: f(x) → (fy) → f(z) → KStream<Long, EnrichedOrder>. +The x variable stands for KStream<Long, Order>, the y variable stands for GlobalKTable<Long, Customer> and the z variable stands for GlobalKTable<Long, Product>. +The first function f(x) has the first input binding of the application (KStream<Long, Order>) and its output is the function, f(y). +The function f(y) has the second input binding for the application (GlobalKTable<Long, Customer>) and its output is yet another function, f(z). +The input for the function f(z) is the third input for the application (GlobalKTable<Long, Product>) and its output is KStream<Long, EnrichedOrder> which is the final output binding for the application. +The input from the three partial functions which are KStream, GlobalKTable, GlobalKTable respectively are available for you in the method body for implementing the business logic as part of the lambda expression.

+
+
+

Input bindings are named as enrichOrder-in-0, enrichOrder-in-1 and enrichOrder-in-2 respectively. Output binding is named as enrichOrder-out-0.

+
+
+

With curried functions, you can virtually have any number of inputs. However, keep in mind that, anything more than a smaller number of inputs and partially applied functions for them as above in Java might lead to unreadable code. +Therefore if your Kafka Streams application requires more than a reasonably smaller number of input bindings and you want to use this functional model, then you may want to rethink your design and decompose the application appropriately.

+
+
+
+
+
Multiple Output Bindings
+
+

Kafka Streams allows to write outbound data into multiple topics. This feature is known as branching in Kafka Streams. +When using multiple output bindings, you need to provide an array of KStream (KStream[]) as the outbound return type.

+
+
+

Here is an example:

+
+
+
+
@Bean
+public Function<KStream<Object, String>, KStream<?, WordCount>[]> process() {
+
+    Predicate<Object, WordCount> isEnglish = (k, v) -> v.word.equals("english");
+    Predicate<Object, WordCount> isFrench = (k, v) -> v.word.equals("french");
+    Predicate<Object, WordCount> isSpanish = (k, v) -> v.word.equals("spanish");
+
+    return input -> input
+            .flatMapValues(value -> Arrays.asList(value.toLowerCase().split("\\W+")))
+            .groupBy((key, value) -> value)
+            .windowedBy(TimeWindows.of(5000))
+            .count(Materialized.as("WordCounts-branch"))
+            .toStream()
+            .map((key, value) -> new KeyValue<>(null, new WordCount(key.key(), value,
+                    new Date(key.window().start()), new Date(key.window().end()))))
+            .branch(isEnglish, isFrench, isSpanish);
+}
+
+
+
+

The programming model remains the same, however the outbound parameterized type is KStream[]. +The default output binding names are process-out-0, process-out-1, process-out-2 respectively. +The reason why the binder generates three output bindings is because it detects the length of the returned KStream array.

+
+
+
+
Summary of Function based Programming Styles for Kafka Streams
+
+

In summary, the following table shows the various options that can be used in the functional paradigm.

+
+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Number of InputsNumber of OutputsComponent to use

1

0

java.util.function.Consumer

2

0

java.util.function.BiConsumer

1

1..n

java.util.function.Function

2

1..n

java.util.function.BiFunction

>= 3

0..n

Use curried functions

+
+
    +
  • +

    In the case of more than one output in this table, the type simply becomes KStream[].

    +
  • +
+
+
+
+
+

2.3.2. Imperative programming model.

+
+

Although the functional programming model outlined above is the preferred approach, you can still use the classic StreamListener based approach if you prefer.

+
+
+

Here are some examples.

+
+
+

Following is the equivalent of the Word count example using StreamListener.

+
+
+
+
@SpringBootApplication
+@EnableBinding(KafkaStreamsProcessor.class)
+public class WordCountProcessorApplication {
+
+    @StreamListener("input")
+    @SendTo("output")
+    public KStream<?, WordCount> process(KStream<?, String> input) {
+        return input
+                .flatMapValues(value -> Arrays.asList(value.toLowerCase().split("\\W+")))
+                .groupBy((key, value) -> value)
+                .windowedBy(TimeWindows.of(5000))
+                .count(Materialized.as("WordCounts-multi"))
+                .toStream()
+                .map((key, value) -> new KeyValue<>(null, new WordCount(key.key(), value, new Date(key.window().start()), new Date(key.window().end()))));
+    }
+
+    public static void main(String[] args) {
+        SpringApplication.run(WordCountProcessorApplication.class, args);
+    }
+
+
+
+

As you can see, this is a bit more verbose since you need to provide EnableBinding and the other extra annotations like StreamListener and SendTo to make it a complete application. +EnableBinding is where you specify your binding interface that contains your bindings. +In this case, we are using the stock KafkaStreamsProcessor binding interface that has the following contracts.

+
+
+
+
public interface KafkaStreamsProcessor {
+
+	@Input("input")
+	KStream<?, ?> input();
+
+	@Output("output")
+	KStream<?, ?> output();
+
+}
+
+
+
+

Binder will create bindings for the input KStream and output KStream since you are using a binding interface that contains those declarations.

+
+
+

In addition to the obvious differences in the programming model offered in the functional style, one particular thing that needs to be mentioned here is that the binding names are what you specify in the binding interface. +For example, in the above application, since we are using KafkaStreamsProcessor, the binding names are input and output. +Binding properties need to use those names. For instance spring.cloud.stream.bindings.input.destination, spring.cloud.stream.bindings.output.destination etc. +Keep in mind that this is fundamentally different from the functional style since there the binder generates binding names for the application. +This is because the application does not provide any binding interfaces in the functional model using EnableBinding.

+
+
+

Here is another example of a sink where we have two inputs.

+
+
+
+
@EnableBinding(KStreamKTableBinding.class)
+.....
+.....
+@StreamListener
+public void process(@Input("inputStream") KStream<String, PlayEvent> playEvents,
+                    @Input("inputTable") KTable<Long, Song> songTable) {
+                    ....
+                    ....
+}
+
+interface KStreamKTableBinding {
+
+    @Input("inputStream")
+    KStream<?, ?> inputStream();
+
+    @Input("inputTable")
+    KTable<?, ?> inputTable();
+}
+
+
+
+

Following is the StreamListener equivalent of the same BiFunction based processor that we saw above.

+
+
+
+
@EnableBinding(KStreamKTableBinding.class)
+....
+....
+
+@StreamListener
+@SendTo("output")
+public KStream<String, Long> process(@Input("input") KStream<String, Long> userClicksStream,
+                                     @Input("inputTable") KTable<String, String> userRegionsTable) {
+....
+....
+}
+
+interface KStreamKTableBinding extends KafkaStreamsProcessor {
+
+    @Input("inputX")
+    KTable<?, ?> inputTable();
+}
+
+
+
+

Finally, here is the StreamListener equivalent of the application with three inputs and curried functions.

+
+
+
+
@EnableBinding(CustomGlobalKTableProcessor.class)
+...
+...
+    @StreamListener
+    @SendTo("output")
+    public KStream<Long, EnrichedOrder> process(
+            @Input("input-1") KStream<Long, Order> ordersStream,
+            @Input("input-"2) GlobalKTable<Long, Customer> customers,
+            @Input("input-3") GlobalKTable<Long, Product> products) {
+
+        KStream<Long, CustomerOrder> customerOrdersStream = ordersStream.join(
+                customers, (orderId, order) -> order.getCustomerId(),
+                (order, customer) -> new CustomerOrder(customer, order));
+
+        return customerOrdersStream.join(products,
+                (orderId, customerOrder) -> customerOrder.productId(),
+                (customerOrder, product) -> {
+                    EnrichedOrder enrichedOrder = new EnrichedOrder();
+                    enrichedOrder.setProduct(product);
+                    enrichedOrder.setCustomer(customerOrder.customer);
+                    enrichedOrder.setOrder(customerOrder.order);
+                    return enrichedOrder;
+                });
+        }
+
+    interface CustomGlobalKTableProcessor {
+
+            @Input("input-1")
+            KStream<?, ?> input1();
+
+            @Input("input-2")
+            GlobalKTable<?, ?> input2();
+
+            @Input("input-3")
+            GlobalKTable<?, ?> input3();
+
+            @Output("output")
+            KStream<?, ?> output();
+    }
+
+
+
+

You might notice that the above two examples are even more verbose since in addition to provide EnableBinding, you also need to write your own custom binding interface as well. +Using the functional model, you can avoid all those ceremonial details.

+
+
+

Before we move on from looking at the general programming model offered by Kafka Streams binder, here is the StreamListener version of multiple output bindings.

+
+
+
+
EnableBinding(KStreamProcessorWithBranches.class)
+public static class WordCountProcessorApplication {
+
+    @Autowired
+    private TimeWindows timeWindows;
+
+    @StreamListener("input")
+    @SendTo({"output1","output2","output3"})
+    public KStream<?, WordCount>[] process(KStream<Object, String> input) {
+
+			Predicate<Object, WordCount> isEnglish = (k, v) -> v.word.equals("english");
+			Predicate<Object, WordCount> isFrench =  (k, v) -> v.word.equals("french");
+			Predicate<Object, WordCount> isSpanish = (k, v) -> v.word.equals("spanish");
+
+			return input
+					.flatMapValues(value -> Arrays.asList(value.toLowerCase().split("\\W+")))
+					.groupBy((key, value) -> value)
+					.windowedBy(timeWindows)
+					.count(Materialized.as("WordCounts-1"))
+					.toStream()
+					.map((key, value) -> new KeyValue<>(null, new WordCount(key.key(), value, new Date(key.window().start()), new Date(key.window().end()))))
+					.branch(isEnglish, isFrench, isSpanish);
+    }
+
+    interface KStreamProcessorWithBranches {
+
+    		@Input("input")
+    		KStream<?, ?> input();
+
+    		@Output("output1")
+    		KStream<?, ?> output1();
+
+    		@Output("output2")
+    		KStream<?, ?> output2();
+
+    		@Output("output3")
+    		KStream<?, ?> output3();
+    	}
+}
+
+
+
+

To recap, we have reviewed the various programming model choices when using the Kafka Streams binder.

+
+
+

The binder provides binding capabilities for KStream, KTable and GlobalKTable on the input. +KTable and GlobalKTable bindings are only available on the input. +Binder supports both input and output bindings for KStream.

+
+
+

The upshot of the programming model of Kafka Streams binder is that the binder provides you the flexibility of going with a fully functional programming model or using the StreamListener based imperative approach.

+
+
+
+
+

2.4. Ancillaries to the programming model

+
+

2.4.1. Multiple Kafka Streams processors within a single application

+
+

Binder allows to have multiple Kafka Streams processors within a single Spring Cloud Stream application. +You can have an application as below.

+
+
+
+
@Bean
+public java.util.function.Function<KStream<Object, String>, KStream<Object, String>> process() {
+   ...
+}
+
+@Bean
+public java.util.function.Consumer<KStream<Object, String>> anotherProcess() {
+  ...
+}
+
+@Bean
+public java.util.function.BiFunction<KStream<Object, String>, KTable<Integer, String>, KStream<Object, String>> yetAnotherProcess() {
+   ...
+}
+
+
+
+

In this case, the binder will create 3 separate Kafka Streams objects with different application ID’s (more on this below). +However, if you have more than one processor in the application, you have to tell Spring Cloud Stream, which functions need to be activated. +Here is how you activate the functions.

+
+
+

spring.cloud.stream.function.definition: process;anotherProcess;yetAnotherProcess

+
+
+

If you want certain functions to be not activated right away, you can remove that from this list.

+
+
+

This is also true when you have a single Kafka Streams processor and other types of Function beans in the same application that is handled through a different binder (for e.g., a function bean that is based on the regular Kafka Message Channel binder)

+
+
+
+

2.4.2. Kafka Streams Application ID

+
+

Application id is a mandatory property that you need to provide for a Kafka Streams application. +Spring Cloud Stream Kafka Streams binder allows you to configure this application id in multiple ways.

+
+
+

If you only have one single processor or StreamListener in the application, then you can set this at the binder level using the following property:

+
+
+

spring.cloud.stream.kafka.streams.binder.applicationId.

+
+
+

As a convenience, if you only have a single processor, you can also use spring.application.name as the property to delegate the application id.

+
+
+

If you have multiple Kafka Streams processors in the application, then you need to set the application id per processor. +In the case of the functional model, you can attach it to each function as a property.

+
+
+

For e.g. imagine that you have the following functions.

+
+
+
+
@Bean
+public java.util.function.Consumer<KStream<Object, String>> process() {
+   ...
+}
+
+
+
+

and

+
+
+
+
@Bean
+public java.util.function.Consumer<KStream<Object, String>> anotherProcess() {
+  ...
+}
+
+
+
+

Then you can set the application id for each, using the following binder level properties.

+
+
+

spring.cloud.stream.kafka.streams.binder.functions.process.applicationId

+
+
+

and

+
+
+

spring.cloud.stream.kafka.streams.binder.functions.anotherProcess.applicationId

+
+
+

In the case of StreamListener, you need to set this on the first input binding on the processor.

+
+
+

For e.g. imagine that you have the following two StreamListener based processors.

+
+
+
+
@StreamListener
+@SendTo("output")
+public KStream<String, String> process(@Input("input") <KStream<Object, String>> input) {
+   ...
+}
+
+@StreamListener
+@SendTo("anotherOutput")
+public KStream<String, String> anotherProcess(@Input("anotherInput") <KStream<Object, String>> input) {
+   ...
+}
+
+
+
+

Then you must set the application id for this using the following binding property.

+
+
+

spring.cloud.stream.kafka.streams.bindings.input.consumer.applicationId

+
+
+

and

+
+
+

spring.cloud.stream.kafka.streams.bindings.anotherInput.consumer.applicationId

+
+
+

For function based model also, this approach of setting application id at the binding level will work. +However, setting per function at the binder level as we have seen above is much easier if you are using the functional model.

+
+
+

For production deployments, it is highly recommended to explicitly specify the application ID through configuration. +This is especially going to be very critical if you are auto scaling your application in which case you need to make sure that you are deploying each instance with the same application ID.

+
+
+

If the application does not provide an application ID, then in that case the binder will auto generate a static application ID for you. +This is convenient in development scenarios as it avoids the need for explicitly providing the application ID. +The generated application ID in this manner will be static over application restarts. +In the case of functional model, the generated application ID will be the function bean name followed by the literal applicationID, for e.g process-applicationID if process if the function bean name. +In the case of StreamListener, instead of using the function bean name, the generated application ID will be use the containing class name followed by the method name followed by the literal applicationId.

+
+
+
Summary of setting Application ID
+
+
    +
  • +

    By default, binder will auto generate the application ID per function or StreamListener methods.

    +
  • +
  • +

    If you have a single processor, then you can use spring.kafka.streams.applicationId, spring.application.name or spring.cloud.stream.kafka.streams.binder.applicationId.

    +
  • +
  • +

    If you have multiple processors, then application ID can be set per function using the property - spring.cloud.stream.kafka.streams.binder.functions.<function-name>.applicationId. +In the case of StreamListener, this can be done using spring.cloud.stream.kafka.streams.bindings.input.applicationId, assuming that the input binding name is input.

    +
  • +
+
+
+
+
+

2.4.3. Overriding the default binding names generated by the binder with the functional style

+
+

By default, the binder uses the strategy discussed above to generate the binding name when using the functional style, i.e. <function-bean-name>-<in>|<out>-[0..n], for e.g. process-in-0, process-out-0 etc. +If you want to override those binding names, you can do that by specifying the following properties.

+
+
+

spring.cloud.stream.function.bindings.<default binding name>. Default binding name is the original binding name generated by the binder.

+
+
+

For e.g. lets say, you have this function.

+
+
+
+
@Bean
+public BiFunction<KStream<String, Long>, KTable<String, String>, KStream<String, Long>> process() {
+...
+}
+
+
+
+

Binder will generate bindings with names, process-in-0, process-in-1 and process-out-0. +Now, if you want to change them to something else completely, maybe more domain specific binding names, then you can do so as below.

+
+
+

springc.cloud.stream.function.bindings.process-in-0=users

+
+
+

springc.cloud.stream.function.bindings.process-in-0=regions

+
+
+

and

+
+
+

spring.cloud.stream.function.bindings.process-out-0=clicks

+
+
+

After that, you must set all the binding level properties on these new binding names.

+
+
+

Please keep in mind that with the functional programming model described above, adhering to the default binding names make sense in most situations. +The only reason you may still want to do this overriding is when you have larger number of configuration properties and you want to map the bindings to something more domain friendly.

+
+
+
+

2.4.4. Setting up bootstrap server configuration

+
+

When running Kafka Streams applications, you must provide the Kafka broker server information. +If you don’t provide this information, the binder expects that you are running the broker at the default localhost:9092. +If that is not the case, then you need to override that. There are a couple of ways to do that.

+
+
+
    +
  • +

    Using the boot property - spring.kafka.bootstrapServers

    +
  • +
  • +

    Binder level property - spring.cloud.stream.kafka.streams.binder.brokers

    +
  • +
+
+
+

When it comes to the binder level property, it doesn’t matter if you use the broker property provided through the regular Kafka binder - spring.cloud.stream.kafka.binder.brokers. +Kafka Streams binder will first check if Kafka Streams binder specific broker property is set (spring.cloud.stream.kafka.streams.binder.brokers) and if not found, it looks for spring.cloud.stream.kafka.binder.brokers.

+
+
+
+
+

2.5. Record serialization and deserialization

+
+

Kafka Streams binder allows you to serialize and deserialize records in two ways. +One is the native serialization and deserialization facilities provided by Kafka and the other one is the message conversion capabilities of Spring Cloud Stream framework. +Lets look at some details.

+
+
+

2.5.1. Inbound deserialization

+
+

Keys are always deserialized using native Serdes.

+
+
+

For values, by default, deserialization on the inbound is natively performed by Kafka. +Please note that this is a major change on default behavior from previous versions of Kafka Streams binder where the deserialization was done by the framework.

+
+
+

Kafka Streams binder will try to infer matching Serde types by looking at the type signature of java.util.function.Function|Consumer or StreamListener. +Here is the order that it matches the Serdes.

+
+
+
    +
  • +

    If the application provides a bean of type Serde and if the return type is parameterized with the actual type of the incoming key or value type, then it will use that Serde for inbound deserialization. +For e.g. if you have the following in the application, the binder detects that the incoming value type for the KStream matches with a type that is parameterized on a Serde bean. +It will use that for inbound deserialization.

    +
  • +
+
+
+
+
@Bean
+public Serde<Foo() customSerde{
+ ...
+}
+
+@Bean
+public Function<KStream<String, Foo>, KStream<String, Foo>> process() {
+}
+
+
+
+
    +
  • +

    Next, it looks at the types and see if they are one of the types exposed by Kafka Streams. If so, use them. +Here are the Serde types that the binder will try to match from Kafka Streams.

    +
    +
    +
    Integer, Long, Short, Double, Float, byte[], UUID and String.
    +
    +
    +
  • +
  • +

    If none of the Serdes provided by Kafka Streams don’t match the types, then it will use JsonSerde provided by Spring Kafka. In this case, the binder assumes that the types are JSON friendly. +This is useful if you have multiple value objects as inputs since the binder will internally infer them to correct Java types. +Before falling back to the JsonSerde though, the binder checks at the default Serde`s set in the Kafka Streams configuration to see if it is a `Serde that it can match with the incoming KStream’s types.

    +
  • +
+
+
+

If none of the above strategies worked, then the applications must provide the `Serde`s through configuration. +This can be configured in two ways - binding or default.

+
+
+

First the binder will look if a Serde is provided at the binding level. +For e.g. if you have the following processor,

+
+
+
+
@Bean
+public BiFunction<KStream<CustomKey, AvroIn1>, KTable<CustomKey, AvroIn2>, KStream<CustomKey, AvroOutput>> process() {...}
+
+
+
+

then, you can provide a binding level Serde using the following:

+
+
+
+
spring.cloud.stream.kafka.streams.bindings.process-in-0.consumer.keySerde=CustomKeySerde
+spring.cloud.stream.kafka.streams.bindings.process-in-0.consumer.valueSerde=io.confluent.kafka.streams.serdes.avro.SpecificAvroSerde
+
+spring.cloud.stream.kafka.streams.bindings.process-in-1.consumer.keySerde=CustomKeySerde
+spring.cloud.stream.kafka.streams.bindings.process-in-1.consumer.valueSerde=io.confluent.kafka.streams.serdes.avro.SpecificAvroSerde
+
+
+
+ + + + + +
+ + +If you provide Serde as abover per input binding, then that will takes higher precedence and the binder will stay away from any Serde inference. +
+
+
+

If you want the default key/value Serdes to be used for inbound deserialization, you can do so at the binder level.

+
+
+
+
spring.cloud.stream.kafka.streams.binder.configuration.default.key.serde
+spring.cloud.stream.kafka.streams.binder.configuration.default.value.serde
+
+
+
+

If you don’t want the native decoding provided by Kafka, you can rely on the message conversion features that Spring Cloud Stream provides. +Since native decoding is the default, in order to let Spring Cloud Stream deserialize the inbound value object, you need to explicitly disable native decoding.

+
+
+

For e.g. if you have the same BiFunction processor as above, then spring.cloud.stream.bindings.process-in-0.consumer.nativeDecoding: false +You need to disable native decoding for all the inputs individually. Otherwise, native decoding will still be applied for those you do not disable.

+
+
+

By default, Spring Cloud Stream will use application/json as the content type and use an appropriate json message converter. +You can use custom message converters by using the following property and an appropriate MessageConverter bean.

+
+
+
+
spring.cloud.stream.bindings.process-in-0.contentType
+
+
+
+
+

2.5.2. Outbound serialization

+
+

Outbound serialization pretty much follows the same rules as above for inbound deserialization. +As with the inbound deserialization, one major change from the previous versions of Spring Cloud Stream is that the serialization on the outbound is handled by Kafka natively. +Before 3.0 versions of the binder, this was done by the framework itself.

+
+
+

Keys on the outbound are always serialized by Kafka using a matching Serde that is inferred by the binder. +If it can’t infer the type of the key, then that needs to be specified using configuration.

+
+
+

Value serdes are inferred using the same rules used for inbound deserialization. +First it matches to see if the outbound type is from a provided bean in the application. +If not, it checks to see if it matches with a Serde exposed by Kafka such as - Integer, Long, Short, Double, Float, byte[], UUID and String. +If that doesnt’t work, then it falls back to JsonSerde provided by the Spring Kafka project, but first look at the default Serde configuration to see if there is a match. +Keep in mind that all these happen transparently to the application. +If none of these work, then the user has to provide the Serde to use by configuration.

+
+
+

Lets say you are using the same BiFunction processor as above. Then you can configure outbound key/value Serdes as following.

+
+
+
+
spring.cloud.stream.kafka.streams.bindings.process-out-0.producer.keySerde=CustomKeySerde
+spring.cloud.stream.kafka.streams.bindings.process-out-0.producer.valueSerde=io.confluent.kafka.streams.serdes.avro.SpecificAvroSerde
+
+
+
+

If Serde inference fails, and no binding level Serdes are provided, then the binder falls back to the JsonSerde, but look at the default Serdes for a match.

+
+
+

Default serdes are configured in the same way as above where it is described under deserialization.

+
+
+

spring.cloud.stream.kafka.streams.binder.configuration.default.key.serde +spring.cloud.stream.kafka.streams.binder.configuration.default.value.serde

+
+
+

If your application uses the branching feature and has multiple output bindings, then these have to be configured per binding. +Once again, if the binder is capable of inferring the Serde types, you don’t need to do this configuration.

+
+
+

If you don’t want the native encoding provided by Kafka, but want to use the framework provided message conversion, then you need to explicitly disable native encoding since since native encoding is the default. +For e.g. if you have the same BiFunction processor as above, then spring.cloud.stream.bindings.process-out-0.producer.nativeEncoding: false +You need to disable native encoding for all the output individually in the case of branching. Otherwise, native encoding will still be applied for those you don’t disable.

+
+
+

When conversion is done by Spring Cloud Stream, by default, it will use application/json as the content type and use an appropriate json message converter. +You can use custom message converters by using the following property and a corresponding MessageConverter bean.

+
+
+
+
spring.cloud.stream.bindings.process-out-0.contentType
+
+
+
+

When native encoding/decoding is disabled, binder will not do any inference as in the case of native Serdes. +Applications need to explicitly provide all the configuration options. +For that reason, it is generally advised to stay with the default options for de/serialization and stick with native de/serialization provided by Kafka Streams when you write Spring Cloud Stream Kafka Streams applications. +The one scenario in which you must use message conversion capabilities provided by the framework is when your upstream producer is using a specific serialization strategy. +In that case, you want to use a matching deserialization strategy as native mechanisms may fail. +When relying on the default Serde mechanism, the applications must ensure that the binder has a way forward with correctly map the inbound and outbound with a proper Serde, as otherwise things might fail.

+
+
+

It is worth to mention that the data de/serialization approaches outlined above are only applicable on the edges of your processors, i.e. - inbound and outbound. +Your business logic might still need to call Kafka Streams API’s that explicitly need Serde objects. +Those are still the responsibility of the application and must be handled accordingly by the developer.

+
+
+
+
+

2.6. Error Handling

+
+

Apache Kafka Streams provides the capability for natively handling exceptions from deserialization errors. +For details on this support, please see this. +Out of the box, Apache Kafka Streams provides two kinds of deserialization exception handlers - LogAndContinueExceptionHandler and LogAndFailExceptionHandler. +As the name indicates, the former will log the error and continue processing the next records and the latter will log the error and fail. LogAndFailExceptionHandler is the default deserialization exception handler.

+
+
+

2.6.1. Handling Deserialization Exceptions in the Binder

+
+

Kafka Streams binder allows to specify the deserialization exception handlers above using the following property.

+
+
+
+
spring.cloud.stream.kafka.streams.binder.deserializationExceptionHandler: logAndContinue
+
+
+
+

or

+
+
+
+
spring.cloud.stream.kafka.streams.binder.deserializationExceptionHandler: logAndFail
+
+
+
+

In addition to the above two deserialization exception handlers, the binder also provides a third one for sending the erroneous records (poison pills) to a DLQ (dead letter queue) topic. +Here is how you enable this DLQ exception handler.

+
+
+
+
spring.cloud.stream.kafka.streams.binder.deserializationExceptionHandler: sendToDlq
+
+
+
+

When the above property is set, all the records in deserialization error are automatically sent to the DLQ topic.

+
+
+

You can set the topic name where the DLQ messages are published as below.

+
+
+
+
spring.cloud.stream.kafka.streams.bindings.process-in-0.consumer.dlqName: custom-dlq (Change the binding name accordingly)
+
+
+
+

If this is set, then the error records are sent to the topic custom-dlq. +If this is not set, then it will create a DLQ topic with the name error.<input-topic-name>.<application-id>. +For instance, if your binding’s destination topic is inputTopic and the application ID is process-applicationId, then the default DLQ topic is error.inputTopic.process-applicationId. +It is always recommended to explicitly create a DLQ topic for each input binding if it is your intention to enable DLQ.

+
+
+
+

2.6.2. DLQ per input consumer binding

+
+

The property spring.cloud.stream.kafka.streams.binder.deserializationExceptionHandler is applicable for the entire application. +This implies that if there are multiple functions or StreamListener methods in the same application, this property is applied to all of them. +However, if you have multiple processors or multiple input bindings within a single processor, then you can use the finer-grained DLQ control that the binder provides per input consumer binding.

+
+
+

If you have the following processor,

+
+
+
+
@Bean
+public BiFunction<KStream<String, Long>, KTable<String, String>, KStream<String, Long>> process() {
+...
+}
+
+
+
+

and you only want to enable DLQ on the first input binding and logAndSkip on the second binding, then you can do so on the consumer as below.

+
+
+

spring.cloud.stream.kafka.streams.bindings.process-in-0.consumer.deserializationExceptionHandler: sendToDlq +spring.cloud.stream.kafka.streams.bindings.process-in-1.consumer.deserializationExceptionHandler: logAndSkip

+
+
+

Setting deserialization exception handlers this way has a higher precedence than setting at the binder level.

+
+
+
+

2.6.3. DLQ partitioning

+
+

By default, records are published to the Dead-Letter topic using the same partition as the original record. +This means the Dead-Letter topic must have at least as many partitions as the original record.

+
+
+

To change this behavior, add a DlqPartitionFunction implementation as a @Bean to the application context. +Only one such bean can be present. +The function is provided with the consumer group (which is the same as the application ID in most situations), the failed ConsumerRecord and the exception. +For example, if you always want to route to partition 0, you might use:

+
+
+
+
@Bean
+public DlqPartitionFunction partitionFunction() {
+    return (group, record, ex) -> 0;
+}
+
+
+
+ + + + + +
+ + +If you set a consumer binding’s dlqPartitions property to 1 (and the binder’s minPartitionCount is equal to 1), there is no need to supply a DlqPartitionFunction; the framework will always use partition 0. +If you set a consumer binding’s dlqPartitions property to a value greater than 1 (or the binder’s minPartitionCount is greater than 1), you must provide a DlqPartitionFunction bean, even if the partition count is the same as the original topic’s. +
+
+
+

A couple of things to keep in mind when using the exception handling feature in Kafka Streams binder.

+
+
+
    +
  • +

    The property spring.cloud.stream.kafka.streams.binder.deserializationExceptionHandler is applicable for the entire application. +This implies that if there are multiple functions or StreamListener methods in the same application, this property is applied to all of them.

    +
  • +
  • +

    The exception handling for deserialization works consistently with native deserialization and framework provided message conversion.

    +
  • +
+
+
+
+

2.6.4. Handling Production Exceptions in the Binder

+
+

Unlike the support for deserialization exception handlers as described above, the binder does not provide such first class mechanisms for handling production exceptions. +However, you still can configure production exception handlers using the StreamsBuilderFactoryBean customizer which you can find more details about, in a subsequent section below.

+
+
+
+
+

2.7. State Store

+
+

State stores are created automatically by Kafka Streams when the high level DSL is used and appropriate calls are made those trigger a state store.

+
+
+

If you want to materialize an incoming KTable binding as a named state store, then you can do so by using the following strategy.

+
+
+

Lets say you have the following function.

+
+
+
+
@Bean
+public BiFunction<KStream<String, Long>, KTable<String, String>, KStream<String, Long>> process() {
+   ...
+}
+
+
+
+

Then by setting the following property, the incoming KTable data will be materialized in to the named state store.

+
+
+
+
spring.cloud.stream.kafka.streams.bindings.process-in-1.consumer.materializedAs: incoming-store
+
+
+
+

You can define custom state stores as beans in your application and those will be detected and added to the Kafka Streams builder by the binder. +Especially when the processor API is used, you need to register a state store manually. +In order to do so, you can create the StateStore as a bean in the application. +Here are examples of defining such beans.

+
+
+
+
@Bean
+public StoreBuilder myStore() {
+    return Stores.keyValueStoreBuilder(
+            Stores.persistentKeyValueStore("my-store"), Serdes.Long(),
+            Serdes.Long());
+}
+
+@Bean
+public StoreBuilder otherStore() {
+    return Stores.windowStoreBuilder(
+            Stores.persistentWindowStore("other-store",
+                    1L, 3, 3L, false), Serdes.Long(),
+            Serdes.Long());
+}
+
+
+
+

These state stores can be then accessed by the applications directly.

+
+
+

During the bootstrap, the above beans will be processed by the binder and passed on to the Streams builder object.

+
+
+

Accessing the state store:

+
+
+
+
Processor<Object, Product>() {
+
+    WindowStore<Object, String> state;
+
+    @Override
+    public void init(ProcessorContext processorContext) {
+        state = (WindowStore)processorContext.getStateStore("mystate");
+    }
+    ...
+}
+
+
+
+

This will not work when it comes to registering global state stores. +In order to register a global state store, please see the section below on customizing StreamsBuilderFactoryBean.

+
+
+
+

2.8. Interactive Queries

+
+

Kafka Streams binder API exposes a class called InteractiveQueryService to interactively query the state stores. +You can access this as a Spring bean in your application. An easy way to get access to this bean from your application is to autowire the bean.

+
+
+
+
@Autowired
+private InteractiveQueryService interactiveQueryService;
+
+
+
+

Once you gain access to this bean, then you can query for the particular state-store that you are interested. See below.

+
+
+
+
ReadOnlyKeyValueStore<Object, Object> keyValueStore =
+						interactiveQueryService.getQueryableStoreType("my-store", QueryableStoreTypes.keyValueStore());
+
+
+
+

During the startup, the above method call to retrieve the store might fail. +For e.g it might still be in the middle of initializing the state store. +In such cases, it will be useful to retry this operation. +Kafka Streams binder provides a simple retry mechanism to accommodate this.

+
+
+

Following are the two properties that you can use to control this retrying.

+
+
+
    +
  • +

    spring.cloud.stream.kafka.streams.binder.stateStoreRetry.maxAttempts - Default is 1 .

    +
  • +
  • +

    spring.cloud.stream.kafka.streams.binder.stateStoreRetry.backOffInterval - Default is 1000 milliseconds.

    +
  • +
+
+
+

If there are multiple instances of the kafka streams application running, then before you can query them interactively, you need to identify which application instance hosts the particular key that you are querying. +InteractiveQueryService API provides methods for identifying the host information.

+
+
+

In order for this to work, you must configure the property application.server as below:

+
+
+
+
spring.cloud.stream.kafka.streams.binder.configuration.application.server: <server>:<port>
+
+
+
+

Here are some code snippets:

+
+
+
+
org.apache.kafka.streams.state.HostInfo hostInfo = interactiveQueryService.getHostInfo("store-name",
+						key, keySerializer);
+
+if (interactiveQueryService.getCurrentHostInfo().equals(hostInfo)) {
+
+    //query from the store that is locally available
+}
+else {
+    //query from the remote host
+}
+
+
+
+
+

2.9. Health Indicator

+
+

The health indicator requires the dependency spring-boot-starter-actuator. For maven use:

+
+
+
+
<dependency>
+  <groupId>org.springframework.boot</groupId>
+  <artifactId>spring-boot-starter-actuator</artifactId>
+</dependency>
+
+
+
+

Spring Cloud Stream Kafka Streams Binder provides a health indicator to check the state of the underlying streams threads. +Spring Cloud Stream defines a property management.health.binders.enabled to enable the health indicator. See the +Spring Cloud Stream documentation.

+
+
+

The health indicator provides the following details for each stream thread’s metadata:

+
+
+
    +
  • +

    Thread name

    +
  • +
  • +

    Thread state: CREATED, RUNNING, PARTITIONS_REVOKED, PARTITIONS_ASSIGNED, PENDING_SHUTDOWN or DEAD

    +
  • +
  • +

    Active tasks: task ID and partitions

    +
  • +
  • +

    Standby tasks: task ID and partitions

    +
  • +
+
+
+

By default, only the global status is visible (UP or DOWN). To show the details, the property management.endpoint.health.show-details must be set to ALWAYS or WHEN_AUTHORIZED. +For more details about the health information, see the +Spring Boot Actuator documentation.

+
+
+ + + + + +
+ + +The status of the health indicator is UP if all the Kafka threads registered are in the RUNNING state. +
+
+
+

Since there are three individual binders in Kafka Streams binder (KStream, KTable and GlobalKTable), all of them will report the health status. +When enabling show-details, some of the information reported may be redundant.

+
+
+

When there are multiple Kafka Streams processors present in the same application, then the health checks will be reported for all of them and will be categorized by the application ID of Kafka Streams.

+
+
+
+

2.10. Accessing Kafka Streams Metrics

+
+

Spring Cloud Stream Kafka Streams binder provides a basic mechanism for accessing Kafka Streams metrics exported through a Micrometer MeterRegistry. +Kafka Streams metrics that are available through KafkaStreams#metrics() are exported to this meter registry by the binder. +The metrics exported are from the consumers, producers, admin-client and the stream itself.

+
+
+

The metrics exported by the binder are exported with the format of metrics group name followed by a dot and then the actual metric name. +All dashes in the original metric information is replaced with dots.

+
+
+

For e.g. the metric name network-io-total from the metric group consumer-metrics is available in the micrometer registry as consumer.metrics.network.io.total. +Similarly, the metric commit-total from stream-metrics is available as stream.metrics.commit.total.

+
+
+

If you have multiple Kafka Streams processors in the same application, then the metric name will be prepended with the corresponding application ID of the Kafka Streams. +The application ID in this case will be preserved as is, i.e. no dashes will be converted to dots etc. +For example, if the application ID of the first processor is processor-1, then the metric name network-io-total from the metric group consumer-metrics is available in the micrometer registry as processor-1.consumer.metrics.network.io.total.

+
+
+

You can either programmatically access the Micrometer MeterRegistry in the application and then iterate through the available gauges or use Spring Boot actuator to access the metrics through a REST endpoint. +When accessing through the Boot actuator endpoint, make sure to add metrics to the property management.endpoints.web.exposure.include. +Then you can access /acutator/metrics to get a list of all the available metrics which then can be individually accessed through the same URI (/actuator/metrics/<metric-name>).

+
+
+

Anything beyond the info level metrics available through KafkaStreams#metrics(), (for e.g. the debugging level metrics) are still only available through JMX after you set the metrics.recording.level to DEBUG. +Kafka Streams, by default, set this level to INFO. +Please see this section from Kafka Streams documentation for more details. +In a future release, binder may support exporting these DEBUG level metrics through Micrometer.

+
+
+
+

2.11. Mixing high level DSL and low level Processor API

+
+

Kafka Streams provides two variants of APIs. +It has a higher level DSL like API where you can chain various operations that maybe familiar to a lot of functional programmers. +Kafka Streams also gives access to a low level Processor API. +The processor API, although very powerful and gives the ability to control things in a much lower level, is imperative in nature. +Kafka Streams binder for Spring Cloud Stream, allows you to use either the high level DSL or mixing both the DSL and the processor API. +Mixing both of these variants give you a lot of options to control various use cases in an application. +Applications can use the transform or process method API calls to get access to the processor API.

+
+
+

Here is a look at how one may combine both the DSL and the processor API in a Spring Cloud Stream application using the process API.

+
+
+
+
@Bean
+public Consumer<KStream<Object, String>> process() {
+    return input ->
+        input.process(() -> new Processor<Object, String>() {
+            @Override
+            @SuppressWarnings("unchecked")
+            public void init(ProcessorContext context) {
+               this.context = context;
+            }
+
+            @Override
+            public void process(Object key, String value) {
+                //business logic
+            }
+
+            @Override
+            public void close() {
+
+        });
+}
+
+
+
+

Here is an example using the transform API.

+
+
+
+
@Bean
+public Consumer<KStream<Object, String>> process() {
+    return (input, a) ->
+        input.transform(() -> new Transformer<Object, String, KeyValue<Object, String>>() {
+            @Override
+            public void init(ProcessorContext context) {
+
+            }
+
+            @Override
+            public void close() {
+
+            }
+
+            @Override
+            public KeyValue<Object, String> transform(Object key, String value) {
+                // business logic - return transformed KStream;
+            }
+        });
+}
+
+
+
+

The process API method call is a terminal operation while the transform API is non terminal and gives you a potentially transformed KStream using which you can continue further processing using either the DSL or the processor API.

+
+
+
+

2.12. Partition support on the outbound

+
+

A Kafka Streams processor usually sends the processed output into an outbound Kafka topic. +If the outbound topic is partitioned and the processor needs to send the outgoing data into particular partitions, the applications needs to provide a bean of type StreamPartitioner. +See StreamPartitioner for more details. +Let’s see some examples.

+
+
+

This is the same processor we already saw multiple times,

+
+
+
+
@Bean
+public Function<KStream<Object, String>, KStream<?, WordCount>> process() {
+
+    ...
+}
+
+
+
+

Here is the output binding destination:

+
+
+
+
spring.cloud.stream.bindings.process-out-0.destination: outputTopic
+
+
+
+

If the topic outputTopic has 4 partitions, if you don’t provide a partitioning strategy, Kafka Streams will use default partitioning strategy which may not be the outcome you want depending on the particular use case. +Let’s say, you want to send any key that matches to spring to partition 0, cloud to partition 1, stream to partition 2, and everything else to partition 3. +This is what you need to do in the application.

+
+
+
+
@Bean
+public StreamPartitioner<String, WordCount> streamPartitioner() {
+    return (t, k, v, n) -> {
+        if (k.equals("spring")) {
+            return 0;
+        }
+        else if (k.equals("cloud")) {
+            return 1;
+        }
+        else if (k.equals("stream")) {
+            return 2;
+        }
+        else {
+            return 3;
+        }
+    };
+}
+
+
+
+

This is a rudimentary implementation, however, you have access to the key/value of the record, the topic name and the total number of partitions. +Therefore, you can implement complex partitioning strategies if need be.

+
+
+

You also need to provide this bean name along with the application configuration.

+
+
+
+
spring.cloud.stream.kafka.streams.bindings.process-out-0.producer.streamPartitionerBeanName: streamPartitioner
+
+
+
+

Each output topic in the application needs to be configured separately like this.

+
+
+
+

2.13. StreamsBuilderFactoryBean customizer

+
+

It is often required to customize the StreamsBuilderFactoryBean that creates the KafkaStreams objects. +Based on the underlying support provided by Spring Kafka, the binder allows you to customize the StreamsBuilderFactoryBean. +You can use the StreamsBuilderFactoryBeanCustomizer to customize the StreamsBuilderFactoryBean itself. +Then, once you get access to the StreamsBuilderFactoryBean through this customizer, you can customize the corresponding KafkaStreams using KafkaStreamsCustomzier. +Both of these customizers are part of the Spring for Apache Kafka project.

+
+
+

Here is an example of using the StreamsBuilderFactoryBeanCustomizer.

+
+
+
+
@Bean
+public StreamsBuilderFactoryBeanCustomizer streamsBuilderFactoryBeanCustomizer() {
+    return sfb -> sfb.setStateListener((newState, oldState) -> {
+         //Do some action here!
+    });
+}
+
+
+
+

The above is shown as an illustration of the things you can do to customize the StreamsBuilderFactoryBean. +You can essentially call any available mutation operations from StreamsBuilderFactoryBean to customize it. +This customizer will be invoked by the binder right before the factory bean is started.

+
+
+

Once you get access to the StreamsBuilderFactoryBean, you can also customize the underlying KafkaStreams object. +Here is a blueprint for doing so.

+
+
+
+
@Bean
+public StreamsBuilderFactoryBeanCustomizer streamsBuilderFactoryBeanCustomizer() {
+    return factoryBean -> {
+        factoryBean.setKafkaStreamsCustomizer(new KafkaStreamsCustomizer() {
+            @Override
+            public void customize(KafkaStreams kafkaStreams) {
+                kafkaStreams.setUncaughtExceptionHandler((t, e) -> {
+
+                });
+            }
+        });
+    };
+}
+
+
+
+

KafkaStreamsCustomizer will be called by the StreamsBuilderFactoryBeabn right before the underlying KafkaStreams gets started.

+
+
+

There can only be one StreamsBuilderFactoryBeanCustomizer in the entire application. +Then how do we account for multiple Kafka Streams processors as each of them are backed up by individual StreamsBuilderFactoryBean objects? +In that case, if the customization needs to be different for those processors, then the application needs to apply some filter based on the application ID.

+
+
+

For e.g,

+
+
+
+
@Bean
+public StreamsBuilderFactoryBeanCustomizer streamsBuilderFactoryBeanCustomizer() {
+
+    return factoryBean -> {
+        if (factoryBean.getStreamsConfiguration().getProperty(StreamsConfig.APPLICATION_ID_CONFIG)
+                .equals("processor1-application-id")) {
+            factoryBean.setKafkaStreamsCustomizer(new KafkaStreamsCustomizer() {
+                @Override
+                public void customize(KafkaStreams kafkaStreams) {
+                    kafkaStreams.setUncaughtExceptionHandler((t, e) -> {
+
+                    });
+                }
+            });
+        }
+    };
+
+
+
+

2.13.1. Using Customizer to register a global state store

+
+

As mentioned above, the binder does not provide a first class way to register global state stores as a feature. +For that, you need to use the customizer. +Here is how that can be done.

+
+
+
+
@Bean
+public StreamsBuilderFactoryBeanCustomizer customizer() {
+    return fb -> {
+        try {
+            final StreamsBuilder streamsBuilder = fb.getObject();
+            streamsBuilder.addGlobalStore(...);
+        }
+        catch (Exception e) {
+
+        }
+    };
+}
+
+
+
+

Again, if you have multiple processors, you want to attach the global state store to the right StreamsBuilder by filtering out the other StreamsBuilderFactoryBean objects using the application id as outlined above.

+
+
+
+

2.13.2. Using customizer to register a production exception handler

+
+

In the error handling section, we indicated that the binder does not provide a first class way to deal with production exceptions. +Though that is the case, you can still use the StreamsBuilderFacotryBean customizer to register production exception handlers. See below.

+
+
+
+
@Bean
+public StreamsBuilderFactoryBeanCustomizer customizer() {
+    return fb -> {
+        fb.getStreamsConfiguration().put(StreamsConfig.DEFAULT_PRODUCTION_EXCEPTION_HANDLER_CLASS_CONFIG,
+                            CustomProductionExceptionHandler.class);
+    };
+}
+
+
+
+

Once again, if you have multiple processors, you may want to set it appropriately against the correct StreamsBuilderFactoryBean. +You may also add such production exception handlers using the configuration property (See below for more on that), but this is an option if you choose to go with a programmatic approach.

+
+
+
+
+

2.14. Timestamp extractor

+
+

Kafka Streams allows you to control the processing of the consumer records based on various notions of timestamp. +By default, Kafka Streams extracts the timestamp metadata embedded in the consumer record. +You can change this default behavior by providing a different TimestampExtractor implementation per input binding. +Here are some details on how that can be done.

+
+
+
+
@Bean
+public Function<KStream<Long, Order>,
+        Function<KTable<Long, Customer>,
+                Function<GlobalKTable<Long, Product>, KStream<Long, Order>>>> process() {
+    return orderStream ->
+            customers ->
+                products -> orderStream;
+}
+
+@Bean
+public TimestampExtractor timestampExtractor() {
+    return new WallclockTimestampExtractor();
+}
+
+
+
+

Then you set the above TimestampExtractor bean name per consumer binding.

+
+
+
+
spring.cloud.stream.kafka.streams.bindings.process-in-0.consumer.timestampExtractorBeanName=timestampExtractor
+spring.cloud.stream.kafka.streams.bindings.process-in-1.consumer.timestampExtractorBeanName=timestampExtractor
+spring.cloud.stream.kafka.streams.bindings.process-in-2.consumer.timestampExtractorBeanName=timestampExtractor"
+
+
+
+

If you skip an input consumer binding for setting a custom timestamp extractor, that consumer will use the default settings.

+
+
+
+

2.15. Multi binders with Kafka Streams based binders and regular Kafka Binder

+
+

You can have an application where you have both a function/consumer/supplier that is based on the regular Kafka binder and a Kafka Streams based processor. +However, you cannot mix both of them within a single function or consumer.

+
+
+

Here is an example, where you have both binder based components within the same application.

+
+
+
+
@Bean
+public Function<String, String> process() {
+    return s -> s;
+}
+
+@Bean
+public Function<KStream<Object, String>, KStream<?, WordCount>> kstreamProcess() {
+
+    return input -> input;
+}
+
+
+
+

This is the relevant parts from the configuration:

+
+
+
+
spring.cloud.stream.function.definition=process;kstreamProcess
+spring.cloud.stream.bindings.process-in-0.destination=foo
+spring.cloud.stream.bindings.process-out-0.destination=bar
+spring.cloud.stream.bindings.kstreamProcess-in-0.destination=bar
+spring.cloud.stream.bindings.kstreamProcess-out-0.destination=foobar
+
+
+
+

Things become a bit more complex if you have the same application as above, but is dealing with two different Kafka clusters, for e.g. the regular process is acting upon both Kafka cluster 1 and cluster 2 (receiving data from cluster-1 and sending to cluster-2) and the Kafka Streams processor is acting upon Kafka cluster 2. +Then you have to use the multi binder facilities provided by Spring Cloud Stream.

+
+
+

Here is how your configuration may change in that scenario.

+
+
+
+
# multi binder configuration
+spring.cloud.stream.binders.kafka1.type: kafka
+spring.cloud.stream.binders.kafka1.environment.spring.cloud.stream.kafka.streams.binder.brokers=${kafkaCluster-1} #Replace kafkaCluster-1 with the approprate IP of the cluster
+spring.cloud.stream.binders.kafka2.type: kafka
+spring.cloud.stream.binders.kafka2.environment.spring.cloud.stream.kafka.streams.binder.brokers=${kafkaCluster-2} #Replace kafkaCluster-2 with the approprate IP of the cluster
+spring.cloud.stream.binders.kafka3.type: kstream
+spring.cloud.stream.binders.kafka3.environment.spring.cloud.stream.kafka.streams.binder.brokers=${kafkaCluster-2} #Replace kafkaCluster-2 with the approprate IP of the cluster
+
+spring.cloud.stream.function.definition=process;kstreamProcess
+
+# From cluster 1 to cluster 2 with regular process function
+spring.cloud.stream.bindings.process-in-0.destination=foo
+spring.cloud.stream.bindings.process-in-0.binder=kafka1 # source from cluster 1
+spring.cloud.stream.bindings.process-out-0.destination=bar
+spring.cloud.stream.bindings.process-out-0.binder=kafka2 # send to cluster 2
+
+# Kafka Streams processor on cluster 2
+spring.cloud.stream.bindings.kstreamProcess-in-0.destination=bar
+spring.cloud.stream.bindings.kstreamProcess-in-0.binder=kafka3
+spring.cloud.stream.bindings.kstreamProcess-out-0.destination=foobar
+spring.cloud.stream.bindings.kstreamProcess-out-0.binder=kafka3
+
+
+
+

Pay attention to the above configuration. +We have two kinds of binders, but 3 binders all in all, first one is the regular Kafka binder based on cluster 1 (kafka1), then another Kafka binder based on cluster 2 (kafka2) and finally the kstream one (kafka3). +The first processor in the application receives data from kafka1 and publishes to kafka2 where both binders are based on regular Kafka binder but differnt clusters. +The second processor, which is a Kafka Streams processor consumes data from kafka3 which is the same cluster as kafka2, but a different binder type.

+
+
+

Since there are three different binder types available in the Kafka Streams family of binders - kstream, ktable and globalktable - if your application has multiple bindings based on any of these binders, that needs to be explicitly provided as the binder type.

+
+
+

For e.g if you have a processor as below,

+
+
+
+
@Bean
+public Function<KStream<Long, Order>,
+        Function<KTable<Long, Customer>,
+                Function<GlobalKTable<Long, Product>, KStream<Long, EnrichedOrder>>>> enrichOrder() {
+
+    ...
+}
+
+
+
+

then, this has to be configured in a multi binder scenario as the following. +Please note that this is only needed if you have a true multi-binder scenario where there are multiple processors dealing with multiple clusters within a single application. +In that case, the binders need to be explicitly provided with the bindings to distinguish from other processor’s binder types and clusters.

+
+
+
+
spring.cloud.stream.binders.kafka1.type: kstream
+spring.cloud.stream.binders.kafka1.environment.spring.cloud.stream.kafka.streams.binder.brokers=${kafkaCluster-2}
+spring.cloud.stream.binders.kafka2.type: ktable
+spring.cloud.stream.binders.kafka2.environment.spring.cloud.stream.kafka.streams.binder.brokers=${kafkaCluster-2}
+spring.cloud.stream.binders.kafka3.type: globalktable
+spring.cloud.stream.binders.kafka3.environment.spring.cloud.stream.kafka.streams.binder.brokers=${kafkaCluster-2}
+
+spring.cloud.stream.bindings.enrichOrder-in-0.binder=kafka1  #kstream
+spring.cloud.stream.bindings.enrichOrder-in-1.binder=kafka2  #ktablr
+spring.cloud.stream.bindings.enrichOrder-in-2.binder=kafka3  #globalktable
+spring.cloud.stream.bindings.enrichOrder-out-0.binder=kafka1 #kstream
+
+# rest of the configuration is omitted.
+
+
+
+
+

2.16. State Cleanup

+
+

By default, the Kafkastreams.cleanup() method is called when the binding is stopped. +See the Spring Kafka documentation. +To modify this behavior simply add a single CleanupConfig @Bean (configured to clean up on start, stop, or neither) to the application context; the bean will be detected and wired into the factory bean.

+
+
+
+

2.17. Kafka Streams topology visualization

+
+

Kafka Streams binder provides the following actuator endpoints for retrieving the topology description using which you can visualize the topology using external tools.

+
+
+

/actuator/kafkastreamstopology

+
+
+

/actuator/kafkastreamstopology/<applicaiton-id of the processor>

+
+
+

You need to include the actuator and web dependencies from Spring Boot to access these endpoints. +Further, you also need to add kafkastreamstopology to management.endpoints.web.exposure.include property. +By default, the kafkastreamstopology endpoint is disabled.

+
+
+
+

2.18. Configuration Options

+
+

This section contains the configuration options used by the Kafka Streams binder.

+
+
+

For common configuration options and properties pertaining to binder, refer to the core documentation.

+
+
+

2.18.1. Kafka Streams Binder Properties

+
+

The following properties are available at the binder level and must be prefixed with spring.cloud.stream.kafka.streams.binder.

+
+
+
+
configuration
+
+

Map with a key/value pair containing properties pertaining to Apache Kafka Streams API. + This property must be prefixed with spring.cloud.stream.kafka.streams.binder.. +Following are some examples of using this property.

+
+
+
+
+
+
spring.cloud.stream.kafka.streams.binder.configuration.default.key.serde=org.apache.kafka.common.serialization.Serdes$StringSerde
+spring.cloud.stream.kafka.streams.binder.configuration.default.value.serde=org.apache.kafka.common.serialization.Serdes$StringSerde
+spring.cloud.stream.kafka.streams.binder.configuration.commit.interval.ms=1000
+
+
+
+

For more information about all the properties that may go into streams configuration, see StreamsConfig JavaDocs in Apache Kafka Streams docs. +All configuration that you can set from StreamsConfig can be set through this. +When using this property, it is applicable against the entire application since this is a binder level property. +If you have more than processors in the application, all of them will acquire these properties. +In the case of properties like application.id, this will become problematic and therefore you have to carefully examine how the properties from StreamsConfig are mapped using this binder level configuration property.

+
+
+
+
functions.<function-bean-name>.applicationId
+
+

Applicable only for functional style processors. +This can be used for setting application ID per function in the application. +In the case of multiple functions, this is a handy way to set the application ID.

+
+
functions.<function-bean-name>.configuration
+
+

Applicable only for functional style processors. +Map with a key/value pair containing properties pertaining to Apache Kafka Streams API. +This is similar to the binder level configuration property describe above, but this level of configuration property is restricted only against the named function. +When you have multiple processors and you want to restrict access to the configuration based on particular functions, you might want to use this. +All StreamsConfig properties can be used here.

+
+
brokers
+
+

Broker URL

+
+

Default: localhost

+
+
+
zkNodes
+
+

Zookeeper URL

+
+

Default: localhost

+
+
+
deserializationExceptionHandler
+
+

Deserialization error handler type. +This handler is applied at the binder level and thus applied against all input binding in the application. +There is a way to control it in a more fine-grained way at the consumer binding level. +Possible values are - logAndContinue, logAndFail or sendToDlq

+
+

Default: logAndFail

+
+
+
applicationId
+
+

Convenient way to set the application.id for the Kafka Streams application globally at the binder level. +If the application contains multiple functions or StreamListener methods, then the application id should be set differently. +See above where setting the application id is discussed in detail.

+
+

Default: application will generate a static application ID. See the application ID section for more details.

+
+
+
stateStoreRetry.maxAttempts
+
+

Max attempts for trying to connect to a state store.

+
+

Default: 1

+
+
+
stateStoreRetry.backoffPeriod
+
+

Backoff period when trying to connect to a state store on a retry.

+
+

Default: 1000 ms

+
+
+
+
+
+
+

2.18.2. Kafka Streams Producer Properties

+
+

The following properties are only available for Kafka Streams producers and must be prefixed with spring.cloud.stream.kafka.streams.bindings.<binding name>.producer. +For convenience, if there are multiple output bindings and they all require a common value, that can be configured by using the prefix spring.cloud.stream.kafka.streams.default.producer..

+
+
+
+
keySerde
+
+

key serde to use

+
+

Default: See the above discussion on message de/serialization

+
+
+
valueSerde
+
+

value serde to use

+
+

Default: See the above discussion on message de/serialization

+
+
+
useNativeEncoding
+
+

flag to enable/disable native encoding

+
+

Default: true.

+
+
+
+
+
+

streamPartitionerBeanName: + Custom outbound partitioner bean name to be used at the consumer. + Applications can provide custom StreamPartitioner as a Spring bean and the name of this bean can be provided to the producer to use instead of the default one.

+
+
+

+ +Default: See the discussion above on outbound partition support.

+
+
+
+

2.18.3. Kafka Streams Consumer Properties

+
+

The following properties are available for Kafka Streams consumers and must be prefixed with spring.cloud.stream.kafka.streams.bindings.<binding-name>.consumer. +For convenience, if there are multiple input bindings and they all require a common value, that can be configured by using the prefix spring.cloud.stream.kafka.streams.default.consumer..

+
+
+
+
applicationId
+
+

Setting application.id per input binding. This is only preferred for StreamListener based processors, for function based processors see other approaches outlined above.

+
+

Default: See above.

+
+
+
keySerde
+
+

key serde to use

+
+

Default: See the above discussion on message de/serialization

+
+
+
valueSerde
+
+

value serde to use

+
+

Default: See the above discussion on message de/serialization

+
+
+
materializedAs
+
+

state store to materialize when using incoming KTable types

+
+

Default: none.

+
+
+
useNativeDecoding
+
+

flag to enable/disable native decoding

+
+

Default: true.

+
+
+
dlqName
+
+

DLQ topic name.

+
+

Default: See above on the discussion of error handling and DLQ.

+
+
+
startOffset
+
+

Offset to start from if there is no committed offset to consume from. +This is mostly used when the consumer is consuming from a topic for the first time. +Kafka Streams uses earliest as the default strategy and the binder uses the same default. +This can be overridden to latest using this property.

+
+

Default: earliest.

+
+
+
+
+
+

Note: Using resetOffsets on the consumer does not have any effect on Kafka Streams binder. +Unlike the message channel based binder, Kafka Streams binder does not seek to beginning or end on demand.

+
+
+
+
deserializationExceptionHandler
+
+

Deserialization error handler type. +This handler is applied per consumer binding as opposed to the binder level property described before. +Possible values are - logAndContinue, logAndFail or sendToDlq

+
+

Default: logAndFail

+
+
+
timestampExtractorBeanName
+
+

Specific time stamp extractor bean name to be used at the consumer. +Applications can provide TimestampExtractor as a Spring bean and the name of this bean can be provided to the consumer to use instead of the default one.

+
+

Default: See the discussion above on timestamp extractors.

+
+
+
+
+
+
+

2.18.4. Special note on concurrency

+
+

In Kafka Streams, you can control of the number of threads a processor can create using the num.stream.threads property. +This, you can do using the various configuration options described above under binder, functions, producer or consumer level. +You can also use the concurrency property that core Spring Cloud Stream provides for this purpose. +When using this, you need to use it on the consumer. +When you have more than one input bindings either in a function or StreamListener, set this on the first input binding. +For e.g. when setting spring.cloud.stream.bindings.process-in-0.consumer.concurrency, it will be translated as num.stream.threads by the binder. +If you have multiple processors and one processor defines binding level concurrency, but not the others, those ones with no binding level concurrency will default back to the binder wide property specified through +spring.cloud.stream.binder.configuration.num.stream.threads. +If this binder configuration is not available, then the application will use the default set by Kafka Streams.

+
+
+
+
+
+

Appendices

+
+

Appendix A: Building

+
+
+

A.1. Basic Compile and Test

+
+

To build the source you will need to install JDK 1.7.

+
+
+

The build uses the Maven wrapper so you don’t have to install a specific +version of Maven. To enable the tests, you should have Kafka server 0.9 or above running +before building. See below for more information on running the servers.

+
+
+

The main build command is

+
+
+
+
$ ./mvnw clean install
+
+
+
+

You can also add '-DskipTests' if you like, to avoid running the tests.

+
+
+ + + + + +
+ + +You can also install Maven (>=3.3.3) yourself and run the mvn command +in place of ./mvnw in the examples below. If you do that you also +might need to add -P spring if your local Maven settings do not +contain repository declarations for spring pre-release artifacts. +
+
+
+ + + + + +
+ + +Be aware that you might need to increase the amount of memory +available to Maven by setting a MAVEN_OPTS environment variable with +a value like -Xmx512m -XX:MaxPermSize=128m. We try to cover this in +the .mvn configuration, so if you find you have to do it to make a +build succeed, please raise a ticket to get the settings added to +source control. +
+
+
+

The projects that require middleware generally include a +docker-compose.yml, so consider using +Docker Compose to run the middeware servers +in Docker containers.

+
+
+
+

A.2. Documentation

+
+

There is a "full" profile that will generate documentation.

+
+
+
+

A.3. Working with the code

+
+

If you don’t have an IDE preference we would recommend that you use +Spring Tools Suite or +Eclipse when working with the code. We use the +m2eclipe eclipse plugin for maven support. Other IDEs and tools +should also work without issue.

+
+
+

A.3.1. Importing into eclipse with m2eclipse

+
+

We recommend the m2eclipe eclipse plugin when working with +eclipse. If you don’t already have m2eclipse installed it is available from the "eclipse +marketplace".

+
+
+

Unfortunately m2e does not yet support Maven 3.3, so once the projects +are imported into Eclipse you will also need to tell m2eclipse to use +the .settings.xml file for the projects. If you do not do this you +may see many different errors related to the POMs in the +projects. Open your Eclipse preferences, expand the Maven +preferences, and select User Settings. In the User Settings field +click Browse and navigate to the Spring Cloud project you imported +selecting the .settings.xml file in that project. Click Apply and +then OK to save the preference changes.

+
+
+ + + + + +
+ + +Alternatively you can copy the repository settings from .settings.xml into your own ~/.m2/settings.xml. +
+
+
+
+

A.3.2. Importing into eclipse without m2eclipse

+
+

If you prefer not to use m2eclipse you can generate eclipse project metadata using the +following command:

+
+
+
+
$ ./mvnw eclipse:eclipse
+
+
+
+

The generated eclipse projects can be imported by selecting import existing projects +from the file menu.

+
+
+

[[contributing] +== Contributing

+
+
+

Spring Cloud is released under the non-restrictive Apache 2.0 license, +and follows a very standard Github development process, using Github +tracker for issues and merging pull requests into master. If you want +to contribute even something trivial please do not hesitate, but +follow the guidelines below.

+
+
+
+
+

A.4. Sign the Contributor License Agreement

+
+

Before we accept a non-trivial patch or pull request we will need you to sign the +contributor’s agreement. +Signing the contributor’s agreement does not grant anyone commit rights to the main +repository, but it does mean that we can accept your contributions, and you will get an +author credit if we do. Active contributors might be asked to join the core team, and +given the ability to merge pull requests.

+
+
+
+

A.5. Code Conventions and Housekeeping

+
+

None of these is essential for a pull request, but they will all help. They can also be +added after the original pull request but before a merge.

+
+
+
    +
  • +

    Use the Spring Framework code format conventions. If you use Eclipse +you can import formatter settings using the +eclipse-code-formatter.xml file from the +Spring +Cloud Build project. If using IntelliJ, you can use the +Eclipse Code Formatter +Plugin to import the same file.

    +
  • +
  • +

    Make sure all new .java files to have a simple Javadoc class comment with at least an +@author tag identifying you, and preferably at least a paragraph on what the class is +for.

    +
  • +
  • +

    Add the ASF license header comment to all new .java files (copy from existing files +in the project)

    +
  • +
  • +

    Add yourself as an @author to the .java files that you modify substantially (more +than cosmetic changes).

    +
  • +
  • +

    Add some Javadocs and, if you change the namespace, some XSD doc elements.

    +
  • +
  • +

    A few unit tests would help a lot as well — someone has to do it.

    +
  • +
  • +

    If no-one else is using your branch, please rebase it against the current master (or +other target branch in the main project).

    +
  • +
  • +

    When writing a commit message please follow these conventions, +if you are fixing an existing issue please add Fixes gh-XXXX at the end of the commit +message (where XXXX is the issue number).

    +
  • +
+
+
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/Guardfile b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/Guardfile new file mode 100644 index 00000000..bdd4d729 --- /dev/null +++ b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/Guardfile @@ -0,0 +1,20 @@ +require 'asciidoctor' +require 'erb' + +guard 'shell' do + watch(/.*\.adoc$/) {|m| + Asciidoctor.render_file('index.adoc', \ + :in_place => true, \ + :safe => Asciidoctor::SafeMode::UNSAFE, \ + :attributes=> { \ + 'source-highlighter' => 'prettify', \ + 'icons' => 'font', \ + 'linkcss'=> 'true', \ + 'copycss' => 'true', \ + 'doctype' => 'book'}) + } +end + +guard 'livereload' do + watch(%r{^.+\.(css|js|html)$}) +end diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/css/spring.css b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/css/spring.css new file mode 100644 index 00000000..7fead00e --- /dev/null +++ b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/css/spring.css @@ -0,0 +1 @@ +@import url("https://fonts.googleapis.com/css?family=Open+Sans:400,700&display=swap");/*! normalize.css v2.1.2 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden],template{display:none}script{display:none !important}html,body{font-size:100%}html{font-family:'Open Sans', sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}*,*:before,*:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}body{background:white;color:#000;padding:0;margin:0;font-size:16px;font-family:'Open Sans', sans-serif;font-weight:normal;font-style:normal;line-height:1.6em;position:relative;cursor:auto}a:hover{cursor:pointer}img,object,embed{max-width:100%;height:auto}object,embed{height:100%}img{-ms-interpolation-mode:bicubic}#map_canvas img,#map_canvas embed,#map_canvas object,.map_canvas img,.map_canvas embed,.map_canvas object{max-width:none !important}.left{float:left !important}.right{float:right !important}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}.text-justify{text-align:justify !important}.hide{display:none}.antialiased{-webkit-font-smoothing:antialiased}img{display:inline-block;vertical-align:middle}textarea{height:auto;min-height:50px}select{width:100%}object,svg{display:inline-block;vertical-align:middle}.center{margin-left:auto;margin-right:auto}.spread,.stretch{width:100%}p.lead,.paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{line-height:1.6}.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#0b0a0a;font-weight:bold;margin-top:0;margin-bottom:0.8em}div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr}a{color:#086dc3;line-height:inherit;text-decoration:none}a:hover,a:focus{color:#086dc3;text-decoration:underline}a img{border:none}p{font-family:inherit;font-weight:normal;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}p aside{font-size:0.875em;line-height:1.35;font-style:italic}h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:Montserrat, sans-serif;font-weight:400;font-style:normal;color:#000;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:0.5em;line-height:1.0125em}h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#867c74;line-height:0}h1{font-size:2.125em}h2{font-size:1.6875em}h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}h4{font-size:1.125em}h5{font-size:1.125em}h6{font-size:1em}hr{border:solid #dce6e6;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}em,i{font-style:italic;line-height:inherit}strong,b{font-weight:bold;line-height:inherit}small{font-size:60%;line-height:inherit}code{font-family:Monaco, Menlo, Consolas, "Courier New", monospace;font-weight:normal;color:#3d3d3c;word-break:break-word}a:not(pre)>code{border:1px solid #086dc3;color:#086dc3}ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}ul,ol{margin-left:1.5em}ul.no-bullet,ol.no-bullet{margin-left:1.5em}ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}ul.square{list-style-type:square}ul.circle{list-style-type:circle}ul.disc{list-style-type:disc}ul.no-bullet{list-style:none}ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}dl dt{margin-bottom:0.3125em;font-weight:bold}dl dd{margin-bottom:1.25em}abbr,acronym{text-transform:uppercase;font-size:90%;color:#000;border-bottom:1px dotted #dddddd;cursor:help}abbr{text-transform:none}blockquote{margin:0 0 1.25em;padding:0.5625em 1.25em 0 1.1875em;border-left:1px solid #dddddd}blockquote cite{display:block;font-size:0.9375em;color:rgba(0,0,0,0.6)}blockquote cite:before{content:"\2014 \0020"}blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,0.6)}blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,0.85)}.vcard{display:inline-block;margin:0 0 1.25em 0;border:1px solid #dddddd;padding:0.625em 0.75em}.vcard li{margin:0;display:block}.vcard .fn{font-weight:bold;font-size:0.9375em}.vevent .summary{font-weight:bold}.vevent abbr{cursor:auto;text-decoration:none;font-weight:bold;border:none;padding:0 0.0625em}#tocbot{padding:0 0 0.5rem 0;line-height:1.5rem;padding-left:10px}.mobile-toc{padding:0 0 1rem 0;line-height:1.5rem}.mobile-toc li a{display:block;padding:.3rem 0}#tocbot ol li{list-style:none;padding:0;margin:0}#tocbot ol{margin:0;padding:0}#tocbot ol ol{padding-left:0.6rem}#tocbot .toc-link{display:block;padding-top:.6rem;padding-bottom:.6rem;outline:none;border-radius:4px;font-size:15px;transition:all .15s}#tocbot .toc-link:hover{background:#ebf2f2;color:#06c;text-decoration:none}table{background:white;margin-bottom:1.25em;border:solid 1px #d4dfdf;border-spacing:0}table thead,table tfoot{background:#ebf2f2;font-weight:bold}table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:0.5em 0.625em 0.625em;font-size:inherit;color:#000;text-align:left}table tr th,table tr td{padding:0.5625em 0.625em;font-size:inherit;color:#000}table tr.even,table tr.alt,table tr:nth-child(even){background:#f5f9f9}table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6}body{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;tab-size:4}h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-0.05em}.clearfix:before,.clearfix:after,.float-group:before,.float-group:after{content:" ";display:table}.clearfix:after,.float-group:after{clear:both}*:not(pre)>code{white-space:nowrap;background-color:#fff;border:1px solid #e1e1e8;color:#009;padding:2px 6px;font-size:.875rem;font-family:Monaco, Menlo, Consolas, "Courier New", monospace}pre,pre>code{line-height:1.85;color:rgba(0,0,0,0.9);font-family:Monaco, Menlo, Consolas, "Courier New", monospace;font-weight:normal;text-rendering:optimizeSpeed;word-break:normal}pre{overflow:auto}em em{font-style:normal}strong strong{font-weight:normal}.keyseq{color:#6b625c}kbd{font-family:Monaco, Menlo, Consolas, "Courier New", monospace;display:inline-block;color:#000;font-size:0.65em;line-height:1.45;background-color:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.2),0 0 0 0.1em white inset;box-shadow:0 1px 0 rgba(0,0,0,0.2),0 0 0 0.1em white inset;margin:0 0.15em;padding:0.2em 0.5em;vertical-align:middle;position:relative;top:-0.1em;white-space:nowrap}.keyseq kbd:first-child{margin-left:0}.keyseq kbd:last-child{margin-right:0}.menuseq,.menu{color:#191715}b.button:before,b.button:after{position:relative;top:-1px;font-weight:normal}b.button:before{content:"[";padding:0 3px 0 2px}b.button:after{content:"]";padding:0 2px 0 3px}p a>code:hover{color:rgba(0,0,0,0.9)}#toc{border-bottom:1px solid #dce6e6;padding-bottom:0.5em}#toc>ul{margin-left:0.125em}#toc ul.sectlevel0>li>a{font-style:italic}#toc ul.sectlevel0 ul.sectlevel1{margin:0.5em 0}#toc ul{list-style-type:none}#toc li{line-height:1.3334}#toc a{text-decoration:none}#toc a:active{text-decoration:underline}#toctitle{color:#0b0a0a;font-size:1.2em;display:none}body.toc2{padding-top:80px;text-rendering:optimizeLegibility}#content #toc{border-style:solid;border-width:1px;border-color:#dce6e6;margin-bottom:1.25em;padding:1.25em;background:#f1f1f1;-webkit-border-radius:4px;border-radius:4px}#content #toc>:first-child{margin-top:0}#content #toc>:last-child{margin-bottom:0}#footer{padding-bottom:2rem}#footer #footer-text{padding:2rem 0;border-top:1px solid #efefed}#footer-text{color:rgba(0,0,0,0.6);line-height:1.44}.sect1{padding-bottom:0.625em}.sect1+.sect1{border-top:1px solid #efefed}#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;margin-top:0.1rem;display:block;visibility:hidden;text-align:center;font-weight:normal;color:rgba(0,0,0,0.2)}#content h1>a.anchor:hover,h2>a.anchor:hover,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4>a.anchor:hover,h5>a.anchor:hover,h6>a.anchor:hover{color:#097dff;text-decoration:none}#content h1>a.anchor:before,h2>a.anchor:before,h3>a.anchor:before,#toctitle>a.anchor:before,.sidebarblock>.content>.title>a.anchor:before,h4>a.anchor:before,h5>a.anchor:before,h6>a.anchor:before{content:"\0023";font-size:0.85em;display:block;padding-top:0.1em}#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#000;text-decoration:none}#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#262321}.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:'Open Sans', sans-serif;font-size:1rem}table.tableblock>caption.title{white-space:nowrap;overflow:visible;max-width:0;padding:0.6rem 0}table.tableblock #preamble>.sectionbody>.paragraph:first-of-type p{font-size:inherit}.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}.admonitionblock>table td.icon{text-align:center;vertical-align:top;padding-top:0.8em;width:80px}.admonitionblock>table td.icon img{max-width:initial}.admonitionblock>table td.icon .title{font-weight:bold;font-family:Montserrat, sans-serif;text-transform:uppercase}.admonitionblock>table td.content{padding-left:0em;padding-right:1.25em;border-left:1px solid #dce6e6}.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}.exampleblock>.content{border-style:solid;border-width:0;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#f1f1f1;border-radius:4px}.exampleblock>.content>:first-child{margin-top:0}.exampleblock>.content>:last-child{margin-bottom:0}.sidebarblock{border-style:solid;border-width:0;border-color:#dce6e6;margin-bottom:1.25em;padding:1.25em;background:#ebf2f2;border-radius:4px;overflow:scroll}.sidebarblock>:first-child{margin-top:0}.sidebarblock>:last-child{margin-bottom:0}.sidebarblock>.content>.title{color:#0b0a0a;margin-top:0;text-align:center}.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}.literalblock pre,.listingblock pre:not(.highlight),.listingblock pre[class="highlight"],.listingblock pre[class^="highlight "],.listingblock pre.CodeRay,.listingblock pre.prettyprint{background:#fff;border:1px solid #d9d9d9;border-radius:4px}.sidebarblock .literalblock pre,.sidebarblock .listingblock pre:not(.highlight),.sidebarblock .listingblock pre[class="highlight"],.sidebarblock .listingblock pre[class^="highlight "],.sidebarblock .listingblock pre.CodeRay,.sidebarblock .listingblock pre.prettyprint{background:#fff;border:1px solid #d9d9d9;color:#222}.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class],.listingblock pre:not(.highlight){padding:1em 1.5rem;font-size:0.8125em}.literalblock pre.nowrap,.literalblock pre[class].nowrap,.listingblock pre.nowrap,.listingblock pre[class].nowrap{overflow-x:auto}.literalblock.output pre{color:whitesmoke;background-color:rgba(0,0,0,0.9)}.listingblock{white-space:nowrap}.listingblock pre.highlightjs>code{padding:1em 1.5rem;border-radius:4px}.listingblock>.content{position:relative}.listingblock code[data-lang]:before{display:none;content:attr(data-lang);position:absolute;font-size:0.8em;font-weight:bold;top:0.425rem;right:0.5rem;line-height:1;text-transform:uppercase;color:#999}.listingblock code[data-lang]:before{display:block}.listingblock.terminal pre .command:before{content:attr(data-prompt);padding-right:0.5em;color:#999}.listingblock.terminal pre .command:not([data-prompt]):before{content:"$"}table.pyhltable{border-collapse:separate;border:0;margin-bottom:0;background:none}table.pyhltable td{vertical-align:top;padding-top:0;padding-bottom:0;line-height:1.45}table.pyhltable td.code{padding-left:.75em;padding-right:0}pre.pygments .lineno,table.pyhltable td:not(.code){color:#999;padding-left:0;padding-right:.5em;border-right:1px solid #dce6e6}pre.pygments .lineno{display:block;margin-right:.25em}table.pyhltable .linenodiv{background:none !important;padding-right:0 !important}.quoteblock{margin:0 1em 1.25em 1.5em;display:block;text-align:left;padding-left:20px}.quoteblock blockquote,.quoteblock blockquote p{color:rgba(0,0,0,0.85);line-height:1.75;letter-spacing:0}.quoteblock blockquote{margin:0;padding:0;border:0;position:relative}.quoteblock blockquote:before{content:"\201c";font-size:2.75em;font-weight:bold;line-height:0.6em;margin-left:0em;margin-right:1rem;margin-top:0.8rem;color:rgba(0,0,0,0.1);position:absolute;top:0;left:-30px}.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}.quoteblock .attribution{margin-right:0.5ex}.quoteblock .quoteblock{margin-left:0;margin-right:0;padding:0.5em 0;border-left:3px solid rgba(0,0,0,0.6)}.quoteblock .quoteblock blockquote{padding:0 0 0 0.75em}.quoteblock .quoteblock blockquote:before{display:none}.verseblock{margin:0 1em 1.25em 0;background-color:#f1f1f1;padding:1rem 1.4rem;border-radius:4px}.verseblock pre{font-family:Monaco, Menlo, Consolas, "Courier New", monospace;font-size:0.9rem;color:rgba(0,0,0,0.85);font-weight:300;text-rendering:optimizeLegibility}.verseblock pre strong{font-weight:400}.verseblock .attribution{margin-top:1.25rem;margin-left:0.5ex}.quoteblock .attribution,.verseblock .attribution{font-size:0.9375em;line-height:1.45;font-style:italic}.quoteblock .attribution br,.verseblock .attribution br{display:none}.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-0.025em;color:rgba(0,0,0,0.6)}.quoteblock.abstract{margin:0 0 1.25em 0;display:block}.quoteblock.abstract blockquote,.quoteblock.abstract blockquote p{text-align:left;word-spacing:0}.quoteblock.abstract blockquote:before,.quoteblock.abstract blockquote p:first-of-type:before{display:none}table.tableblock{max-width:100%;border-collapse:separate;overflow-x:scroll;display:block}table.tableblock td>.paragraph:last-child p>p:last-child,table.tableblock th>p:last-child,table.tableblock td>p:last-child{margin-bottom:0}table.tableblock,th.tableblock,td.tableblock{border:0 solid #d4dfdf}table.grid-all th.tableblock,table.grid-all td.tableblock{border-width:0 1px 1px 0}table.grid-all tfoot>tr>th.tableblock,table.grid-all tfoot>tr>td.tableblock{border-width:1px 1px 0 0}table.grid-cols th.tableblock,table.grid-cols td.tableblock{border-width:0 1px 0 0}table.grid-all *>tr>.tableblock:last-child,table.grid-cols *>tr>.tableblock:last-child{border-right-width:0}table.grid-rows th.tableblock,table.grid-rows td.tableblock{border-width:0 0 1px 0}table.grid-all tbody>tr:last-child>th.tableblock,table.grid-all tbody>tr:last-child>td.tableblock,table.grid-all thead:last-child>tr>th.tableblock,table.grid-rows tbody>tr:last-child>th.tableblock,table.grid-rows tbody>tr:last-child>td.tableblock,table.grid-rows thead:last-child>tr>th.tableblock{border-bottom-width:0}table.grid-rows tfoot>tr>th.tableblock,table.grid-rows tfoot>tr>td.tableblock{border-width:1px 0 0 0}table.frame-all{border-width:1px}table.frame-sides{border-width:0 1px}table.frame-topbot{border-width:1px 0}th.halign-left,td.halign-left{text-align:left}th.halign-right,td.halign-right{text-align:right}th.halign-center,td.halign-center{text-align:center}th.valign-top,td.valign-top{vertical-align:top}th.valign-bottom,td.valign-bottom{vertical-align:bottom}th.valign-middle,td.valign-middle{vertical-align:middle}table thead th,table tfoot th{font-weight:bold}tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7}tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:#34302d;font-weight:bold}p.tableblock{font-size:1em}td>div.verse{white-space:pre}ol{margin-left:1.75em}ul li ol{margin-left:1.5em}dl dd{margin-left:1.125em}dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:0.625em}ul.unstyled,ol.unnumbered,ul.checklist,ul.none{list-style-type:none}ul.unstyled,ol.unnumbered,ul.checklist{margin-left:0.625em}ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1em;font-size:0.85em}ul.checklist li>p:first-child>input[type="checkbox"]:first-child{width:1em;position:relative;top:1px}ul.inline{margin:0 auto 0.625em auto;margin-left:-1.375em;margin-right:0;padding:0;list-style:none;overflow:hidden}ul.inline>li{list-style:none;float:left;margin-left:1.375em;display:block}ul.inline>li>*{display:block}.unstyled dl dt{font-weight:normal;font-style:normal}ol.arabic{list-style-type:decimal}ol.decimal{list-style-type:decimal-leading-zero}ol.loweralpha{list-style-type:lower-alpha}ol.upperalpha{list-style-type:upper-alpha}ol.lowerroman{list-style-type:lower-roman}ol.upperroman{list-style-type:upper-roman}ol.lowergreek{list-style-type:lower-greek}.hdlist>table,.colist>table{border:0;background:none}.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}td.hdlist1,td.hdlist2{vertical-align:top;padding:0 0.625em}td.hdlist1{font-weight:bold;padding-bottom:1.25em}.literalblock+.colist,.listingblock+.colist{margin-top:-0.5em}.colist>table tr>td:first-of-type{padding:0 0.75em;line-height:1}.colist>table tr>td:first-of-type img{max-width:initial}.colist>table tr>td:last-of-type{padding:0.25em 0}.colist>table tr>td{white-space:pre-wrap}.thumb,.th{line-height:0;display:inline-block;border:solid 4px white;-webkit-box-shadow:0 0 0 1px #dddddd;box-shadow:0 0 0 1px #dddddd}.imageblock.left,.imageblock[style*="float: left"]{margin:0.25em 0.625em 1.25em 0}.imageblock.right,.imageblock[style*="float: right"]{margin:0.25em 0 1.25em 0.625em}.imageblock>.title{margin-bottom:0}.imageblock.thumb,.imageblock.th{border-width:6px}.imageblock.thumb>.title,.imageblock.th>.title{padding:0 0.125em}.image.left,.image.right{margin-top:0.25em;margin-bottom:0.25em;display:inline-block;line-height:0}.image.left{margin-right:0.625em}.image.right{margin-left:0.625em}a.image{text-decoration:none;display:inline-block}a.image object{pointer-events:none}sup.footnote,sup.footnoteref{font-size:0.875em;position:static;vertical-align:super}sup.footnote a,sup.footnoteref a{text-decoration:none}sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}#footnotes{padding-top:0.75em;padding-bottom:0.75em;margin-bottom:0.625em}#footnotes hr{width:20%;min-width:6.25em;margin:-0.25em 0 0.75em 0;border-width:1px 0 0 0}#footnotes .footnote{padding:0 0.375em 0 0.225em;line-height:1.3334;font-size:0.875em;margin-left:1.2em;text-indent:-1.05em;margin-bottom:0.2em}#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none}#footnotes .footnote:last-of-type{margin-bottom:0}#content #footnotes{margin-top:-0.625em;margin-bottom:0;padding:0.75em 0}.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}.gist .file-data>table td.line-data{width:99%}div.unbreakable{page-break-inside:avoid}.big{font-size:larger}.small{font-size:smaller}.underline{text-decoration:underline}.overline{text-decoration:overline}.line-through{text-decoration:line-through}.aqua{color:#00bfbf}.aqua-background{background-color:#00fafa}.black{color:black}.black-background{background-color:black}.blue{color:#0000bf}.blue-background{background-color:#0000fa}.fuchsia{color:#bf00bf}.fuchsia-background{background-color:#fa00fa}.gray{color:#606060}.gray-background{background-color:#7d7d7d}.green{color:#006000}.green-background{background-color:#007d00}.lime{color:#00bf00}.lime-background{background-color:#00fa00}.maroon{color:#600000}.maroon-background{background-color:#7d0000}.navy{color:#000060}.navy-background{background-color:#00007d}.olive{color:#606000}.olive-background{background-color:#7d7d00}.purple{color:#600060}.purple-background{background-color:#7d007d}.red{color:#bf0000}.red-background{background-color:#fa0000}.silver{color:#909090}.silver-background{background-color:#bcbcbc}.teal{color:#006060}.teal-background{background-color:#007d7d}.white{color:#bfbfbf}.white-background{background-color:#f5f9f9}.yellow{color:#bfbf00}.yellow-background{background-color:#fafa00}span.icon>.fa{cursor:default}.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;cursor:default}.admonitionblock td.icon .icon-note:before{content:"\f05a";color:#3f6a22}.admonitionblock td.icon .icon-tip:before{content:"\f0eb";color:#0077b9}.admonitionblock td.icon .icon-warning:before{content:"\f071";color:#d88400}.admonitionblock td.icon .icon-caution:before{content:"\f06d";color:#bf3400}.admonitionblock td.icon .icon-important:before{content:"\f06a";color:#bf0000}.conum[data-value]{display:inline-block;color:#000 !important;background-color:#ffe157;-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:0.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans", "DejaVu Sans", sans-serif;font-style:normal;font-weight:bold}.conum[data-value] *{color:#fff !important}.conum[data-value]+b{display:none}.conum[data-value]:after{content:attr(data-value)}pre .conum[data-value]{position:relative;top:0;color:#000 !important;background-color:#ffe157;font-size:12px}b.conum *{color:inherit !important}.conum:not([data-value]):empty{display:none}.admonitionblock{background-color:#ecf1e8;padding:0.8em 0;margin:30px 0;width:auto;border-radius:4px;overflow-x:auto}.admonitionblock.important{border-left:0px solid #e20000;background-color:#f9ebeb}.admonitionblock.warning{border-left:0px solid #d88400;background-color:#fff9e4}.admonitionblock.tip{border-left:0px solid #0077b9;background-color:#e9f1f6}.admonitionblock.caution{border-left:0px solid #e20000;background-color:#f9ebeb}.admonitionblock .exampleblock>.content{border:0 none;background-color:#fff}#toc a:hover{text-decoration:underline}.admonitionblock>table{margin-bottom:0}.admonitionblock>table td.content{border-left:none}@media print{#tocbot a.toc-link.node-name--H4{display:none}}.is-collapsible{max-height:1000px;overflow:hidden;transition:all 200ms ease-in-out}.is-collapsed{max-height:0}#index-link{display:none}ul li>p>a>code{color:#086dc3}ul li>p>a:hover>code{color:#086dc3}#content .listingblock .switch{border-style:none;display:inline-block;position:relative;bottom:0;margin-bottom:4px}#content .listingblock .switch--item:not(:first-child){border:2px solid #000}#content .listingblock .switch--item{padding:6px 12px;background-color:#fff;color:#000;display:inline-block;cursor:pointer;border:2px solid #000;margin-right:2px;border-radius:0}#content .listingblock .switch--item:hover{color:#086dc3}#content .listingblock .switch--item.selected{background-color:#000;color:#fff;border-color:#000}#content .listingblock .switch--item.selected:hover{color:#fff}#content .listingblock pre.highlightjs{padding:0}div.back-action,#toc.toc2 div.back-action{padding:0.8rem 0 0 5px}div.back-action a,#toc.toc2 div.back-action a{position:relative;display:inline-block;padding:0.6rem 1.2rem;padding-left:35px}div.back-action a span,#toc.toc2 div.back-action a span{position:absolute;left:5px;top:5px;display:block;color:#333;height:26px;width:26px;border-radius:13px}div.back-action a i,#toc.toc2 div.back-action a i{position:absolute;top:10px;left:5px}div.back-action a:hover span,#toc.toc2 div.back-action a:hover span{color:#000}#tocbot.desktop-toc{padding:.5rem}#header-spring{position:absolute;text-rendering:optimizeLegibility;top:0;left:0;right:0;height:80px;margin:0 1rem;padding:0 1rem;border-bottom:1px solid #dce6e6}#header-spring h1{margin:0;padding:0;font-size:22px;text-align:left;line-height:76px;padding-left:0.6rem}#header-spring h1 svg{width:240px}#header-spring h1 svg .st0{fill:#6bb536}#header-spring h1 svg .st2{fill:#444}body.book #header-spring{position:relative;top:auto;left:auto;right:auto;margin:0}body.book #header>h1:only-child{border:0 none;padding-bottom:1.2rem;font-size:1.8rem}body.book #header,body.book #content,body.book #footnotes,body.book #footer{margin:0 auto}body.toc2 #header-spring{position:absolute;left:0;right:0;top:0}body.toc2 #header>h1:only-child{font-size:2.2rem}body.toc2 #header,body.toc2 #content,body.toc2 #footnotes,body.toc2 #footer{margin:0 auto}body.toc2 #content{padding-top:2rem}#header,#content,#footnotes,#footer{width:100%;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:0.9375em;padding-right:0.9375em}#header:before,#header:after,#content:before,#content:after,#footnotes:before,#footnotes:after,#footer:before,#footer:after{content:" ";display:table}#header:after,#content:after,#footnotes:after,#footer:after{clear:both}#content{margin-top:1.25em}#content:before{content:none}#header{position:relative}#header>h1:first-child{margin-top:2.55rem;margin-bottom:0.5em;margin-bottom:0.7em;font-size:2rem}#header>h1:first-child+#toc{margin-top:8px;border-top:0 none}#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #ebf2f2;padding-bottom:8px}#header .details{line-height:1.45;color:#222;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap;background-color:#ebf2f2;padding:2rem 2.5rem}#header .details span:first-child{margin-left:-0.125em}#header .details span.email a{color:rgba(0,0,0,0.85)}#header .details br{display:none}#header .details br+span:before{content:"\00a0\2013\00a0"}#header .details br+span.author:before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,0.85)}#header .details br+span#revremark:before{content:"\00a0|\00a0"}#header #revnumber{text-transform:capitalize}#header #revnumber:after{content:"\00a0"}#content>h1:first-child:not([class]){color:rgba(0,0,0,0.85);border-bottom:1px solid #ebf2f2;padding-bottom:8px;margin-top:0;padding-top:1.5rem;margin-bottom:1.25rem}h1{font-size:2.2rem}h1,h2,h3,h4,h5,h6{font-weight:bold;font-family:Montserrat, Arial, Helvetica, sans-serif}h1:focus,h2:focus,h3:focus,h4:focus,h5:focus,h6:focus{box-shadow:none;outline:none}h2,h3,h4,h5,h6{padding:.8rem 0 .4rem}h1{font-size:1.75em}h2{font-size:1.6rem}h3{font-size:1.5rem}h4{font-size:1.4rem}h5{font-size:1.3rem}h6{font-size:1.2rem}pre.highlight{padding:20px;border:1px solid #d9d9d9;overflow-x:scroll;color:#222}pre.highlight code{color:#222}pre.highlight a,#toc.toc2 a{color:#000}pre.highlight ul.sectlevel1,#toc.toc2 ul.sectlevel1{padding-left:0.2rem}pre.highlight ul.sectlevel1 li,#toc.toc2 ul.sectlevel1 li{line-height:1.4rem}::selection{background-color:#d1ff79}.literalblock pre::selection,.listingblock pre[class="highlight"]::selection,.highlight::selection,pre::selection,.highlight code::selection,.highlight code span::selection{background:rgba(0,0,0,0.2) !important}body.book #header{margin-bottom:2rem}body.toc2 #header{margin-bottom:0}.desktop-toc{display:none}.admonitionblock td.icon{display:none}.admonitionblock>table td.content{padding-left:1.25em}@media only screen and (min-width: 768px){#toctitle{font-size:1.375em}.sect1{padding-bottom:1.25em}.mobile-toc{display:none}.desktop-toc{display:block}.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:0.90625em}.admonitionblock td.icon{display:table-cell}.admonitionblock>table td.content{padding-left:0}#header{position:relative;min-height:98px;padding-right:210px}#header::after{position:absolute;right:0;top:0;display:block;content:'';height:95px;width:203px;z-index:-1;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA38AAAGjCAIAAAATtjulAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyVpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ4IDc5LjE2NDAzNiwgMjAxOS8wOC8xMy0wMTowNjo1NyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIxLjEgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTMxQjVFRkQ2NTNCMTFFQTlENDc5OTVFRUMxRUY0NTEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTMxQjVFRkU2NTNCMTFFQTlENDc5OTVFRUMxRUY0NTEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1MzFCNUVGQjY1M0IxMUVBOUQ0Nzk5NUVFQzFFRjQ1MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1MzFCNUVGQzY1M0IxMUVBOUQ0Nzk5NUVFQzFFRjQ1MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvrI2PUAAD6SSURBVHja7N13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");background-repeat:no-repeat;background-size:203px 95px;background-position:right -10px}body.toc2{padding-right:0}body.toc2 #toc.toc2{position:absolute;margin-top:0 !important;width:15em;top:0;border-top-width:0 !important;border-bottom-width:0 !important;margin-left:-15.9375em;z-index:1000;padding:0 1em 1.25em 0em;overflow:auto}body.toc2 #toc.toc2 #toctitle{margin-top:0;margin-bottom:0.8rem;font-size:1.2em}body.toc2 #toc.toc2>ul{font-size:0.9em;margin-bottom:0}body.toc2 #toc.toc2 ul ul{margin-left:0;padding-left:1em}body.toc2 #toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:0.5em;margin-bottom:0.5em}body.toc2 #header,body.toc2 #content,body.toc2 #footnotes,body.toc2 #footer{padding-left:15.9375em;max-width:none}body.book #header-spring h1{max-width:1400px;margin:0 auto}body.book #header,body.book #content,body.book #footnotes,body.book #footer{max-width:1400px}body.is-position-fixed #toc.toc2{position:fixed;height:100%}h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}h1{font-size:1.75em}h2{font-size:1.6em}h3,#toctitle,.sidebarblock>.content>.title{font-size:1.5em}h4{font-size:1.4em}h5{font-size:1.2em}h6{font-size:1.2em}#tocbot a.toc-link.node-name--H1{font-style:italic}#tocbot ol{margin:0;padding:0}#tocbot ol li{list-style:none;padding:0 0;margin:0;display:block}#tocbot{z-index:999}#tocbot .toc-link{position:relative;display:block;z-index:999;padding:.4rem .6rem}#tocbot a.is-active-link{padding-right:3px;background:black;color:white}}@media only screen and (min-width: 768px){#tocbot>ul.toc-list{margin-bottom:0.5em;margin-left:0.125em}#tocbot ul.sectlevel0,#tocbot a.toc-link.node-name--H1+ul{padding-left:0}#tocbot a.toc-link{height:100%}.is-collapsible{max-height:3000px;overflow:hidden}.is-collapsed{max-height:0}}@media only screen and (min-width: 768px){body.toc2 #header,body.toc2 #content,body.toc2 #footer{background-repeat:repeat-y;background-position:14em 0;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAMAAAAoyzS7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQwIDc5LjE2MDQ1MSwgMjAxNy8wNS8wNi0wMTowODoyMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RDE0NUNENzNGMTVGMTFFODk5RjI5ODk3QURGRjcxMkEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RDE0NUNENzRGMTVGMTFFODk5RjI5ODk3QURGRjcxMkEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpEMTQ1Q0Q3MUYxNUYxMUU4OTlGMjk4OTdBREZGNzEyQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpEMTQ1Q0Q3MkYxNUYxMUU4OTlGMjk4OTdBREZGNzEyQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjmGxxYAAAAGUExURd3d2AAAAJlCnKAAAAAMSURBVHjaYmAACDAAAAIAAU9tWeEAAAAASUVORK5CYII=);background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyVpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ4IDc5LjE2NDAzNiwgMjAxOS8wOC8xMy0wMTowNjo1NyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIxLjEgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDMyRDZERkQ1MEE4MTFFQTlCNTJBOEQwQTM2ODZEQjgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDMyRDZERkU1MEE4MTFFQTlCNTJBOEQwQTM2ODZEQjgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0MzJENkRGQjUwQTgxMUVBOUI1MkE4RDBBMzY4NkRCOCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0MzJENkRGQzUwQTgxMUVBOUI1MkE4RDBBMzY4NkRCOCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjdyLKIAAAAPSURBVHjaYnj16RNAgAEABZgCz/xXiToAAAAASUVORK5CYII=");background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyVpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ4IDc5LjE2NDAzNiwgMjAxOS8wOC8xMy0wMTowNjo1NyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIxLjEgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODRBOEI2NTI1MEI1MTFFQTlCNTJBOEQwQTM2ODZEQjgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODRBOEI2NTM1MEI1MTFFQTlCNTJBOEQwQTM2ODZEQjgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0MzJENkRGRjUwQTgxMUVBOUI1MkE4RDBBMzY4NkRCOCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0MzJENkUwMDUwQTgxMUVBOUI1MkE4RDBBMzY4NkRCOCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pul87iAAAAAPSURBVHjaYrj17BlAgAEABUQCpxgONc4AAAAASUVORK5CYII=")}}@media only screen and (min-width: 1280px){body.toc2{padding-right:0}body.toc2 #toc.toc2{width:25em;left:auto;margin-left:-26.9375em}body.toc2 #toc.toc2 #toctitle{font-size:1.375em}body.toc2 #toc.toc2>ul{font-size:0.95em}body.toc2 #toc.toc2 ul ul{padding-left:1.25em}body.toc2 body.toc2.toc-right{padding-left:0;padding-right:20em}body.toc2 #header,body.toc2 #content,body.toc2 #footnotes,body.toc2 #footer{padding-left:26.9375em;max-width:1400px}body.toc2 #header-spring h1{margin:0 auto;max-width:1400px}.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:0.8125em}body.toc2 #header,body.toc2 #content,body.toc2 #footer{background-repeat:repeat-y;background-position:24em 0;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAMAAAAoyzS7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQwIDc5LjE2MDQ1MSwgMjAxNy8wNS8wNi0wMTowODoyMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RDE0NUNENzNGMTVGMTFFODk5RjI5ODk3QURGRjcxMkEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RDE0NUNENzRGMTVGMTFFODk5RjI5ODk3QURGRjcxMkEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpEMTQ1Q0Q3MUYxNUYxMUU4OTlGMjk4OTdBREZGNzEyQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpEMTQ1Q0Q3MkYxNUYxMUU4OTlGMjk4OTdBREZGNzEyQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjmGxxYAAAAGUExURd3d2AAAAJlCnKAAAAAMSURBVHjaYmAACDAAAAIAAU9tWeEAAAAASUVORK5CYII=);background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyVpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ4IDc5LjE2NDAzNiwgMjAxOS8wOC8xMy0wMTowNjo1NyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIxLjEgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDMyRDZERkQ1MEE4MTFFQTlCNTJBOEQwQTM2ODZEQjgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDMyRDZERkU1MEE4MTFFQTlCNTJBOEQwQTM2ODZEQjgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0MzJENkRGQjUwQTgxMUVBOUI1MkE4RDBBMzY4NkRCOCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0MzJENkRGQzUwQTgxMUVBOUI1MkE4RDBBMzY4NkRCOCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjdyLKIAAAAPSURBVHjaYnj16RNAgAEABZgCz/xXiToAAAAASUVORK5CYII=");background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyVpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ4IDc5LjE2NDAzNiwgMjAxOS8wOC8xMy0wMTowNjo1NyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIxLjEgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODRBOEI2NTI1MEI1MTFFQTlCNTJBOEQwQTM2ODZEQjgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODRBOEI2NTM1MEI1MTFFQTlCNTJBOEQwQTM2ODZEQjgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0MzJENkRGRjUwQTgxMUVBOUI1MkE4RDBBMzY4NkRCOCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0MzJENkUwMDUwQTgxMUVBOUI1MkE4RDBBMzY4NkRCOCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pul87iAAAAAPSURBVHjaYrj17BlAgAEABUQCpxgONc4AAAAASUVORK5CYII=")}#header{min-height:150px;padding-right:310px}#header::after{height:147px;width:305px;background-size:305px 147px}} diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/favicon.ico b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..1a4956e64705230122da8c19d762a7f8e6971533 GIT binary patch literal 111804 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 Pn5$LYDwgECM&W5?C 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 literal 0 HcmV?d00001 diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/images/kafka-streams-initializr.png b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/images/kafka-streams-initializr.png new file mode 100644 index 0000000000000000000000000000000000000000..3f1014895b2dba40b7cca1c373b8eb41ea2dc94c GIT binary patch literal 121574 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 literal 0 HcmV?d00001 diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/images/spring-initializr-kafka-streams.png b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/images/spring-initializr-kafka-streams.png new file mode 100644 index 0000000000000000000000000000000000000000..5d820fe553ccd74b0d710d64c06720526da02e21 GIT binary patch literal 239045 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

RR1bzn&soF7 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

CQm7+NJ(6u$msNM}%} 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

>{662B$sM*Jc=gTld2e^?&z z6k@d+hY!#2HYMlI$-gvc#ZL9CU1nO0#`i6kJn)T)NLr78Za4P_Idrpy$)H3v+2r z90N1G{>u_p5o;KbMNLUrDfK?IN@>TVb5YwySN)pj+LVr}C#-11U>c2@E6wgV*JUl; zwLr{n2X^LfPs+)W|t>AQzu=+YJpAg#b+nh1oJ}T(g6ENBb50kE)f(qCiR=*c; zW9Zv8GD*2BOh5LFI}5+hh7qm&PBr6uhUq9yZt5BLWeRd6%0aSw9Zv>+3+HXbv#`t7 zEk<~tKoM5!_}Xi<@a2zh^8M%VMi2TWI#PfTyXjTrhq)QkRVt*Dj4t0RpHQdx7Y*7Jkktq=x_;mFvb4et{q9W zp&DsAIE}s!fD6A5@l1&6aWCZp&bdu~FG5L4akeFekrGRFUsWAdik(iSQj~;2c7lM@ z!rQk{HFbHH0!l+s*ZIOK|MFQGpR2Z(vX+kyD{5CkQ|`}oK4Bc_`Sd#vSkA*t20vBxyY$^-i^ui`Jw+LvVM*|HbhyMF=Ik_PL*!jgO!?dT# z{Si8qy3Z`#y@&nDdja>R%d!v!BxJb9x0}_N(n&y-YKdpL}ZXvWazZDFbt7^EXlCBtQ)HCVfi6u-wvF3$2fo?eZu%boY#AUaM*W{TPo|Rm~hxvya{8}Dz|ne%0^~R zflxh<^4P;$dI}NtvK?jiJBnS-elD8VuvifT|7cpvYsc_CJc%5D? z=b0AXrh_hC2q`LK-^^uGHxr7Cw?QleI|;NW!h;jmE0)-6+L>_CdYdqASjZ0FO!d;7 zbD4Be9F_)9`n$r;%X|P@+-)@7Ty3IC|%-+g!%H*3Mhr=!^MLsqu zs4FCr^GqPUlv}D`VY!Q#@SL@3HDu2dO)-Q#CF3OQBvHt1pvgH;61H(}wDQgsY%NMQ z5rEqYV6#W~+NgKjTSXgd>)@?$E6I;F_^%=Aa=JS1VYi0EA|&$SkaohGZGx}rz@3?O z>0aVSJpho04x4SqaCdu@lI}8qOW@COl$)cw_l5gt*2A6D?h118E#^Ea;cV*lYQSRE6Pu>Ze$#09koY3SQyQG^E`CZrl zYbnL&-&+59P-*z$q(XuKra3oxAg+(KW3<9?^Z^Y-Np%o*u;*slv~JSf>oj?j%sz{# z88faF#bU@-lETJtO}z=^f5nTcXM0W>5iC)g^;^h!NS2TP`|KR_=?{B$er~K7_FGTF=Tbr(J|_S7Ny zL=WKiPW=R(cb-rR+J0=3ZtAw0cwY%Dg%^T;Pz}icd#8L1b`vnhscXD&QOn`s5!F** z_jI%2h0KuwJXfOLj0nm`wl=Hs$@LNQqBfI?0EhT?r<#%tjVt{J<>~pI)}-D;C3U@h z>_J;Ib`zWXK($=lj7nS=z?Li>!3K^f@~$Bn0|Vz za*}8Zy;`Uz>tY!;T)Ea`$F(_t%rj$-#G_ivW}EvQa{mdT1ZrA3X1gh(Dh%6sxKXx+ z)!rIJc&S|eZc34)afN=6TJQ6v9}=W;(K&&2Wxh2qtjV z>Ig1aW*eS$Qb1bYo7m2T?vk^nNu9`WdxLUco69BCO5ncujS9ihF2cc}J}FhYMf_u) zV~T%5I>0AidzLPo{6_(Zz!lPOCxYUJUr)vXr-7=A)+?0FJ)lj(l)jIQd>;ongV^v& zo^eZf)oKjK-u$!p1DG-=nM2m2=6BOfDgo+-Dj%dakx$bPC>VPmknyS;iTWH!v^Kqe zd-2KIRQ-oWj<*=U$0Wf`x|X`}f=&cjHSSfdn0?U)wLwxwRS!w4Y#wSppW{qpdF7O| zYP__NdbJBSOL6M^i=`Y}3<4Bkd}|dPqw|kds-2viVsG55@2x8cD%T0DTxHROoRqVW zwg%Ux+Vt#JIMW;{ltv|MK%s#A8_b4B>MVto2DN>LoqHR+h9HIDow$l6W4~!Q9myy-^C2E=T z8~6sV)hm(yj>NP@VJp!7q@Yl-^DJEmlmo#YvU5ThJT|@MsX3>xhQP2SXQ6^D2Xe#2 zNU^kTRr_qYQCKtAbHaer;3Sr9GC;@EYdSL1WiSXMPsDT{ukbdwpdg7tdxiCTNQcw$ zACxV*FX^TrmRh1arU9`st@Wx~TVf%D5xh6F>JANe9F$Ow5Kh9uheIVza7;hE6T5dF zzW-7ExYnG(ua<=+vFO~NhJ`HU>9h3B&C{1Sd(4X}wNk%)$shAj%}yX__dIx?ShW?S z%2%Jw6|F<1qWZuc{=>gShJOVYj5}J*89927C%=S^Xj#OVy`^Xn>q^WBB6@1xN5VN+RRjA7ng8r z&#R}&>5Edj(z;huYO+NvXy-aN)gwdC7hsmhG$(BLGpqWu`mHOw%vI6M<>ZuC!uTQg zMa}2(y0;?oo1z6FJ~Cs{!H}Nna|qr1k#tD+i7>H&O~9*sIs)2r?=GXTQOt$`2vhtc zzBp}l&vo^Jjp1PZUY&@5L$)0X|`TgVk9gzHBn-(mbEgV<_4h*r%P?=3RCQs zEWcCUP~=QVFFxbW2_J>d%~2Vbk6n1Xp0OJnc!lY6VA}w!GW-OptmJ;;p4lX>2F|cg zQ{f#junI&{6q^lgZ;kq)!#0u&R@EBT=IAsnK=B zSfZWxg-%JtT-pbYF}w@{zqJCb8us~OSm#JpQ?O!HqWIh;YPIoP3Daz)eo4X7a1B%C zNEiZiN}+Tg3LdRt!dJ0^eMElVs$G^b>{)Q4IVGeR|B#-I_4|J9E79dm4Lw4GKBX-1 zZ?x&Ue?t#3IXds;n5leuXg~2a;zyL^w3*CS*+v{gh9*_#9x_65ubR{Pc^QE4t!-_K z?8jy0%ruczu6!?OCk&^$C|X!9U*`MXx)Gk4hkBrmYucH*69Yt~XB8YJE3)^RdfCP5bvHAD1Jxe1?-K zvT56E6QFor&g?TfYCNC)v$#VQ8Fi2mOrVOOmSIMmwNPy&#yQy;EI82p8qJrD?{Utz z$4tD`3sbM8gI3T5Hsp%s#;p|H5&1s#tHe?Zdk$Pz4o1zm<`gD(O5`fro{MptIgY1c zFd`+pkGG%BRabZhY~us~`7T{lT}o8p7&iH|(I^GxlnM9SuT38GHq|e8E~WAJzU|y| zO3_0sSkZp&GKr|EN2kajl&Qm|b}RtRG2teERUa!kr(!|KzoxsJZcnhO$OT!G5|*>y zyB3Xb!1Oa#t~m&TakvjRzK!npjT{#}@tMT1meSU{f9weAGq1#Crl6H;RAMTgk=*oG zAQd_;^^0%vRGgd$sAEkl)p+fje*0!A<;;Ck&(>_PeW$?>+r@9!{HaoY{8XQO@=PLm z(95KsjMaAo^`|fN>nGor>_C9a;{u;3`oD4YPnS@=1w!BM-Rb@gF8tlma=jxCV%nN2 z-uQ9;O6I;%{TlqO%d*iVq8818zsy&>lW1&gY!;|}ZnNXKH0MBn{>0A$1e{I2CT7gj zFZX5raM_L2aOjV?C&NMF;o;#xuQ<62KaKwTF6CE>ebP+6J#mri|Hm5afUd!W4hHVX ze#duzT%unl^wZa`z#{P2N&qDce&VnH{cDI15IHsNLs$I#M_T^x_g#A`J`ThJ;uxQt z{BLip|7V*23(5WuR?~NCt?mWe_5XnjLfCy}n>Y4+tUCA{gMVTdIWAuro$=a3xxx%H z`-?F#!1^-Hx|?PF5&-xEzf<`WMYrFg;Zx7a&7F5^@cHFRsZwzuIy13O*7VXOpwp6K z1W%IOQc}yjc!&O%UGz_1uetcv)>5}-t^fQJQ!#-05W-r{VrcF+&j&y}N23sl&06 zCK5kf<-5kw<;c-OJ?3hFVq+k>bPd+({C5=0FYA>Ito8Ai^T&Uh`F|Yj5AQy@_-PmO z$j{IEJ8!Rl3ef%Z&D7KXEvb$H3f1bwFU#;ZzMeRu@T(W}Ka%v9nf%390D<~pqwsIs z_7`&}yA9ZF@!#D44hesLF|dGqe}{xWznJU)-38=gBn}D^NTiNn4f`MX|6fG%y~C;` zVmg;VE&V6al8+I&)J$rq>g(G8sIhU9`z)R)2$ytn< z0o8)cU2lNt4BJU|eC9gKO5%WqI_~Wpr@6y^Cg@K~kR}O8_Po~lcH(c!kjv&ILR}-S zX#H-vNJmG<>>i$!SeMUV5(qFI-O=eRi|NeIuWk`_oFz-UF#UDvvs*YT{9=0&aImEa zH;pdnc^maMroW62?YWf;wX$N#G!nxJ=mg}&f>Fc@ykMtbP;7Kr^4omvF`GD-c*V#>s8nK_GL~)7!^2U1waH6f%^}(5ddS6%$|cu;H2HUJ zT1L_8OF(DBBfqTijyB>B$w{@?_m%FZhl1}$D#Kjp=o0rQ(q!+QlxnMUB-W;q`VI>H z2R6UK0dVw3&EwqPDHFo!+r|$uwE%J0k#4qH7Q|bRxLmP1UQn^HZa&IcSJ`JZ@h-=3 znm+4d2b_OE&pKMxXe=GEI@v!^9zT$0Eb=0z_wfFF|6nf#yQznV$8bG{GTN4lJ11K% zerc`(#3$Vt(#(V%$m45^;;=8?syR*1!(R5A(cp3|Zfn(~Zf=+_i~$VQcZCM)j(dxq zq>JLzeVkwIY1}*W842eNBxeZKKR*+J&97*^&9gYNKS9vf@YM$E@rBDSTmex0D^>TB zJZA;beNJNWAEa{)i2VviOFqc^V9V%cpGZ!>=#ah6n5(ou<}w=PtVVLZeDIi)AEZ;W z+@=@{-8l8RWq~j93Y`CcQYgM`fZK2C`=H=Y1$BayR=`z&B!D9uB49WV8y^*vqFhx- zu==EBt-Q~sr*yfa{@}#vv^nF=&#A-2v$He>D1qGwE2p+|(Rtk2>x8MX6d zHA;=f`Yc49t9{;3jTsysdEKp-XKu)@eE92c>OAx`Dd<=}*uq?ueoNJ<@-x$0;E4Z^ zz4r`jYTepK6&Ds1aVZfL0n4%gQk143pt1l(kQz`rBAp~Cy+%;L2G~%V6zPEwq=lML z1eD%F3rRpE5Fmt>1QL>*>3&yr@4deFT-W(=etiEzNHXVq%6P`O$35Rs53 z+HHbfy6)^8RXxS9w#my&3nCu5!!WLxlREW#9lwE5V%eOr7L(>7)oH@$du#!%bIzGdJ^Qzrfe zAhNF5_x0_YH&shimY-+mpp=;nQ>?hQ)uLrH6S)PiU=^(Le7_y>PF;&ZQ8I0O3mt_$qNY#n?)nC?k3R&|Rx)xaShH>2r^Q z&mUXkKkT2KNB8X#*69iS%O1PD^(VQJ2L+L@F}RU^CN;SN&oEM`xQ=UXMudsI=s zFNXi%WjM_8=liPtvY#IEyB5G&tHB@cNTN4i&B>KIAT@A*{@@BlI#F&npLdON6%>oy z;!-DNb6|V?UWoktkRIYHBJLYtf(!Iw2x! z$6S@}qNkAb_3!qQB*t$m`%I zHBuQlON)D~9V?5<2XD_YR@qc!^*j@g_i=Sw!Iy+1lavd`1Ph%l!CfrYLl<_p?URmT zJl;Nlo&YTZhDr&buii+#3gkMg>A7O#=Z}=&yaE=-22fhn@(Y4zv{ptARJPCCWEq!2 zox&RBm@+6Y<&b%%UUR|KV(DKzHdL^i9)q^?-0jxKOboYkm%CNR=hE1`x=OzkH5`L-GoVQ|xd$S`?4v+zWisQhMKw%luieY0)1N~zz{ot>I z>qA9$?r+c9-8IMEKBif*TB%P1sOsc|VLPLup?P$Llv#Tg#e;XN()apWP1j;d&lpvi z=t8;R#>TOj39t%DnHQS~0@>PYM6rMp_=`O5RWW*AS5C&_tg>G+^QnLjP&cs=A=oP9 zH(w4A3gfk$i)-$@zFl#@I%OPa-3Y-rH|JmHspQ9a#c|50%aDQAj`2V`O*?SGTl^vK zdx20fdceXH21Czpw9E#c8-YlRzQ1jX9x2ui39ZCu#ThP=MCOD0x!0z^wX)fTI~Utb z0DnUTa?91FC(Rjf1!^wmGjbIDFZz!_)<-^KN{S^2TJC(Wj_*QUy|$d|J=GkqDM3qJv2wKKFKY_26q?h76K$AzFJ4`B zy$(Slp9TfN_H|%U&cg~~kk9V)IS@HQQq!y3&vzY7aKf#*%Vi@(mi-Pf@{MOwi4Bgc zqh*uUeLlz&{B}4Gk)aW5PkXWYyb?Rnh5<3n!3FeglFz;C_k^Kqgu!^BODre|UU%3K&$@UqOvtajcF$Uay`ue%&R9}5mqa%6vkIbp0r*cW+&i}J6# zF4bc5{rsHm+Maoc)NnkX3O+hrvA>okC5oIfs!IS43(jP*I#dzJPA{Unx;|!J#Tv34 zD~OvlX6U`Ov?xP-Rb0e%5EOJ6NBXK$A$K=Pm}OCMoBurSCjN2}U%Hwu`)#?#1~dBW z^0X!TaFisd`_1r}vdjVPhEWMNXg{Mec)T(!&m{kRfvi2|mpSI=zO>6>mH0QUh0axd z+b3u6Tf#=lyIn>&=5WL}&L^{;T=QK*Y+Q|5@92(qoRDe82x588Nb79iWRC1bYO@*! zLzRWisfHWs4dj>cxD*=D6XZI3icibv2Q2&dCG{_V_dmczduksbaPLcT!w5))M$}#N zFjN6^h!pPf3c8AH&%2&!26kMNE%Gmb3g|^e3{V*=U9pCSy5LC*znobihy!H3WMG<$k@w9mcSU1M_0 zPv!Z-!#4u&qPj>=?J~8%N6oD4`PZ(Fd;#s^sYB1E+&wL0}CULlkdD z6c$p|D5I$OBO1`cgtVtF;I@$xq+P}FlimpH;q($X!Uk~^DfGrJXhYYs!fal{)*47v zuf2^Vj|qV`k96m{W6C!`B140|uD72Bc1(|u+|d`oKY^Vg%KT|`n69Zcrl_ZJho8@A zu5T#A(Zx^?6lL^YZ7On2U__=w-ahILxR0KyL5?y6dn)fGnO8F&Bc+iXowidv+FJ(g z89}6Lw>)&YelKg8VGWCmyEj(3_sE62YqX4}4OYPAw(S+x(3-|j4wsgVR8ybb)&F-~ z{_h6wxjSI%oPz1+R)1fZ4YMHQKy%0Q%29W|W)3K9$peTwFvL*qgS&xZ&irNOQ6`3* zD73fyN3d*|gDFj8DLp>1TJd27X!4;@CAwBZy(Sy zs=TFKA?2E+_GK-BJp~9dC`F~}oZBcZY?Z)JX+2Gad=siVI_7}5iIDyvlq#*jn$V8d zO>h92t9!_-)qgqs*#vjIxwn8X$kIM2sQf1szQp5}AQ(Lp&bFrAo7V*&biQDo`N{3n z!U4$cT7O!_v2n|$?uWs}4R5ZZJ!Bw9Z+9T^7HsJ9%Y1}W8Io1tT^ebR*i%>n9yus$ zC0cJFprZ$iTRH%aUPFE?kk6Q{mEGNh7f2|O+JfjUNG3`?r59cCAOaD+ zImyzyJm0rjYvS{T1a6kGy+zexEf->q%J!i=$@C*-O2wzs!&RoMa9*$i;?NM3=#B4! znx1!a^Ll!!@bc_2pFuEoEptFSMyOW*t%*_N0q}lC+ZDfXZd4aTv=oaH5^J)!Y<9)6 z!m}9DKReP3ILE_A3rUgHfXei(o5$8i^6!TiIAy{RD&m!)aU6AjYTVU4f#lOsH$i)b z{0noP=uci(o-KupLe12Q*$oA8GYBi{HrnBIuAp(o;0`??QWRKSe{D36%(sP8aeY2f zE$L%UX5Q#Z_6%aNY*Kz&wrvn;odUOv;sz_9Ye^c1a+-wV^7O6R#B1Bpr#`Ndg z6&`mG{bW;rU&s8tA!xR#p@3x>2u6!BWcLs@pp#kBpIVwfA}+DkU-$f4Px0^8(TUm+ zMIxRVX{?5}pO?zWwmyfY5n!r-zn!)FitYiU!23ZkH!#fI##ZI*K^6Y-&_tugJ_Vcd zb_+f8GiKCm2g481?KIoMN7?!x)lQw-K$SR}ll-Y;Q|T_8DoUwe zpF#@cK<0qn1O2=MuC`^_e;ADtfpVbi7*SVX9FN!& zjqcf7m@0iVXJ40k>+o0GWQBj2M?XBWjUuIEQ*c@L%lK_?FNSnt!~Q zFGXOYy|%pklf@_MF51l`)5S{1Sk*ml(OSBFAA0uMz%~U)oMhefne0I zLs*5NJB|*kwE6%ONRkpQprTw;3Z()o2AmtqnL7q7CTu1x`2{NE-@SWB-(43w1Q}%K zgqXYeWaNffw6!VRz0j+0ofZSWJOEz9d81$?cPRRpt}=YwTmBBO4^yn4pOq;Uh@fg4 z@}k#Ed@*g|{MS|2wqLb8YoEOT{&2iNlks9&82zG|8ysxba6xL%0tpX9lSP$naOEfm zIxWwtD$Rdk1Qg{>NNI%oj~Oqw3eMZU%iag+^~B~OxKyUL__oDTu%Rkmpy+f+VXeoO zE^K;U_=${d|KJ82TmX)S1JH!BhCgO`X%~Q>jM%uq^iY-Fj)uOT%$$$-(85UTkdWHK zPx<=kEsRQx6B57QaqyUzM|Izo0XY$%W+#pit_XG4m+5}C-1NiQlN06b8}}8 zP9hH9&hIVA&G86ed#zi*1y|Q@AHia|#OX zFQ^lP<3l8PJ>Q7ogSMH+NmsFE?tF!F0T;IACEL|36%oar4o$%uiU3d|Hr(Cz{c_`Q zNjoJ%J0|AN%I#RQ`5scSy8GoQL;JCn`&e{S*kT4jzPYj|`f1qbn;^Yr=@v(L^`-PX z=o^wx%|Dwa1T^P9*ciiUM6A~6JUbph>Tv^tu}#6Xe0=%5|2Khm{`PY!t~XUv%v`$@ zUBosQF(W=9>`L_DLWXu+fkoGD1yf)=JO)x-J@&e8`Y{I;!nR@)4 z6E-qi(-$FmMe*%3^j%rdwO%`?u>Ve_d+(*-Eu7j%jYb zcbHl*u|s${sqdWCR$G1_I_z2{wIDBDF<`8u;H`B8Q5}YD;iMEjU~xGy<3iU;#ZPno zsIB;YI{)0^4eKBvI~zVMd*hFM{PU`YE7lhWV{VGzpbclX|tQzwXrHP{!JzluTa=LvFGWB+stq)e}4HG1jukMh3t^q z=d$f{Gr@nXJx0^F=Kgf)nazCa5E>}v;=^L_-dY}#J7tI-^%Y}Jn*@9$&{rz58!`%y zdo;Uw2#9#5?`HCYl?GKNw27K)wvU~yJ!JA(xlgMneQ~zz3ZeJXn={Rr@Wjb6UC!Ee zwy1sFy0-wA5Ii7gGW~U(9Tlo^D{HBek`(y_Qdzp<<_6#qx@DP&QODJeBIrZ)MS2uf z`T5y$Y-hSw4|rD^48AY{AI#{*!hoZgVN@1gls}sS=Py91S$71Gn9i2(tbPFvy zYASvP;^z`|vqEwnmH{7VniTU=rqMVPSA1Hg#TKx&yT`5X*LxAHm;seJEdY*-=O`RM z5;ybj6ZgjyDx3q@7B@TT-KKv`bMx_xqp2uNu5o;%m19fGl7F*6605hM$u(G@gju(W zgsKVb?@CcuMfe|%{%k(!ol?(PxomjFo}>nGzQq4b$*#+&KXg5OH7HfHUjBl!Cvxuv zX-R~5NgE#{!`K?2O<8tXT#+XXu>dHGo;H>HVXjc~sBOa+7Y%9fNZ9Plw$j5laW}#S zsB`eIVYC(b1Ck;c$^P>JX)cTYIf_7XaNoxr(g%)XavVP(3% zUR*-`LtMR4jaT43rSh7VXCFo%TYA$w&f;z2IqF`$HkoG1{F@*(Ss9sFz~4Kp`S@_x zwSz|GRMx>UHgt08+m|r=u1E8yiWU)&(`G3)<7jT#u2j~&%CVA<2zO6A5m_rYVbOF& z*UAuUkR_^?tY6k{@i2V7uPvsYRgtbI@uyStZ!VOB@6I*bQBm>LW}81D&F6|+3GE@c z_G!7n3&Y!Qy&bt+klb`NCbIn{VyR#voewU+qExmk*GC+Uf**z)RUlez}P)^A_uEeMV?$3T|<||^*GfG!>~+4xupW{-eK+(o)WBR>p$xEY$iE5&HD{h zCT#thQHx=?U zEL{fX4h|m%zo*NRAcOI)#_de|bqx=Db>G)*_ zSeA&hC@!l&L3}`HvFOBG=DsBU7_3Sqc{*Dd}dSt;Zd>M)AVZ5_u5Ekb6q&~FmuJg zr>sz7j`U2+!=`5Xew|ce!OPj;`#twTNWddG+@&pZen+A;CJ;@ICNn~MNOs8UaT$*9nN4e8l6vMP~cm#*eF z2AIZpU0T#+u7VPX?vQ@Qpt>f26GPCO@`(xp?H#-%lYeOY6`{TNX3P7d!^6a8Eygj} z#!KC48XW{p8xF#1ez!d2y86g_SQU=H!<=K%ktY1cK;64Z%<+K{I0RgOp#W@do|qEM z3;;U|YUgc0v#t-^7&dfNm;AbSTkj(Ht;FKL+;Tc zT`Ff6;~xTfsdFe8{^bZdauA~|a`XbN4Lqw?JswC$zkE#8kA#-LSd`oF0%mE4Id}3G zQU77&YkD3cKWPkrQpKb0gu&&u_;HlEImlDNpFhEDZ5*`=1P(e60NM_})|33_V{<=6 zZ@wC9;$Q9hFc#HkecFg2m=~w+<#&@*Tow8depo}g*Y`D&ND=fpFBJ?MUaSWqKOA}F z!JRs(*>CtSt-8EHjp)f!{CoVYmrFn((4nM*(l#P-AqqV`_)P5+D;0asTK zNIm$tvXFph8(vy$JXJ%+XPT&>bR-(re2*Y{#H?v?a&>iv-9%186fPFh)HRE(%i8&= z&C9dZO>N;JL-X1(akIx}R0fJq6P{vv4X46VkbG3_^25B>Mp}5(Q@_kOPDmtN+jn!# z(TTHuw5}^G^x}?M!zf<2ZP@g*Zri6oYtP{%5*cJF7+-jLVVTHd7fhA$O)gtN(O^zS zGg{;0gJN3RqRD`r3lq%A!P_;@Ri9+snn>Y>-8NPvaoGDMoWS=2=m?M$`)TCDSPbA* zJ?1M7zx0pj;K=^OOCjBL?AD>Pis(O#$jHH+&C*UG*SBji1@1;W%16zmg-qszpLh`q zMIo(OtlWKZ(#Vs_gu}P5nDR4(AKmuQjzp027X{>{j^>u+z#d9;L229aM&w2Eef7PPZf{_>D5f0+dl0!fxtEP!QUQ>IdbJ#}Wwvl|jspOb z$@k}>bW2Z}25E=vrM?yC8-T_{j_*g?XnvI=egtJp9nhLm-55pDb$_h+ZS%<+6+jZa zCdga9f77*@B_R@(+2mk3QafaiTcZ@e9zsf2NIyWlc++GrE-vm!TdYRxDgKClwHFT+ z8@hDw>)nwr8a;r3k zA^u(*nsOhFK=Z_*GtlwY=`2dkW%D27mgG9;BEOhea0M$d;2X-?&r05~-f53N2Y zu<1#Fgm2)&SLb=}Z;aVF7rWhB(e6FEeC8z?FUC)lgcj{aBfkDp7wD2Pwm$!TWXOn&UDf(-S+{f!n z`~RLQ&Dg?c%d#6&Vbf9ELS7Z^D&YY4;TFEBn+_BAwWgpiZy){Bx=$Xw;5}PX_<@`k z(rYn#L&T~O4Q8v1W@N)Cd{JD^JNuw6{wm?3R1fX+8l6DXkbA2ghhUDpv3b00#?47& zVe!ZyOgPydJZ`q{w3k3AD_8%XJeHNbJ9-03kpP`y^*I?OhR~|I$zm6<}jLCo;jA(r!WsuFoiEO5Q1Fk zUSSvjoYe)*TN7v1-i=PoR}8O>M~*Uwrx>Z#E!%x!YNfVJ7k-kyB(~kH!d8R#l^kA{ zy{`~)BpSpoBynjFrRDe8k5HI==Tcq%@)!L^;#K7+C}@kBXUUb0;^MS+6r~mAfQ*bo ztf&DAE!Co{K>~X0T#h#0@)ih(714|aSYd2zkYzQ^bC6E0Y$pEViBBtxe2$?3k zteMkP|0ULztrPh(k4_7Ot?#QP5=+8kt%n}jDf;(cXj=XhVv%Uq_IAl)bvazXZ-MmD z(@5VLEbbXU>U23*Wdx$nUOQl-!l0fdPsS>a*qz3B8-lKE#JZe5T`&KTX3 zdTxx{lF~G0q`?lYTYZ26?Id``t6SQA{OFoOD(Utr2dbm+)IwCfM178=$hw95wr-ZH zLk(ej1#La|K{?}NiRlU-M-0acI32$4AESpiyM<#{Hk=rL#ucp*51PCjM@%A$e33*V zM$=1R{H}*>W$?^HAuSK#kzIL{F(&y2nVn1io!t5*lPk@75@DARC8C(TErU#nK!ua3 zWKz84#Z(nYGTgI4kN*gb$6$6H6icO}jpKx}_f2%5pvojxw~!70=XG{4l}uyv+zUlc zS)P8w6Ov@TtgR0U4UDpvgs-@-Mk4uAl!OG%bJm~a4Q$5=UwsvOHFi0-{kcF*+Q)>& z?H=!H6fL_ARO=8vxt;+e;H=2BQ1kYTuKhd-gP-K$1AQ(#zQ zY2w5aoTV}ZyGMk|I_$L?VNJ)v9&oO4+ztyoVyloW+Q9=+o{t-|c4L!e za#_RI;}M&M5JN-UW$>YXbST;+YNuq#rj#|11yLw=_Na`gEpfNfTA$Q*>A|o{%0i0$ zvfESCPDM#@g3HCt!5bj4?q|%r;W0}f<Xfe7Jszh*zCcf>yDk?soyh_g_Q`0?qM45CN|^t z2rPHTnK48|JW|CG_u535cfs}aJdEWAmV%8yWW)lp%1<3CTYL3a0Y1S>N@ZV}mvhVN zjC_^#arV&(hv;{BUv-{xe+MsD72{u+2|MKMnJ=pJpW@bN5)NrF(ApALVb5tBF;_6zykFvNVZ#QXdHpbehhFU`iA6q~Uf$n!!Qv8`?r^}12sUP7P?zv*v=;3fA$8@qY0$?=F zkCAJsn0!AFsy7v?_K;G1c`1ZQR|zP(2vjP9y(BulwFySY;y9z-PICA+l~@GAUF9x; zQW+D$4SUjKR)7pHq*ei7^8Th_fsWcK5#yc?>!K` zI{g9BG)C;fHCCZUA&}*#X7XS`8Wd_hL*KJT|LB9pL&+h;MZC2p)-HV<%42z~=`w%~0&tPzh znevsfk%Lu~Xiuu_v?t-}=IqDQ&m;YoRZNEJG5cz~I95KRHEH-DnTgz|Ps^W389Qq~ zM34K{?_SiO0Jwq`piA*L4febR1a<#)PXYkdv3w%?`QJ-Y{*=KL1@VP3&mIAlH5>dT z&{FXK$@~jsG4(byI$&W8Qdze-Hj)%XRx-Jav*JJ~;A%#8Jt){T<;*;$iKtm$toi`& z23zHh#HSm4&A|WkbG~g=1DJyQs=2Y|^V7}KpMzb`{f5kBc=M%m*77S^-8|d?Or?0>N zAz#B6g7#k%z1lg(sR_&ho`GO>J(j~3Qb z+a<|uq$TzD_rFPNZ*MmM5{d=Zbt9oPb&^uN)^hg7XL+uvz81G-2mC9CyjZ)qBHtCG zwepPoK|}9H4In^NyZ1ZW-O9f8Z=B|=TN$}7X?^x})R78&D#ZOs0QnE;fbUk-z&HZS zX|k_=nz~Jv3kc|Ty~C`lk~L_&U1eeHxQO8N7c>&Uu^_*e#KMd_!slgGQ{qX?7_tzJ z9f;*>tw#tYf(tEl38zIwQl8mvUY6#Y-1Q?krTxnbme2UHv+7)on+#K4Vra!EkaI;G3HGLgYx2#bQRa^AsN z_w`ln)^=?YX`4M5k@_Arb@eV4v3?Ezg~XST5h4%6Oa{~#qTdJpZB+hsz??X9IcMPK zPpm#P|(dJM+&EML5pwRwp`0Z1iQBpuN&N6VElfb*1EI?>Ucg$7u@SI{I;T@ql7`U`MI;jWBuiFaUR9M4 z_|R6UtP|Ko(~%#aXtb(%Tm(qdE^p;*?~uFSJE_3JN4>&0^jr21;RSy8n6?4QfUtAT z#`ZQH`y*HP{m52$%Wr;V2B4oW!p_R? zSpD0`YoG9@Srfg;ok_3HuLy-MX-jSGeFhW}He;7eR@V;1AL17bV^^ndP*ShvX|WY0 z&+|CL@UAoa4ynAyUZSrlk}bpO!?BU5WyXS8JYEvl<^4V-C8f(xmAIeQvN<}V=|l{s zS$|lh1rCRFb=%f{80J2ae#TwZ;y(Pow*tI{52Xf*-OaaDwKHvwoI$j;Kq*zk3c&L;;>8$zg8SEsQ&EtknieyM>$|0N&Z zbh8UPPP}jZPvwW-&aTTCzA#ewH}zA|e<`Z?+wT0A>1=)3(4|U9EL9RIr9EDGk)|E(Har%aGGTNG_OVnmuJWo`pmp&NJatq^?>L zduwE#MEoDxl>ak&5q12g@HK%%baFz4&ZPJD~w{>THAnn=9*%`z)pZ207lmfSqCs% zW~V=ljfF>;@jHW$DSII*4-1`yPoj9G_7iJfH=YGel1IaI{*nGEaX z7{kWaOt*ntaI!ro!T#o<3h0w!>rW_>cl8D*p7XLg@T0tF0iFn7I!#RPhaa;G{WilZ z1PrBad%o{8Cc1u=K+X$ixf&jO%NypgVTTCannZwm4B>w5(R8&7rvzCV`VAG`UbY*b zM{(K1o$4fxW*M9p@rFraM+ns{2Gh`RCew^~BlzBA6Tc;AHK)tEv#du$lK$Z`3Z;aI zv)`B-?#z`zowKwJdAQMH&jR^S`g8J0Z0?d%pN~eh7l-v`xCgrwSfVz9CEA?IkJZR$2h&(9e@I86(lQ8#V9&r`)Zhtq_(3UdrbKz-XK*5`-1 zxa&R;0J0=ks*XErvXivVA-v|aUx$ZUb)&IVBpCv$AKqMFZtDULCY}O9$?EeE;N1~7 zhXO?Tm77(nnU!=*N-n!CeLWlQF2P=&A|JBWp|^^`ya_-D>V5Tjr%CJau;jV9BonlJ z=<*FC*x%0lL1f4?F~>nq?m&Cdh+icafA)v045h6Y5s>g(uS&ok7LALyYmmf znywEWXnnH`fMz_Y=?c5ed2HCpoH2LE*`*QKgClCQ{#1-#KmfjBI&ZUMcA3Pb7WS>$ zq}!BFaV2@H0iD2+v~cy!Byxsx0SsAV;Gv3I+&=A7wm35qtTGBCAr(CBK2J0`FF3@VtMB*lNdL6GqlcRWzSAFiD@UIBnvb_ zh}U3D<=boQsy8Fk!G$iwFZ#e? zb!@rSKKsqbw>=*wJEj0yWgFHZ9c*UU#OdblAPwHwF!tqz%>+xEm;Lo0J~Y+M5NP_8 zgK!g#vatmcyur@`H)IsPscD&0k)8buvC!nPGM=$MWwa)CHyv4JjSjpws8J9}8A9Sa zfhaj8a>RuK!870E$cpl%O1$s_1?1dlcf}Iud7K-rj%7<(7_KoeK$xugH zigX%_F`+Fa#zETFwr+OuSar8cGH63|F}d2#Hwg(Rqa8R)55vrt%)mCUt@^%wx&B_! zUwzd3d@#=^edECDPzY&%eVmp_#ei3G<-^|3LLrp?lR(aFkyw9vT3PCZrhA@d8&v}g6$M?R}eJLKBeYESqaf^$K z^C-g^Il_rn9qe+Zu{d_Nfl>~HKkLh+WRQ$y@2lnvwfsg(}PyV`fe*D-%2Hy!?O>q-YnL*O|pEIvxtq~4E zt(3eCG~nQoc#i|q2`TCD4dpv4IwEP3%XY9Df6Cn^u&&72Tl>!SL<@>VGK0(67%F2I z@RUzGLTWrRe?E~#JiF=XsGy6lp}tLtWQI>P8J7&j-&mt-TYpg+kJChiebU@;_Z%ux z>BC)WW-rd{#*&pZF2U+10jE*Nz@wH)Ebh;b%;C;FSG@T>TnJk-%h7j6cTUDg9{jj~ z02g*j@h&!x`;fMg`x@g@(&~$qV0EBcedwpiy1z)y{>%T#cmcG~lKr;h@!~%i*~^VP zi*9{vs#|usYix{Dla%NsEmX`%{ z51-S1t}2gNyZ>pVtVeBNJZwfh*8?Z*!aQZzSqsBD0uOiaoDr0`NguX%nQEniFUo)s zcQKM$-M$x?N6M`0gP~%>wjmYB`>dC{ELY99D61vb`V+<;8_r+&Rv~pu&57LUpo};h z@})(DpO&IRAOw#?eJ`!~q*0kQe)EL2mS^vNT6Mp?b^5DH)qKjPTJ+F#+v?LF)<{F# zDdRhO^9r25$HzZx>6IH305qYTmv+C@gls@ccXMsEM`gTP?oxaH zt0L)_tXzeBpg=8uv6G=O;h-gDi2}4^&(pB077oQ2e`;vb?k$C=Nya?vz{7o1*K{}( zTEEfiaKFGbrxT@Rq@d{1sl@XldRbMvNfaq2KKVBU%l~o&)&Ar7R&}Fye~r6;j8h_f z1@h0&9CGFK6xmdt&+IC)tsUB=rLOKzR=s4#i`kw$>O+2{S3L>r@wc+p2E!5>Wu44# zkMla$Vc3rI#P|`9!oZv9=bEvxY(!fFZ?#A3ULI_uq|vMLSo>Z4=e#ukt)subvpkBP za<(n))bw3{t$PpyDg*0)ao|Q{@cY=}OY<`w6u`$EB|ph*KH*}fGc?;!aJ9s?7KYMP zhjaN>C-t0;zm>78t1|H$w2-x~0(kLT|1Fpnw*{cjxbUASTK{0Ov%wByYZUT}W_;~j z&SZvDVAf&Ycz&M?Z=29L0exNcuY56W>48s80+on$@SAB~dtvbB8&mOGS(Y?nKwVMU z?lfu9!%!KEB86eQfQPqBCQwVWiOsK1aiDP*=0p`k{D-y_@m0;F!84N-1E3{Et<#mZ zLG%hTOAMwmXIYm^m(D<7e*NCbpklbNm?G|z{FVSg2R9<7#LFC_^CKeS_nd#{Kj#5B zHj>IGSE=z@oVz#GrpwQ^-R1;Mw!FI|p~df~9zcZxQ*p4!XCSv|lK3m@Fa#5>y%4@# ztaRJQN>Ez2!jB{HL|~!64ky7orKY(0r)l|S>p&g*+}1c978~U$sO&j(#zy>u>JMi3 z96wNMvEL{3%Jab!-xTp!M&E3bHb}GTmsXaV4ZD&Lxvab?aQXV_x^Cm3 zxiXmQHBgf<3d4pO;-tZZsc9@{QN1jfp8QDFBuiJ&r-92(LbZmyhg2!nf-DM5M~{RJ zn&g@^N0T{1no2-4-VSAC=Ta?DX`?l?Bu=nHLM%yJVc1FoO;z;t2RRRFrr zy*7^<13QGxzYpk26$LqEy}Pj%#$nOBO!Ooi&!6{5)H-c+PHnG1oy%~0f{g1JbzrEx zvdy^JsV&?qoCCSz|4iX83n@a}s)2`Ym#cMC9hbMH!efY1YJg13J%Fa!n&Zg#`>4K< z05EmRJ!j+(LsfkMaEa9A$v;SvJpQhQRJq&f=Q9YtmZx)ZAMJnm-v8pyg6}`Ac4O$# z5618R_^0q~;9hkYy`@h7i>v(YBbVm@bSk&|mGYkp<}c9wU);QZy9XVMj9*_86#e)7 zVUjW~{{*Ze)1!FjtiN63-@f|We_z;bm42T){I22;V(kCwYrswETz$~%{_?`}g`a+( zt$(`Hzy2z4O<-2(&eXrY`M>${<(K=8`da<6_k?=He|w()_A}Xl{*8NZ*lqRyw>NA2 z3otncpEQ5I`M;c#KOc$$(8iPP?1%n_EdKfL|NcsN*Y~CLRiX62fB(#XzMIRzzz+Jq z)A^qV=lh!Z|7bcN9m*p7t_ASlFZLf6MW9#?pxj(E0$CV zVX6Sfvq9V3Yb#eZrfTipgtNE%%RNT>XO%5FJh7$L7#H1WcVldLQP;utd!y7F$Hi~X zaLGBapxY`hImABl^>=!9Ln-f^1C)3l`bp+T%2F45bXuNrenTQ71_j<+qt4y>CmQwl z#TRAoFw%Q0x4*bHnKF=(ldLU!>?{+%2Ojgz8A}3}n4M;FojhFCJ@U&d z4`0u@`7>v-Ek0lU%>tH~?cAqEklL%L{!fwXmz}90-MplSdoL-p>G0N9jaJuRoW7qL ze@Gzy@{_NW4cAf$Lhbg5fvyzQ6hM0@C1`a9v>un|2|qCU5s2!lNA(k=r}<0;@EaCI zw}=v*w`v9%-YEM#IAp{jBx;~F_V7ku6hj$xkTOoHOVtV@pst2Ayjr-myuanO&3Sf9 z`x~j(oIRrkvbRgkRm_s!h(!d`=aKKw6_bQ`@Mc?G9WBd`Rvffn&L*q=vjQ< ziIPG~6!h)c>oEFf^F^4ht{}qJ<>IU7myfze)Gk&L%=3*Kfizy%c<4OjqP%f~kMJO; z`awWS*Ka<<hTQ{kg=cC*(-&3 z$pcuw`5}kR?h8xHZRw(%ZvjA5TR~ZMAZ-%8J~8BIqs>QxKQ}_hdGGPZ?pPs6*>~Xa zT8kHa`l4o1_Mg-T=zj2q&6N&R!Q!cT?Tl-?&)mhFsEDl5qFvKn1N}DCr9kev%cDv3 zM~LmOA?(qsm*cNXu6*i!e2)@nR(kh(nRCa%*Iw65I$|VkB?{x8biQt%zJruWx~KU$ zYs*qxFW_&b8mm4Nkzb4px~iBLcq$1YP}p59oE{lPy4~s38lvx!Ec0SB=Fy~?wy-nuobHa&N(1m7&5l&>&3lXY>NFR!_lgywoFWo|k!;V%~w%94PzJ8ByAf!-FW8 z{#$8xa#spW#cO0juhx=|bY()Jx8jf6)djLod=9`vRDlXIjqfp3F-c$zX^kdA*+#3q z4KXKUo5s!+04N~)HOnoB!L?$!3; zvG&W$pAOtC!Q>r^VuXsZK25cr+Sg^I#k(UB68cz@YA2-eZQsCTozL^`U6STD6&?v2 zKs7m_O@I+Thl0O;%2}CTX{!jX@Q_=`F(zh{;HulUYwjQLUCM}wZ3=)WwY1L0p{Y%dH7BCyhyLc zO!fgIrRnwr!KQFv3#fPw75m})l-D;z>=UsI8pkaPZEGtj{gm?qRrgK=ToOLG8M1Ld zgnP*gXnHN-`7&{;o93N%@#|9ac=--CL)9$Lu;aWv%@cL5YeB=D8K+LeobFhg{aIP@ zyg}a0cgb&Mt*SCoa_4UqSFjlXSkVcbMMvtdE!lzWgtQjCL*!*>Hs3Uy$OZwDb~Q@= zTU3+S0RTX|I)1VW8%8(uYzUvZx4jTooL8i4WKE zCeU~7kv!dZpfWCJgiC#FUI$L3+L>(Tb(}cGyHzBOdq~2pTZK&?TLUu zija&{!p6+Zvv8bW*fi)}%AOFY%!2}U$9T}{LVdaYTG7w61DwvsesH;+O!M*h6I%iS zI`zNKLwC@bw?h?W_y5U`Ih;OVJl!AwlCDZuys6cd>PJ45`&1AjZH#!3{Jk`FA=BHW z*((=q}!NLTYViSq*ftsa)PeI5L^9_FaUp@N`tm=)BE+4Tpo0 z@VU-|C>5mjj!Zkc^<>jLs&>d6X?1c@x?{{Zhh_WmPE;a0f#8=7ajPz7sMV~0*zNTH zQ1+c+O>W(`+kz;FSSShtb`%6eq*qZvML>kmn;^Xeq?ZH{0Sgivy@OH`AoNI$fYOTy zAwUQLkx)W!frP+a+28S=^X+qw&$)kmHf|r1cfD)PHRqUPjOl&@Kew21!}YIVRljJF z;5>@iq$#DpU|7<^rtziUh!0}(M?|_;FQ1H~bzwzD&AxS9nsAlGY+cYXsb9tQ^QlK_ z>yp=vRw$-@%9{AMLm&qw(tIpri7-Fj?=>@tE`XR+!)M^?BjrwqlsvkWb>9+YC>A!J zu{|C9qt+42Sm)?YohvF7O`*~@v7iAR8{l(ry&PYa%`2L^qUu6Xn#W@hgI);bGli!M zG$%vnzhOv$TCsC2KBG4novp$tzoIM2M!g&4&csT(M`Hv>$>q3NhGP56OpRYYwF*0e z!J{gE3kTB_hggX#+zlOW?VXd?btwI?n-A|1vwS*&dnF&(S*KWSAD_}X#FjgA^1j+2 zg4(`;A4e$mcY=SArbueQSyI_^q z+c#C(EEgEMb3^54$hyBeJ=a&JuG4R^!7M4k2E9u-hqR~L$fNw|^R$E`lx_3F^8vL& z&0f~Ojk!N+p4zrLJv}Js@<$}wmv0xu&mgAO3MeX~=(MEgi#D6f6BhmtjFU+5_X8*UvzdPf9Ld@>+m#9*5}n%HRyn8)Tdaw}vz3 zWP34IAuEgNnw_)qUc=r6R=ZlJvhOCd3V5gU7qErM4ttkwV!agqPG=w{y|lu*<(JmQ zx~lXJ4i{L@^^@UuVFW*tFZ_x><-qN5-tkVss1RDh zWXDdIe0R<2vS__rfYUIsVkQ-;DFpj4nB!(fHEagdC5urZUnix)+&{=;8d>J~3~%W`&KjVswck6jL7jID5{$TC zuo9drx8*Jc_h$v+&C%<_UfbQd&Y431yZuEAs=pN%4<=)17#J9yZ}-YzKMZO#PJ1$)c)Gf;e2%1^OGyP85fVs#(a?5jiHFMTcaLBh6{a^|J0t*V4Kz3i$A zxL^bUzbblcbn{DY(cw(CJrq7RSqrEFYoEcIQS$?8E4Y6@d(Je@VMb;m7-)lGETgIc zoo9@uiL!=E_|!f_yq)h+4)SJCZXiUU5Zo7;x1cE)aP!It=f#>CMD^1SGmN{>`{kj9v(a+H1%6FY3HGCn zVaem?%sS1qn~2puo{igaDp~GT6NW*D+&r=XW8v3`OENq{NwT9m@jGf>KF+u1+~<9D z^zEP(wY0jzAqrR)b8Ebn&|txp!S1N1k9F7K$tk;jThyFd+kO54_HO?ljp(_=c7@j% zNQzko`Swknx^`SySCzkwwjFt(C#y4*Rq$|B&`uaKss!5`p9CZ-2Ou}~A!P@S!M%6gz@~bR*ZIaUxaRNg*M2A%ei=sb zHqn&L^^CLfgj~@c8&sUHB1}m(ux-vd-1s;o8?L_QZ_8pGtvG*tWkmwJ0l8&>)Bk1! zi8Ke*LsFp|{rl(uLiJGW+j7ocrAI=8j5!R6r58?{cJRB*^|HWTh!frR(ROy-wp^la z>xYtpKYjeQZD*F}&WDf|SW7r%#7RJQx(OTilINsPtVJYzO_DAGJnL7DV}@ zV8M&0%qmNf^1nvII&<~9lkCD(?RulX5U?Bv(7B(@77>w}Zz(`M4TW9Jwr zA9Z&^n?m^SN#uqe)0L|?$TJ^w1C!(P$gu=>&ZuuQ6%t7HM6ndZI$H!xo|Pv#@$+;0vi}OqbSbVhNl#?cM9v zDy+9akJs9u-YC@Bf`n{Ra2r~+4)on)+Z64?4fo*?3>o%hHV^jOt0G}RviTmFSk-;U zY!4csEya!pO%kbz9Q;=sLlgx4NI}?Xn;R3(F(?C>72eApjmUTuMOzyW19(F93_1`^ ze4Wmx5zqIZ{KhHQa|1(r~2X&|qkc7RyzE4fDy{#CbY zT^f_dI#@8v?7+rgEP82ApLKakhr{Sf19-@S0Yn!fzDB*+*$dzb_qzAGNgWg@d>|s22Mu- zT_w@lMC=d67V`+59B1^EAiNQ{SP3gZDGy|TYDFkNq@hn&u7ix10$Hr=l<4Qpr5?0I z&Bo)ya%;UR8;e<|E+Rc|L~>ByKgG+E;EKoH`*I&%$^V`e@~aq`C35P7JKN5tNHlV9 zPPV4E!~oAvXCl()O7-qf(k}LU7obcYRDAQ>gyuIXK}5PbuEX^h8cpKeIQ zJZP6GTJJEnrk)#V3vK^udG1*}@mxa&3QUZM{2J&|F;p_t^2XYTp*$4~RXQdndlcxZ*S=t-w?FSY%jP&b8pi2uX1K$p z67Alo8P)L^uF?H|ik@7UMf64S7K^Z?!mb2@&eoCMRWf0rj5qwe9_Qb z_tH;~{@UG$e7?{UgI5YL4?2)Pz zTbl*_1A*>&=1|A)dLWOf($KsMVsMU)FUC)WWBRj`(`E~ z+7fYh0EaWnc@5bz9Jg)xO{!>r z2_NQB>yP;NTr)pxGkmt3@knm3)GfgTP|6WLMwjol>(R!4QsTPO?$SQ3@Ny(VJ#naR z_p6@CH?$w=*BR+rUgSrH>IXH>T}gM&EKWrJq*Wx`+5mbPxotTpt{M({(BTceGfXVt%q#efZe(I4g9*rPp(*O!UnLr<)2r$n#K!1)&f zd*V(Q1Ypc7A1}!WNU98WhdqyZHqzJ9Qj;xx7xyVEX@0smarXe*QA(gbZj9F|aIn*N zxVX9ME-ob)QaL4M#@4p`<=mH+8O zi#k!Se9=a|FR3Qjp6gk4RT|iAec~%Tp~2ku57(73-o>a`X$?^f)2@GWlU}u$MGRrh zFo|O8npOiehu#ak+ayP$Ro3a0

@6UD|i4@Adqj5cFY29;-Hk!EzTT8(wE4&Ej^{jg1p|X}|XbcP)_onA>rQ z+_Ph^?n+ZtB_p|O)~;)?EZUS0&l=@V$hvm~|MJfV1g1jIj9!cJy&wu^d48H*x~I8P z|5;kbn-A?a@W!N4a%A;plkj5!?$Sw(&%k+9kh`$C6uY&IYKoNhf%}cDU-avw(uG2v z@oGEDjntk!`BB_5(_fvkETx^KLY#%(NRdVw`QcnuIU&4tG^A)4{Y@dxUwhZ6e`i`X z8{t=W-s4|;s6-0SCMl#_2B9k1XLz$KKM?5?eL_(t19vHZs1zRq=y5>__S#8R3@2h$ zOb?==0E%5HWEXW#sj~w#nSDNoo;A~_2W!b|+X7HxfCW_Ui%=~GQJ-4@(qcU6q_c~@ z2ose}W9=cVEr@=QSlH)-E=YRiu?#Z41o0FJuMBaRJ?;DSfo2D|rHCUP@PRfv&oShA z^1mF)eGrh(v(6E+uPITsUk<{u9{OWyngpk&@I#1}St{{W{&%(xf2L*HCRnt$J7`@0 zEbOJ)<-U^;p{B5R72~kU#(gg!NOxuIhd-fb^(d`4#D&t%wT(6m*ISdNnVNO_`^cmf zEcLhhgUy$o4uEN%)g#vQKWx4Gk63=PsFXLdb)AG61Ys7~Omg{t2GgI@u2wvFU||+u zfcVsX>0V~KwvJf!n}_*!aYLFzbQ#(vuZ>~gO7B{WGii0eUb(^y26YhPQ2m*g^E%|* zCh)ejH@LO9b!f8kRHxn?fl%bgg2{bqx&3yGuQ+&f9huK9+Ef^rvl;B@aO0v9YN^g` zVEwq$j>-s1-AI-cnACH&o}25#W-TyCsPd(}r5rY`adX@%d4m$srZuZ+N{okTh}szB z;A&pX8?6R1=D29SE6&)y>N^MI?A6kRTvFkoDKjTTQ{ShSzMyseoGeH=oYPDk!C3 zqxx$>n^9=jv?YHn5!6*#_&h48tFVz@O+#YZAj6I+Ir3l(g>6Y1YjH(^r$Vd(PnA$K zeC(Tl>9>>UE2~E|Pr4%w@_r(J76N>?uh4?fsp$FhoYAFWiTIcBNNoHVKIx@Vc$$~< z*xm9Nj6kVz`?<$E?Gy(Mc(rhlYV<^-+};P5(!V>Nr<+u|e7Y;Y4NGnD<<=;$ZbZ@Y zQr|u_9F)*1C<~!aV-GMDz+a+If!Pz9a(7pM4{-ml&4k|+u$RedphEYee|&O_m)|3* z@Uize2R@-9$Uz0JqUr~~JEd0_vQsSD&Sy5@_W@QyP%1zU3wD*4CF-zlFTE(Jq1Ax4>Ywkhan(x{DXW_u!D< z;9RxpU+PMxGIQB#6(XG3xSE~m3mB{Xo&Z72z`i}AgC3F5J~hZFh>ennN;kibHH(5F zX5{hvBz+Y&nlwi^)aMX_kMT5sT04j1J!b4SWdD{ldY!X6J!%08&^w~-Y`NZR{VQ9= zr*%ITa1Iu15UC@6F>fF&^XYpyui%gnuTsR03>=4>?a%QTXQC@`F8kUVO+TY0gNLK3 z%2f%3h0pC`DqiHvrRdsupDojJ*Mv_Z1zp&}6vfJbX87`pgezm3vdM*XKaqY4YWf=+ zr5_XOSnfkP${ss8vGT?3;!IpaI`Xh_Ln@+j)3wLh(tqhZuL5py&>>}7WUsTaw$+>c z7z3(e&HUDJLl%A5+Z&TE@0(uRx|e9Y=9{m1EiV~<*6#w9tE3ot=3IJrBywFU?AX!ciU7#>wre%>g)eii>d|WR7V;MtO!Zf$>ZM%DcoFmXtEYqt_OOMlgkc&u8Bu2it0Y1%gJ-MI}Pshs@mu z<)q}G(JW}8=#0)g++TDe`O-Hqmw-MGPa39iHGR$>_vOdF%|fV%ReRyp^ zjf{_u^N|VLr^;iF+MJleWPQ)W>aLdU(j$!o?d(yFpF^paS4q^aHaL0>h3LGFH-em9 zs9e|{rJ;c8^9mzU=)&H{6a@>ugY?jyR9Gx(IDe+o#~HtrWpU9G`T(}0gPT;3bGts6 z-sqcNTTp1>gzuQ?0Z7>)-It2Vaou6YqKuX9R`)VmPn8eqa_Mm3igx{^)}UKV9OE9% z{C-Fum$&Nbn;XMLNL*L4bUO##DsLWR1wDgSxkyF{2$$T;4_H0VQ63e=XOFI3@3`6y zV2`e=;sR%Vxv1W=ij(rq#xNQs1e%ks9%CN%>c7^{zo%3j$Cl5U9!GIlTN zJw;7UiR7M|L5LJ&(SXob;RNE3+Cv~;GL1(Zg5CHXZ2o%y3OyrQ zp(t;BVHB2R3B{4nY)|rV6=V6R!YOW7%bmXp)ANuj(+*pH04BMX-sY-uaa_o#KqRLQ zwxMT#5z<>$(;zSO`UFLo6|D;}CJvX>T?~5SzBMV-%5<%|wTeOZ+-tasAHwmF%u!pl zT_tAjwaWXk7LS*1Wj}1(CrQ5N-WOjiRLvr4kUJV(jJ}NY_yMGQhh1H=IfQRU=Ds7? z%zgrReJ_jiM4okA^pc93l#oN=U*6t6IxP0MYdgw*#E0u6E)rSJrEKU!!MSPtLP1&q z{PZ8~==e2??B|$^SNxoswT68%+|oR0PT4DVCO4i25Nv*G(XXt6rqgghP2d`z)cUw? zhYK1zCa9OzlGT2UWI8fA%%q3j?Ju;LY{(&n?1Tj@eTwVEkYGZ3(pTdpg;;^-&&HA_ z<`(f7&Tzj@<`FctR$pJ{MgJJwk0cHr{+;5i!u+rA|4Be_wXHJE!rh) z5kvBQ#X&Rhz<&$TQT|q@y8PUF1mI0qkL%zWiV%u2z>e;Lfwf_ji9UUuLn0M3b@Zt$ z1PlFLuNw27>!$~%W|e<4M{Gx^X!h-zuGpxdygsT~5ehAE}_KLN({c-;FQ>=dPu zQ?>1Cn#RWxlBDcmhmSiypQ_VT{E^*Cu!_lSfLePT{t$~BixeR9;Onfsa544Din5e@ zz9Rzl%7ZXl`Mp06JnGALa_%n_2yQ*4lva1H*k<#wlrC=Bq2tOc9`S3UZhygR3(gdD zpM_;_WY(*KA9GjTQgMPko~M5QGF+%Iw&~Cj@5CqT{z$>{aj{;m zOpRN@q2n93V}0^=lgGnYD+7|QIoY^ZEzzC_z_%xOd2hZxp72z5raKFvY+qPQ6T!?e z+aOcI!(8`Par}+ry~psrFfr}mZDv0RHucC~xR(E5n zw9tjV=iWrDe(^}SjDcCHeMAr!17usN6M|XRW#|hjcABCsJ5DN)*OsYc~xQCUkkO!V#qa7!GwV5dv(CmxQUI(AeIUl>ocler;OmXYmM9B z*M_v^?;ES z?zwTs4-g7O;$_X{uN<#*OYaVYb@p~EO{z=tee(Fod0S-5r?(Ts$MWz;k4hjwDfE>W55_-l9JBC4Kk=8d`a$c zl^#ffM!{;&_3~oxt!~B=x4Yt1&gSwV#|zbhyhA8`d2>%+g4W`z6Efbn56`X;v{t2Q zCtIeE)7L~USNbold+pS^amO)MlP$4jR34U(5FbPBu@sL{@9nM4!gouqW)|YZ21Ja0 zoV)$aYmbGG znJPMjSaP1?L&=!{i6Hvy7SctNdJHlQ>2-L;nLJ~x^oX8&->+ufEw`a!-l&T6n{(d0 zU%s0w8!VbO4S?7O_mz#-*^-eG6xl}w!!vO&s7MJBrS*+B)?2*olw5s z^YNIl&dbe#iLDte5lohIPG_QwwAbX&xQgA~uj9u0l_~xdXTU0C7uw$F)ve&Ovj6My zNDVv~^hC8+>^nPN#)x)AoseQo1qa|@8FM3Uoj*QlbuNT#y_FzDmA_>&;kIEy-We7Q zY~2zGPC;(F(}b_q6o}+bZY_k&d(N45e@anc4Q(-|Xiv&P%ndwloo-75qN?EK=^PXF zuMnhxWZ*RzASGHDrNYUBqemvDXU+VHVM4I4eMR_cB-X;;vw88OIfqdx_c$LR2q>r^ zolmhm%qHOZN9dPHKu}~0WI*oO+G*}!G}5uXUu}I(Sx^@Y3NY>|3fZ^Xc`AO+LoczH z<}9zM;a5k37TmUpH1t}kz34-Um*0}#dFIXfoe^kj$$hAbF-^j`^v8p)RmTdW77#rL zZ4oju-)WHy^=7LV-Wm5h-jn9TZE~i+9=eo%-yx+c0rIj@v8V?wC{_$vT&w&bq@9M7 zo?R0ZxQd&k?xs&1Sj#Dr+4;mtPm`&zQ%U#|Il=CdHVyb%=OlotAwV(q|Bj1&2L`Do za`ChOLoUGeFf>Kk+w>WySapQjTdvQU_zCixFwV#H?3Z8I>YH40($C-*A9m z=rcPi0czDtPefS=J!X41Uqvaj|6K4GDbsKGF^U@RC41v#2rgHzQJHLsg4{;ylHiv{ zcBB54WS&Aj5fMivIc*M-(eL{ne>z5je>G!}dL=x=HwBg&smDktC7t0#1 z+?y)9a*~DiL~Z*3S36d_`1~K@>%X|K*3CSQ_ko4^F6Dm3>Mwcr3QUGj4I93@3@5{$ znfI;)N{ZU)=WGgwe9|Ya=2Ev@c`f|mMU{RdK@!L9|CI;>xm91jg`(D|_qXK<79KfV zoyaUwQFFu_c4p|^-AQ;i^fIIRScVAa-TTT|trNWUx z#r-l>%x+1RjjrTv}zUuXZ9+K9(nctGWMv#Chx08o~>I}BN@|K>gZt_VU;vKZ{T zQp#}IvIf+j$L7%|!2bz-dibJ6RoRJ+`>OgNj$;CdjX?8cZ%8P5H2vU{_NTkmiQqnF zwMde7si*`}$5}=viSqQ$ri@1?#3*skp#jx_5g_^LY>Pn+2d()T(f5;pMfSH^D=a*$ zk_KogCD@%qWZktV4F$|*Z-VPUQ4i=TT^RT}u6s~A4NfyzO#P1l_v7^aVw-Q5V{U+5 z1xe@Dv7K}1G%de(i!LwV{%V`nKE-|}Jg>mAw#i3$rTaw(_R z__h4|Er6TX87TyNG+(&@FSQ38Cia|%xi?#nl1IZ1Jw`~0J4M3iUn8`w0wy3ku}1$o z2S3iFch?S8@Kvfb!U&%qhM8OmsS7c4w8Rfdluxx^K7ZGBr{=PLMZQU;&8>{-EQJ!M z-V1mk^_=jTqVFg6{t zw#b(4V*U@XiF@-+r1U{HH)y>_6zQq}qj{G)F8x%m)CZeY8W5#rt8u7FnylZ55}w4& z$w19dc1a^t5DC{XzHG~IDv@fxo-Dsv1(W%Eor}EK3{aLtgFI7do5{(+?o+U6-llAc z=Y1$E)l8Rmw_CucHclf-v_;lHLF_iH;CibxL^m{@D!>ll-=9TLk}o zzy4$U{@aggGP{8c;To6($w?k4v3tebCX01NoVnsF#dHZSBERgGn>$Id>Y0 zkN@+O{oB|4w=+07h8V#-Gi~!4V5WnUnrkx_8|RUO9_x z{Dqay752`VPdmSySN{G4^Ma@Z@P$K}GPnz&O=te+clysATV%Wc!^I;f-VSZ)&Oc2Z zY8Uaj%UpK%8<|NRoM?$Vj?LpNIy@j=%MpK<(rs`n0NGfO;)yZK|bsM$4cmF@1^)mU3 zD*sMriSE+VoTc44TK0oqrl)S%6We}?B->B_b(VRp?*?h2soJ9JKkk9w2ju^??S4os zLJjPCZS-Pvy=LnD(3h{a?+ksgtC$*fs`)bgGl4Bx{2Ik*LfM0lNS%VU|G1;UT=Yv! z10|dLhJSKr`Ny^i*R<9$m@4yM`dK+MJac|0-ZP6Q5j*MDQIgD=+5}!rV%uym)smwErWa=qRKdk*D*Z${T|2s|m*B@#b zM>ZUKv!B;}0HoocuuLdm_|A%?il-KXs_E`b;&7<|E6JM>u0PJI%e&>YC#RxeT9sd) zUk;+0MHj4vRu1x#nazlIOi!68zV<&n$3M>2mqVwEJR2jP!(+va#DBuvNv@_jqu}&d zFIQcD)wN?=z@F?rvI>oL$~*qAxAjfNm}v#|CIwuNv)=LlJqP>8miW&f70bQ=RI?M1 z3XBBA^fGV8zRaj3)^}FCoW_G)5`aZ>@TADL?$gl}yJ{wrBkX|`$(gB!4hhfk|9#Wx zGH<%P&Wiun2LFHm-6;}Fe<4xu5UxqoAU}Rm<)S%qbb9!OOXuo>Q6*cB875oUgAdi+ zL;o--V8gn#uLPkOD^`tH0oDpu^ZrPF>c-%w_b zJe8Af`sr@Wy;6Jam72|`BZ$RAT-kNc=rQwSDL&ZVxx~V?1)$CVULeS6Q)S96>zt#; z)%Mz7w+)AV@Xx8Ob(?tmdsxBR?^}zsqgi9#6;mpj3;GI}&MM{|BT-a4QXU6r9kuA>;ddEfT!%4{FdJ$zz3AuICZupMBus;rV7}* ze;78$t-~+t{7g%Q z{R3e1yA>PcJup!0bf61(dLdT_3yCU)3hrKeaI4x)%TG z$LS*HiMHoB!@*FI1DaInK&vypQB3~_KzjjRUmE6ye;O#b|B>)w8w#Bi6_uE6Tx`+N zl9SfzZkYY)y7k8Mx8#dvZtE0ub9LJ*r-8kw%j&xU?N}-h%(^l@;RmQZXLjFcUjWv zHGf=)z>A>=Kt!rt3DT)$fscHT45(ok#TA&6n)MfmG)JVY)`yD^k%lPyZOe-M`;=V7 zjLYY_i`=G-Fnf?6zl>1(Ma*@aJr?vw&Hn7+-GL|V(^%>AhhbtbQ?`IjRutTE|G6_o z?c&wvuA03~nY_dQBm49dwZOf;q}msiK!l{=c&6<37sA1>*43iuIIQeR&v zGK2`%O%^I@GicQb=VdmA#+OBp8Y36GN=ix1>9M1-NS>oAW zqDFHIMGSHW+M+`vy9FQeN$p(J)uF0M=2Q9^HlhW)a)-GUWX$uED zDXFQR`XwHz7lH&W@w)GwD7I(L;Lf|+nCh=&yl^r|h3M9e^60HnWC}gYCtnwehTkwa ze;>@dNPFK{s&UY2Xz86BL1bY)1gH$jS(3JA$*t4cK&0%oK=i8|w1iLKF1MppU-L;{ z+i_>$@1;qeZJ$v{_A8WMe%?r2^It2k4Vz|S#2?E0p@7~_@7Y`6(qfC?BMe&C{jH4i zZ&<3QGyQ--2S>1my2rEv4^*Nk!vv~92q)+Q8_mLgomDkcM=Owg7*oTS^s~!Kd!JTe zw;UHZK;!UvK*#~~))NL*$|21syB1EVWY8wlLWY&Mw^d+2#Zj=&Gi{dk-OB48_^NrQ zAx<~HVLT~*OgGvCuja4F*EL_4P50dh)Fs0+-9G*_{}CA6KCgiHQ3z<`S^;5ykiN== zX#wgh$04DBkJVP~cP=PUg=X=pKc!mGR_Ipq_ExxHUIdkP2E{1 zK-W`^8i7S_eXz89GX3Nl|5kTiPJFK}9bp1}9ke<-p~;FK6o^Zn$HLD8-T5^za{AMt z8>Yj{YTT!$4)_mw4P-=CdC{sD>SUom#?ow z6R)oG8LOAyUrGUbg&dl85!x@T9BsO7l|RIqN_t`UxX|FPFA# z&soMN(mvLOC(#OF>CD8O<@~>}Kd!!}LGj=Be~}d1REXh^|CaHc3JL{%2|LvrD%#59 zWxcM)GYi=pE6fReGFSji3ZoUwQQuIfF_h>o4X2skyl8)qWMYC7qnq zkN)d6QNicwm)BN01XsHom9)*RR}x!i<{^~eTq~C;eQh2Jw}q5c9hhish`o?G0!d{P0aw)Iad@uwDA>Q=EDI!sP#3gEBRiN8|ck%s-E-S6}M;SEYvPFZ;~ z@Ls~^ubVV$Pu{fS-wPCIX?^YE1SaiJ#eKE7#PB~%1eJYTXpY7zke{b`aoBB(6nL?VV#7fiFO1LVA#HFQs`q9+!IbdO3zYpNn-PvIjJw?9ikUh z1XW!bp$pv%J|yU_+GtkcIyNuN_Er-!8~uv*iSATGNB5V5a=1eVca$Ob%g_cERZveFx~gQu_oP%s&J6XC{KGRKn2>g(k~HnHiZ)Bp_PID8HnaCR ziM8LRG4NZ%w#5B#kPE#91+?j-L+2HLCqs%apX{W`DBca31~Bfwm(?t%?;ES&90(HTh4djDkg+o?+3<4i_SArN`IW|JLKe8Y;W?`a zJR5t|3#73zabGLf13mrcq6*$aliNWS$8~!lDf--X@SSl^eNu!Tw|S3h6sjs~_vt#P zWRa}Ayal$e7k}lRibT4>okSy$0&aU8*dFFi?-)hFw{KyfAwwcQK%@Q`90Er!Q+mIl z+=@2tI`>ydk_xO!kGt`-?m;g`+d)WdaYhLr@W!2hf?5nN=>^14)yPb~j4RzB*|tp$ z8M~Fm7JvlVwZR>u7@X1THFl9_xoTeuWr}jrqmlI>K(;bnG{X(Jja~Y3Go&n?g<=%i zbvR{NoNJ0J=o3ccPg{{qxu?=WZ%YA!YxHu9*U^q(q{B<%%Elc~W$i=lL4abHk4Vc)^vfuWjT$Ow@) zc`KS3S^gQOSizmdj)3>Go9S*e+mENpqH&;E&170Q)Rl45y|*dBZ}5UaWyKFmTRhMr z8#5bpmzy!0mLcQXD{Z3agiUsy&lHXN%Y)(@6mm8^oZ6m__QCS_p8 zjxB;>yyb-YMT;faDz+My;Urxh_ZYK%%tK&?eXH3^k!Kcxp@Gn|uLhS4Goa<4wBi!0 z=PU7s=L8>S-%D{8jTf9!x399wMUVO3LZ`Z0N$b>8db+Wr>o;O}Cy-xapz`55(j;J+ z^7(sZ7c@n7c}W}c5}?&ZA1+xmMeWE)sUfFvv)d^F_V$PMLwf;bIEkI6nLLE0v_CQtlkIM#VGr2PfOj}H#YNC!3Z{GfO}tVAuu^P3p1oH z0fuZZpe|LycIqP$I zRsQ_AM=wkigMWNAO_R;Q%5P43-k*}}@80Ja)D8Pu18q#Dnd9RwTvFbg>F)09#+{#`)^OnMMUe2J1oZ`lUzF58=bjy$o4f zcQ@OUf*Rirf8Vs|ib!2c7&SXVm#vt0*j`XnRl!yq}s?liV zlS^N+kWR&>SRk@q2#J4V_fF8MFnik@gP4VcOG+!7Ziw=C1Ou5YZ&B|!a?PJ=M-UOY z)G|Xz@gq@oCk3Kam^V|lR!;lyueJ*3MD;M|z^$dfd*VAK+=2^0fydu3p^P-UuEL_0 zB<+?sR~NiA5vPGjJ%r)43~nvMj9Hg6g`STN6bw0+*C|88%3oB>SF{0TwK#sYPJI8~ z_6OYkT&sF-G$DdQ74>H2qCpn(O->slbU}~n<{Y9QbKdkYjTz22y(?@OIUBam<(&)L zVbrB3vaTEN-HowaPxS2!AWjCoC2afb@b8qN@05iy>6veSf(R%OwLN0EQM(qKWWN7F zy&L2q4^SjL#|N2r2HnLX9WFy3Se$;c4YN=) zjZr4~uZYQNV;={(`pi=_V^ncmdsAfGs`#U~anmKy?jH(K?dZ=UpGQJ~JYe#1w}oGo zmpS)4hELx8LXk?K7zg~X{e_}p)K1y)PC%v|%@(Fo7lXvv@!*uBZCmTuQ^xc=#*wuyIUw!!)JOX&!z(b0N&rd0%N$?( z62^GCVoJa%&jUu^=b|F@=WI*gT#DyGRSV9wLf0o_M%TQ8k(#;N;`oiIgE%S*_A}hPw*O|(YRQF6q%xrmb$K>1C9-s7e6hl3Nvw^a8|GWo_6~DBrBafKnEO`mL zDvxqbb}pTB2$A~>Nztax9GXm_bV>lh6faQI|U`F80WyBz8Z}YxR z%OzIMc`iFD2UvBv*ZUj@nYnGhPn5M;}z@6Vx3EpS*pB?*cZI4H~1%XT@9o-*Us)4pD_i&OQeWcAZX z*HRE8dk#Ty!iann{c)^r9Lx>hf$-5|LsNjf#9Z zPl!+5PMfoYH+Dw8=kirp`_Lg$4zEHg2lgiK&N01^uyR3SGHfBo(kE)4a+UHuN=}|S z8mf&s!4x~as5oO^w)XRz)>F+=qk;$0O4agHU*_=7Ig=wCz8CASjJa_L2f3EJ>S$k= z3K_|LX}d9!ZkKZ}flq0~f?E})54jxzQv&4bQ^pfHqEYf8aI*Y-^TaCcbwTnhhE&Hm zQa>9h7v3r@e{9%7Yd zDWw7$yzFd71@)GBDdzvq|cMvqrtpxA@InqMN4u@eu_XU_Z zGFxM+6BR!L<-QPiS|t~4xBw_$s3EG#0%%%( zk4)B{93bJJQa#&S?Dn_eJm}or&8h6MvHZjS9&ln&*}Ntd%*ByD;~4m?Trf_suxnxx z=#C?Vyb*S3GGe~rU#+v<_ME6t$W7dxf!xbOYRg8B#z8;C=r+*Zx;ah+shWLt@!!Q2r)s-rdw8Cf&evGjErr$$8C+? zayOx0Kt=oU#Nzk$ml${eBpAYO6b{@YMmF0-11o*ZJ?c1$8Pv;CW6eUZ)gJ>(@xIFk zFps*DYLYp}q61#b`#oXGSR#3DJpCA^z=h@EWIu(d)VKGTW3rbuUeqeiC*P47s<1^;_f&lca;9 zQA2z#rZt{yQRS{Z4Uog@D;v$o^@IMZ6svI}{#|X_M~e9}1LtxEzu93@+VE;` zqk;}{ix0+m5A5%|?>Ci(0Pb=^YTcH;=@F$k39VWRENy@XT&JdCMgoP&lm10}eAN)c zDzim5w8u3#+zuDyCpe>}!kvr?+wyq|1KMNT^DPS=N)sEo&WHnHGl4o~O(9g~7eEy7_( zW&Yg^0{pF->a;6l?%1K#V?={7gHZjox6DQ;7fI=Ogd*$8`IZZDEH|pWn!7@|$q$Fb6<-j()@7voDph_ROhEw|OwAdraRU_G??-^u-1DC~X9NG*GdOZ$R z-gO<}DhTJ0M~4-Z$2M$E#l1~|Cu48sEw2>-5Nr1m{ruX2Ka*V6%WCB6|6%Vt!T~z1Kebdd~iN z?{ogFhZUG{mNCcp#{0dcDh4g2Ykwmw^KYUdy2znJJ>Mi0Z zdjof6$NpM9ZP&RgRH$M#N#-YYbB#0|p^P6K19psqnfTmt^JOkMvaGMfPNW+EZ_jJz zwRgbQazzltYW#5_FbrOqWcAw9NO3#hZJ{eijdZyFtPj0UL8bBM=BJs;eCSfG_vEUj ze^-j^sgEn`c8e8YaFN>0dNkJUQohm3aAMeE`~hk$nE3!}Xe6 zy{7Y+cE+HkC4k<8^Atwii8dYe2SRr*q+x=;s)0?((eU*&AL)a7PT%OCVg=h*!>m#&9AR$F_4NY#bS zr=*Oeq@=JUOlzlMQc_b_78V={TLmrrhp9|{UAFb3?sN1ty!dLIon;dq6m`utLh@1k zz1?L5X)hdvI22Dq#^Wq>Ur$Ecen%d52CO%0?`{Dm{{kf$A}><)UZx_fP9!b&Y%8R$g2`PV!uH6v|EQ&}uUbX&dI%eet=lF3_JAUTQ=i zj!&GApCl`4A65YVfadEm$zQA)557bzwU_9-;Ek*$`r<$8EIa9hVRNyC2bL56fFh6lBEmU&DR?Y1(C zojZ@Up^nIHbspP!iFGS5Dl>WEa8Qo8(N(C7Xi%mM241g|!O41+d&Zn2JH1zyB)6Now~Uw#8$Fld`4gP z7M8Zo^rc57ah?IH5nq_tSkp^XovLYF-2K*ahW07RyV`qi@VK38KmC^;(VTVZ{Uujt zc+%IB$b3^&&!`$@c}|+QkjT@<>pJv0ZBjWECrIbdDw znm&D$e|1D|;Vg7(C#JSez;;9q9+SK$3ZT{774fUgwpUtlv4Y zL>qJf%i&Hdds3D*4Blc<9dOfE8wN{ZXLp5hNnPn#l zO!enkoiAMYrKx_5&a=)1!NMmWf^1oe)I8H!lYKaKA z7zLl2HkL!6wC6OJU$yg=Ar`P88Thw5!uDO!(#K!34OW%x0-N37*?{k~%u;>aZ_IZ$ zxQdW!`2c7F5!O#9gn;3-0_1(Nh;=DR9nw~4AfC)8^yvo#Yv-noEbmyt_2K52=#!UO*Ul}4aHyI9sqdZjRhS1>x zEPAyq(N+UrFL`|nDts-teW{;xjqkl~rjI*;xYaGKYNp})MU46==eHcTT1IznwP|(A z5r=yGP*wCJ74givXwexfM1lmS+&;}bwuLqES$Fq$otYN?dl?n?3)y$Qd7AiF?#Dlx zs=ZVV_mYmjicS_M%%*S5aj>V^0gd@e;|S~-42C@@!w=~>(sCZ5yCg6?*G@SB<;1{s zD}V2%hLW~c7&K3!MPa=30+rHr+)s;pPBMvgXt{SCv@-AjXdEY^*+ih>AW4D)b0#A6kx6f!a-jT84QqyuLwS?V= zB|2x-jOQIQ#>~OfaY50zTe{NjE>$cSqo48T)q1&)*~^SVTbcE{@k&zha>fr z_<)Vrb_j!B`=VoPV<-*CYgZ?EgRHc?RU`kxGNZ9kt9$UjxwWV={NaE2O49vH#4jnZ z!!*Y%y4tEb3lB1gVT(oWr7egtzf2lQjvabc2;7OPJ&v1>(<0TJ>w~;40_&o9M-NdA z(db#IwoK*gmL`=~13SzRv|z@wu37@!Ng|%1ZEI8*w*q_Ov8gOer z7FU%2Jvqt26bIaYZYM8d7Yo1DJc(7U0IKvM$WtY5EqT6_z=K+^-RXFw`R95!lucl2 z{$r@)gqmynOy~a6H+6>dwyXhOYZAieR%

^=bgQQ8rU&C5>o9;i@c_pDP&+ku$~&j@GJ3ZS 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 literal 0 HcmV?d00001 diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/highlight/highlight.min.js b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/highlight/highlight.min.js new file mode 100644 index 00000000..dcbbb4c7 --- /dev/null +++ b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/highlight/highlight.min.js @@ -0,0 +1,2 @@ +/*! highlight.js v9.13.1 | BSD3 License | git.io/hljslicense */ +!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs}))}(function(e){function n(e){return e.replace(/&/g,"&").replace(//g,">")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0===t.index}function a(e){return k.test(e)}function i(e){var n,t,r,i,o=e.className+" ";if(o+=e.parentNode?e.parentNode.className:"",t=M.exec(o))return w(t[1])?t[1]:"no-highlight";for(o=o.split(/\s+/),n=0,r=o.length;r>n;n++)if(i=o[n],a(i)||w(i))return i}function o(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function c(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3===i.nodeType?a+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:a,node:i}));return a}(e,0),n}function u(e,r,a){function i(){return e.length&&r.length?e[0].offset!==r[0].offset?e[0].offset"}function c(e){l+=""}function u(e){("start"===e.event?o:c)(e.node)}for(var s=0,l="",f=[];e.length||r.length;){var g=i();if(l+=n(a.substring(s,g[0].offset)),s=g[0].offset,g===e){f.reverse().forEach(c);do u(g.splice(0,1)[0]),g=i();while(g===e&&g.length&&g[0].offset===s);f.reverse().forEach(o)}else"start"===g[0].event?f.push(g[0].node):f.pop(),u(g.splice(0,1)[0])}return l+n(a.substr(s))}function s(e){return e.v&&!e.cached_variants&&(e.cached_variants=e.v.map(function(n){return o(e,{v:null},n)})),e.cached_variants||e.eW&&[o(e)]||[e]}function l(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),"m"+(e.cI?"i":"")+(r?"g":""))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var o={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(" ").forEach(function(e){var t=e.split("|");o[t[0]]=[n,t[1]?Number(t[1]):1]})};"string"==typeof a.k?c("keyword",a.k):B(a.k).forEach(function(e){c(e,a.k[e])}),a.k=o}a.lR=t(a.l||/\w+/,!0),i&&(a.bK&&(a.b="\\b("+a.bK.split(" ").join("|")+")\\b"),a.b||(a.b=/\B|\b/),a.bR=t(a.b),a.endSameAsBegin&&(a.e=a.b),a.e||a.eW||(a.e=/\B|\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||"",a.eW&&i.tE&&(a.tE+=(a.e?"|":"")+i.tE)),a.i&&(a.iR=t(a.i)),null==a.r&&(a.r=1),a.c||(a.c=[]),a.c=Array.prototype.concat.apply([],a.c.map(function(e){return s("self"===e?a:e)})),a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var u=a.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=u.length?t(u.join("|"),!0):{exec:function(){return null}}}}r(e)}function f(e,t,a,i){function o(e){return new RegExp(e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")}function c(e,n){var t,a;for(t=0,a=n.c.length;a>t;t++)if(r(n.c[t].bR,e))return n.c[t].endSameAsBegin&&(n.c[t].eR=o(n.c[t].bR.exec(e)[0])),n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function s(e,n){return!a&&r(n.iR,e)}function p(e,n){var t=R.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function d(e,n,t,r){var a=r?"":j.classPrefix,i='',i+n+o}function h(){var e,t,r,a;if(!E.k)return n(k);for(a="",t=0,E.lR.lastIndex=0,r=E.lR.exec(k);r;)a+=n(k.substring(t,r.index)),e=p(E,r),e?(M+=e[1],a+=d(e[0],n(r[0]))):a+=n(r[0]),t=E.lR.lastIndex,r=E.lR.exec(k);return a+n(k.substr(t))}function b(){var e="string"==typeof E.sL;if(e&&!L[E.sL])return n(k);var t=e?f(E.sL,k,!0,B[E.sL]):g(k,E.sL.length?E.sL:void 0);return E.r>0&&(M+=t.r),e&&(B[E.sL]=t.top),d(t.language,t.value,!1,!0)}function v(){y+=null!=E.sL?b():h(),k=""}function m(e){y+=e.cN?d(e.cN,"",!0):"",E=Object.create(e,{parent:{value:E}})}function N(e,n){if(k+=e,null==n)return v(),0;var t=c(n,E);if(t)return t.skip?k+=n:(t.eB&&(k+=n),v(),t.rB||t.eB||(k=n)),m(t,n),t.rB?0:n.length;var r=u(E,n);if(r){var a=E;a.skip?k+=n:(a.rE||a.eE||(k+=n),v(),a.eE&&(k=n));do E.cN&&(y+=I),E.skip||E.sL||(M+=E.r),E=E.parent;while(E!==r.parent);return r.starts&&(r.endSameAsBegin&&(r.starts.eR=r.eR),m(r.starts,"")),a.rE?0:n.length}if(s(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"")+'"');return k+=n,n.length||1}var R=w(e);if(!R)throw new Error('Unknown language: "'+e+'"');l(R);var x,E=i||R,B={},y="";for(x=E;x!==R;x=x.parent)x.cN&&(y=d(x.cN,"",!0)+y);var k="",M=0;try{for(var C,A,S=0;;){if(E.t.lastIndex=S,C=E.t.exec(t),!C)break;A=N(t.substring(S,C.index),C[0]),S=C.index+A}for(N(t.substr(S)),x=E;x.parent;x=x.parent)x.cN&&(y+=I);return{r:M,value:y,language:e,top:E}}catch(O){if(O.message&&-1!==O.message.indexOf("Illegal"))return{r:0,value:n(t)};throw O}}function g(e,t){t=t||j.languages||B(L);var r={r:0,value:n(e)},a=r;return t.filter(w).filter(x).forEach(function(n){var t=f(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}),a.language&&(r.second_best=a),r}function p(e){return j.tabReplace||j.useBR?e.replace(C,function(e,n){return j.useBR&&"\n"===e?"
":j.tabReplace?n.replace(/\t/g,j.tabReplace):""}):e}function d(e,n,t){var r=n?y[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}function h(e){var n,t,r,o,s,l=i(e);a(l)||(j.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div"),n.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")):n=e,s=n.textContent,r=l?f(l,s,!0):g(s),t=c(n),t.length&&(o=document.createElementNS("http://www.w3.org/1999/xhtml","div"),o.innerHTML=r.value,r.value=u(t,c(o),s)),r.value=p(r.value),e.innerHTML=r.value,e.className=d(e.className,l,r.language),e.result={language:r.language,re:r.r},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.r}))}function b(e){j=o(j,e)}function v(){if(!v.called){v.called=!0;var e=document.querySelectorAll("pre code");E.forEach.call(e,h)}}function m(){addEventListener("DOMContentLoaded",v,!1),addEventListener("load",v,!1)}function N(n,t){var r=L[n]=t(e);r.aliases&&r.aliases.forEach(function(e){y[e]=n})}function R(){return B(L)}function w(e){return e=(e||"").toLowerCase(),L[e]||L[y[e]]}function x(e){var n=w(e);return n&&!n.disableAutodetect}var E=[],B=Object.keys,L={},y={},k=/^(no-?highlight|plain|text)$/i,M=/\blang(?:uage)?-([\w-]+)\b/i,C=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,I="
",j={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};return e.highlight=f,e.highlightAuto=g,e.fixMarkup=p,e.highlightBlock=h,e.configure=b,e.initHighlighting=v,e.initHighlightingOnLoad=m,e.registerLanguage=N,e.listLanguages=R,e.getLanguage=w,e.autoDetection=x,e.inherit=o,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},e.C=function(n,t,r){var a=e.inherit({cN:"comment",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),a},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e.METHOD_GUARD={b:"\\.\\s*"+e.UIR,r:0},e});hljs.registerLanguage("bash",function(e){var t={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},s={cN:"string",b:/"/,e:/"/,c:[e.BE,t,{cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]}]},a={cN:"string",b:/'/,e:/'/};return{aliases:["sh","zsh"],l:/\b-?[a-z\._]+\b/,k:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"meta",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:!0,c:[e.inherit(e.TM,{b:/\w[\w\d_]*/})],r:0},e.HCM,s,a,t]}});hljs.registerLanguage("dockerfile",function(e){return{aliases:["docker"],cI:!0,k:"from maintainer expose env arg user onbuild stopsignal",c:[e.HCM,e.ASM,e.QSM,e.NM,{bK:"run cmd entrypoint volume add copy workdir label healthcheck shell",starts:{e:/[^\\]\n/,sL:"bash"}}],i:")?[^\s\(]+(\s+[^\s\(]+)\s*=/,r:5,c:[{b:e.UIR+"\\s*\\(",rB:!0,r:0,c:[e.UTM]},{cN:"type",b://,k:"reified",r:0},{cN:"params",b:/\(/,e:/\)/,endsParent:!0,k:t,r:0,c:[{b:/:/,e:/[=,\/]/,eW:!0,c:[{cN:"type",b:e.UIR},e.CLCM,e.CBCM],r:0},e.CLCM,e.CBCM,s,l,c,e.CNM]},e.CBCM]},{cN:"class",bK:"class interface trait",e:/[:\{(]|$/,eE:!0,i:"extends implements",c:[{bK:"public protected internal private constructor"},e.UTM,{cN:"type",b://,eB:!0,eE:!0,r:0},{cN:"type",b:/[,:]\s*/,e:/[<\(,]|$/,eB:!0,rE:!0},s,l]},c,{cN:"meta",b:"^#!/usr/bin/env",e:"$",i:"\n"},o]}});hljs.registerLanguage("java",function(e){var a="[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*",t=a+"(<"+a+"(\\s*,\\s*"+a+")*>)?",r="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",s="\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",c={cN:"number",b:s,r:0};return{aliases:["jsp"],k:r,i:/<\/|#/,c:[e.C("/\\*\\*","\\*/",{r:0,c:[{b:/\w+@/,r:0},{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:"class",bK:"class interface",e:/[{;=]/,eE:!0,k:"class interface",i:/[:"\[\]]/,c:[{bK:"extends implements"},e.UTM]},{bK:"new throw return else",r:0},{cN:"function",b:"("+t+"\\s+)+"+e.UIR+"\\s*\\(",rB:!0,e:/[{;=]/,eE:!0,k:r,c:[{b:e.UIR+"\\s*\\(",rB:!0,r:0,c:[e.UTM]},{cN:"params",b:/\(/,e:/\)/,k:r,r:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},c,{cN:"meta",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("xml",function(s){var e="[A-Za-z0-9\\._:-]+",t={eW:!0,i:/`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist"],cI:!0,c:[{cN:"meta",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},s.C("",{r:10}),{b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"meta",b:/<\?xml/,e:/\?>/,r:10},{b:/<\?(php)?/,e:/\?>/,sL:"php",c:[{b:"/\\*",e:"\\*/",skip:!0},{b:'b"',e:'"',skip:!0},{b:"b'",e:"'",skip:!0},s.inherit(s.ASM,{i:null,cN:null,c:null,skip:!0}),s.inherit(s.QSM,{i:null,cN:null,c:null,skip:!0})]},{cN:"tag",b:"|$)",e:">",k:{name:"style"},c:[t],starts:{e:"",rE:!0,sL:["css","xml"]}},{cN:"tag",b:"|$)",e:">",k:{name:"script"},c:[t],starts:{e:"",rE:!0,sL:["actionscript","javascript","handlebars","xml"]}},{cN:"tag",b:"",c:[{cN:"name",b:/[^\/><\s]+/,r:0},t]}]}});hljs.registerLanguage("properties",function(r){var t="[ \\t\\f]*",e="[ \\t\\f]+",s="("+t+"[:=]"+t+"|"+e+")",n="([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",a="([^\\\\:= \\t\\f\\n]|\\\\.)+",c={e:s,r:0,starts:{cN:"string",e:/$/,r:0,c:[{b:"\\\\\\n"}]}};return{cI:!0,i:/\S/,c:[r.C("^\\s*[!#]","$"),{b:n+s,rB:!0,c:[{cN:"attr",b:n,endsParent:!0,r:0}],starts:c},{b:a+s,rB:!0,r:0,c:[{cN:"meta",b:a,endsParent:!0,r:0}],starts:c},{cN:"attr",r:0,b:a+t+"$"}]}});hljs.registerLanguage("diff",function(e){return{aliases:["patch"],c:[{cN:"meta",r:10,v:[{b:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{b:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{b:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{cN:"comment",v:[{b:/Index: /,e:/$/},{b:/={3,}/,e:/$/},{b:/^\-{3}/,e:/$/},{b:/^\*{3} /,e:/$/},{b:/^\+{3}/,e:/$/},{b:/\*{5}/,e:/\*{5}$/}]},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"addition",b:"^\\!",e:"$"}]}});hljs.registerLanguage("shell",function(s){return{aliases:["console"],c:[{cN:"meta",b:"^\\s{0,3}[\\w\\d\\[\\]()@-]*[>%$#]",starts:{e:"$",sL:"bash"}}]}});hljs.registerLanguage("asciidoc",function(e){return{aliases:["adoc"],c:[e.C("^/{4,}\\n","\\n/{4,}$",{r:10}),e.C("^//","$",{r:0}),{cN:"title",b:"^\\.\\w.*$"},{b:"^[=\\*]{4,}\\n",e:"\\n^[=\\*]{4,}$",r:10},{cN:"section",r:10,v:[{b:"^(={1,5}) .+?( \\1)?$"},{b:"^[^\\[\\]\\n]+?\\n[=\\-~\\^\\+]{2,}$"}]},{cN:"meta",b:"^:.+?:",e:"\\s",eE:!0,r:10},{cN:"meta",b:"^\\[.+?\\]$",r:0},{cN:"quote",b:"^_{4,}\\n",e:"\\n_{4,}$",r:10},{cN:"code",b:"^[\\-\\.]{4,}\\n",e:"\\n[\\-\\.]{4,}$",r:10},{b:"^\\+{4,}\\n",e:"\\n\\+{4,}$",c:[{b:"<",e:">",sL:"xml",r:0}],r:10},{cN:"bullet",b:"^(\\*+|\\-+|\\.+|[^\\n]+?::)\\s+"},{cN:"symbol",b:"^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\s+",r:10},{cN:"strong",b:"\\B\\*(?![\\*\\s])",e:"(\\n{2}|\\*)",c:[{b:"\\\\*\\w",r:0}]},{cN:"emphasis",b:"\\B'(?!['\\s])",e:"(\\n{2}|')",c:[{b:"\\\\'\\w",r:0}],r:0},{cN:"emphasis",b:"_(?![_\\s])",e:"(\\n{2}|_)",r:0},{cN:"string",v:[{b:"``.+?''"},{b:"`.+?'"}]},{cN:"code",b:"(`.+?`|\\+.+?\\+)",r:0},{cN:"code",b:"^[ \\t]",e:"$",r:0},{b:"^'{3,}[ \\t]*$",r:10},{b:"(link:)?(http|https|ftp|file|irc|image:?):\\S+\\[.*?\\]",rB:!0,c:[{b:"(link|image:?):",r:0},{cN:"link",b:"\\w",e:"[^\\[]+",r:0},{cN:"string",b:"\\[",e:"\\]",eB:!0,eE:!0,r:0}],r:10}]}});hljs.registerLanguage("aspectj",function(e){var t="false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else extends implements break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws privileged aspectOf adviceexecution proceed cflowbelow cflow initialization preinitialization staticinitialization withincode target within execution getWithinTypeName handler thisJoinPoint thisJoinPointStaticPart thisEnclosingJoinPointStaticPart declare parents warning error soft precedence thisAspectInstance",i="get set args call";return{k:t,i:/<\/|#/,c:[e.C("/\\*\\*","\\*/",{r:0,c:[{b:/\w+@/,r:0},{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:"class",bK:"aspect",e:/[{;=]/,eE:!0,i:/[:;"\[\]]/,c:[{bK:"extends implements pertypewithin perthis pertarget percflowbelow percflow issingleton"},e.UTM,{b:/\([^\)]*/,e:/[)]+/,k:t+" "+i,eE:!1}]},{cN:"class",bK:"class interface",e:/[{;=]/,eE:!0,r:0,k:"class interface",i:/[:"\[\]]/,c:[{bK:"extends implements"},e.UTM]},{bK:"pointcut after before around throwing returning",e:/[)]/,eE:!1,i:/["\[\]]/,c:[{b:e.UIR+"\\s*\\(",rB:!0,c:[e.UTM]}]},{b:/[:]/,rB:!0,e:/[{;]/,r:0,eE:!1,k:t,i:/["\[\]]/,c:[{b:e.UIR+"\\s*\\(",k:t+" "+i,r:0},e.QSM]},{bK:"new throw",r:0},{cN:"function",b:/\w+ +\w+(\.)?\w+\s*\([^\)]*\)\s*((throws)[\w\s,]+)?[\{;]/,rB:!0,e:/[{;=]/,k:t,eE:!0,c:[{b:e.UIR+"\\s*\\(",rB:!0,r:0,c:[e.UTM]},{cN:"params",b:/\(/,e:/\)/,r:0,k:t,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},e.CNM,{cN:"meta",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("gradle",function(e){return{cI:!0,k:{keyword:"task project allprojects subprojects artifacts buildscript configurations dependencies repositories sourceSets description delete from into include exclude source classpath destinationDir includes options sourceCompatibility targetCompatibility group flatDir doLast doFirst flatten todir fromdir ant def abstract break case catch continue default do else extends final finally for if implements instanceof native new private protected public return static switch synchronized throw throws transient try volatile while strictfp package import false null super this true antlrtask checkstyle codenarc copy boolean byte char class double float int interface long short void compile runTime file fileTree abs any append asList asWritable call collect compareTo count div dump each eachByte eachFile eachLine every find findAll flatten getAt getErr getIn getOut getText grep immutable inject inspect intersect invokeMethods isCase join leftShift minus multiply newInputStream newOutputStream newPrintWriter newReader newWriter next plus pop power previous print println push putAt read readBytes readLines reverse reverseEach round size sort splitEachLine step subMap times toInteger toList tokenize upto waitForOrKill withPrintWriter withReader withStream withWriter withWriterAppend write writeLine"},c:[e.CLCM,e.CBCM,e.ASM,e.QSM,e.NM,e.RM]}});hljs.registerLanguage("json",function(e){var i={literal:"true false null"},n=[e.QSM,e.CNM],r={e:",",eW:!0,eE:!0,c:n,k:i},t={b:"{",e:"}",c:[{cN:"attr",b:/"/,e:/"/,c:[e.BE],i:"\\n"},e.inherit(r,{b:/:/})],i:"\\S"},c={b:"\\[",e:"\\]",c:[e.inherit(r)],i:"\\S"};return n.splice(n.length,0,t,c),{c:n,k:i,i:"\\S"}});hljs.registerLanguage("sql",function(e){var t=e.C("--","$");return{cI:!0,i:/[<>{}*]/,c:[{bK:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment with",e:/;/,eW:!0,l:/[\w\.]+/,k:{keyword:"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias allocate allow alter always analyze ancillary and any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second section securefile security seed segment select self sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null unknown",built_in:"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp varchar varying void"},c:[{cN:"string",b:"'",e:"'",c:[e.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[e.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[e.BE]},e.CNM,e.CBCM,t,e.HCM]},e.CBCM,t,e.HCM]}});hljs.registerLanguage("go",function(e){var t={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",literal:"true false iota nil",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{aliases:["golang"],k:t,i:"",rB:!0,e:"\\s*=>",c:[{cN:"params",v:[{b:r},{b:/\(\s*\)/},{b:/\(/,e:/\)/,eB:!0,eE:!0,k:t,c:s}]}]},{b://,sL:"xml",c:[{b:/<\w+\s*\/>/,skip:!0},{b:/<\w+/,e:/(\/\w+|\w+\/)>/,skip:!0,c:[{b:/<\w+\s*\/>/,skip:!0},"self"]}]}],r:0},{cN:"function",bK:"function",e:/\{/,eE:!0,c:[e.inherit(e.TM,{b:r}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,c:s}],i:/\[|%/},{b:/\$[(.]/},e.METHOD_GUARD,{cN:"class",bK:"class",e:/[{;=]/,eE:!0,i:/[:"\[\]]/,c:[{bK:"extends"},e.UTM]},{bK:"constructor",e:/\{/,eE:!0}],i:/#(?!!)/}}); \ No newline at end of file diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/highlight/styles/atom-one-light.min.css b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/highlight/styles/atom-one-light.min.css new file mode 100644 index 00000000..d5bd1d2a --- /dev/null +++ b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/highlight/styles/atom-one-light.min.css @@ -0,0 +1,96 @@ +/* + +Atom One Light by Daniel Gamage +Original One Light Syntax theme from https://github.com/atom/one-light-syntax + +base: #fafafa +mono-1: #383a42 +mono-2: #686b77 +mono-3: #a0a1a7 +hue-1: #0184bb +hue-2: #4078f2 +hue-3: #a626a4 +hue-4: #50a14f +hue-5: #e45649 +hue-5-2: #c91243 +hue-6: #986801 +hue-6-2: #c18401 + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + color: #383a42; + background: #fafafa; +} + +.hljs-comment, +.hljs-quote { + color: #a0a1a7; + font-style: italic; +} + +.hljs-doctag, +.hljs-keyword, +.hljs-formula { + color: #a626a4; +} + +.hljs-section, +.hljs-name, +.hljs-selector-tag, +.hljs-deletion, +.hljs-subst { + color: #e45649; +} + +.hljs-literal { + color: #0184bb; +} + +.hljs-string, +.hljs-regexp, +.hljs-addition, +.hljs-attribute, +.hljs-meta-string { + color: #50a14f; +} + +.hljs-built_in, +.hljs-class .hljs-title { + color: #c18401; +} + +.hljs-attr, +.hljs-variable, +.hljs-template-variable, +.hljs-type, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-number { + color: #986801; +} + +.hljs-symbol, +.hljs-bullet, +.hljs-link, +.hljs-meta, +.hljs-selector-id, +.hljs-title { + color: #4078f2; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-link { + text-decoration: underline; +} diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/highlight/styles/github-gist.css b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/highlight/styles/github-gist.css new file mode 100644 index 00000000..2706084a --- /dev/null +++ b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/highlight/styles/github-gist.css @@ -0,0 +1,79 @@ +/** + * GitHub Gist Theme + * Author : Anthony Attard - https://github.com/AnthonyAttard + * Author : Louis Barranqueiro - https://github.com/LouisBarranqueiro + */ + +.hljs { + display: block; + background: white; + padding: 0.5em; + color: #333333; + overflow-x: auto; +} + +.hljs-comment, +.hljs-meta { + color: #969896; +} + +.hljs-variable, +.hljs-template-variable, +.hljs-strong, +.hljs-emphasis, +.hljs-quote { + color: #df5000; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-type { + color: #d73a49; +} + +.hljs-literal, +.hljs-symbol, +.hljs-bullet, +.hljs-attribute { + color: #0086b3; +} + +.hljs-section, +.hljs-name { + color: #63a35c; +} + +.hljs-tag { + color: #333333; +} + +.hljs-title, +.hljs-attr, +.hljs-selector-id, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #6f42c1; +} + +.hljs-addition { + color: #55a532; + background-color: #eaffea; +} + +.hljs-deletion { + color: #bd2c00; + background-color: #ffecec; +} + +.hljs-link { + text-decoration: underline; +} + +.hljs-number { + color: #005cc5; +} + +.hljs-string { + color: #032f62; +} diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/highlight/styles/github.min.css b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/highlight/styles/github.min.css new file mode 100644 index 00000000..791932b8 --- /dev/null +++ b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/highlight/styles/github.min.css @@ -0,0 +1,99 @@ +/* + +github.com style (c) Vasily Polovnyov + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + color: #333; + background: #f8f8f8; +} + +.hljs-comment, +.hljs-quote { + color: #998; + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-subst { + color: #333; + font-weight: bold; +} + +.hljs-number, +.hljs-literal, +.hljs-variable, +.hljs-template-variable, +.hljs-tag .hljs-attr { + color: #008080; +} + +.hljs-string, +.hljs-doctag { + color: #d14; +} + +.hljs-title, +.hljs-section, +.hljs-selector-id { + color: #900; + font-weight: bold; +} + +.hljs-subst { + font-weight: normal; +} + +.hljs-type, +.hljs-class .hljs-title { + color: #458; + font-weight: bold; +} + +.hljs-tag, +.hljs-name, +.hljs-attribute { + color: #000080; + font-weight: normal; +} + +.hljs-regexp, +.hljs-link { + color: #009926; +} + +.hljs-symbol, +.hljs-bullet { + color: #990073; +} + +.hljs-built_in, +.hljs-builtin-name { + color: #0086b3; +} + +.hljs-meta { + color: #999; + font-weight: bold; +} + +.hljs-deletion { + background: #fdd; +} + +.hljs-addition { + background: #dfd; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/highlight/styles/googlecode.css b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/highlight/styles/googlecode.css new file mode 100644 index 00000000..0cf18a04 --- /dev/null +++ b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/highlight/styles/googlecode.css @@ -0,0 +1,89 @@ +/* + +Google Code style (c) Aahan Krish + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: white; + color: black; +} + +.hljs-comment, +.hljs-quote { + color: #800; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-section, +.hljs-title, +.hljs-name { + color: #008; +} + +.hljs-variable, +.hljs-template-variable { + color: #660; +} + +.hljs-string, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-regexp { + color: #080; +} + +.hljs-literal, +.hljs-symbol, +.hljs-bullet, +.hljs-meta, +.hljs-number, +.hljs-link { + color: #066; +} + +.hljs-title, +.hljs-doctag, +.hljs-type, +.hljs-attr, +.hljs-built_in, +.hljs-builtin-name, +.hljs-params { + color: #606; +} + +.hljs-attribute, +.hljs-subst { + color: #000; +} + +.hljs-formula { + background-color: #eee; + font-style: italic; +} + +.hljs-selector-id, +.hljs-selector-class { + color: #9B703F +} + +.hljs-addition { + background-color: #baeeba; +} + +.hljs-deletion { + background-color: #ffc8bd; +} + +.hljs-doctag, +.hljs-strong { + font-weight: bold; +} + +.hljs-emphasis { + font-style: italic; +} diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/highlight/styles/solarized-light.min.css b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/highlight/styles/solarized-light.min.css new file mode 100644 index 00000000..fdcfcc72 --- /dev/null +++ b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/highlight/styles/solarized-light.min.css @@ -0,0 +1,84 @@ +/* + +Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #fdf6e3; + color: #657b83; +} + +.hljs-comment, +.hljs-quote { + color: #93a1a1; +} + +/* Solarized Green */ +.hljs-keyword, +.hljs-selector-tag, +.hljs-addition { + color: #859900; +} + +/* Solarized Cyan */ +.hljs-number, +.hljs-string, +.hljs-meta .hljs-meta-string, +.hljs-literal, +.hljs-doctag, +.hljs-regexp { + color: #2aa198; +} + +/* Solarized Blue */ +.hljs-title, +.hljs-section, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #268bd2; +} + +/* Solarized Yellow */ +.hljs-attribute, +.hljs-attr, +.hljs-variable, +.hljs-template-variable, +.hljs-class .hljs-title, +.hljs-type { + color: #b58900; +} + +/* Solarized Orange */ +.hljs-symbol, +.hljs-bullet, +.hljs-subst, +.hljs-meta, +.hljs-meta .hljs-keyword, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-link { + color: #cb4b16; +} + +/* Solarized Red */ +.hljs-built_in, +.hljs-deletion { + color: #dc322f; +} + +.hljs-formula { + background: #eee8d5; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/toc.js b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/toc.js new file mode 100644 index 00000000..0b6fcd65 --- /dev/null +++ b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/toc.js @@ -0,0 +1,80 @@ +var toctitle = document.getElementById('toctitle'); +var path = window.location.pathname; +if (toctitle != null) { + var oldtoc = toctitle.nextElementSibling; + var newtoc = document.createElement('div'); + newtoc.setAttribute('id', 'tocbot'); + newtoc.setAttribute('class', 'js-toc desktop-toc'); + oldtoc.setAttribute('class', 'mobile-toc'); + oldtoc.parentNode.appendChild(newtoc); + tocbot.init({ + contentSelector: '#content', + headingSelector: 'h1, h2, h3, h4, h5', + positionFixedSelector: 'body', + fixedSidebarOffset: 90, + smoothScroll: false + }); + if (!path.endsWith("index.html") && !path.endsWith("/")) { + var link = document.createElement("a"); + if (document.getElementById('index-link')) { + indexLinkElement = document.querySelector('#index-link > p > a'); + linkHref = indexLinkElement.getAttribute("href"); + link.setAttribute("href", linkHref); + } else { + link.setAttribute("href", "index.html"); + } + link.innerHTML = " Back to index"; + var block = document.createElement("div"); + block.setAttribute('class', 'back-action'); + block.appendChild(link); + var toc = document.getElementById('toc'); + var next = document.getElementById('toctitle').nextElementSibling; + toc.insertBefore(block, next); + } +} + +var headerHtml = '

'; + +var header = document.createElement("div"); +header.innerHTML = headerHtml; +document.body.insertBefore(header, document.body.firstChild); diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/tocbot/tocbot.css b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/tocbot/tocbot.css new file mode 100644 index 00000000..0632de23 --- /dev/null +++ b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/tocbot/tocbot.css @@ -0,0 +1 @@ +.toc{overflow-y:auto}.toc>.toc-list{overflow:hidden;position:relative}.toc>.toc-list li{list-style:none}.toc-list{margin:0;padding-left:10px}a.toc-link{color:currentColor;height:100%}.is-collapsible{max-height:1000px;overflow:hidden;transition:all 300ms ease-in-out}.is-collapsed{max-height:0}.is-position-fixed{position:fixed !important;top:0}.is-active-link{font-weight:700}.toc-link::before{background-color:#EEE;content:' ';display:inline-block;height:inherit;left:0;margin-top:-1px;position:absolute;width:2px}.is-active-link::before{background-color:#54BC4B} diff --git a/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/tocbot/tocbot.min.js b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/tocbot/tocbot.min.js new file mode 100644 index 00000000..943d8fdb --- /dev/null +++ b/spring-cloud-stream-binder-kafka/3.0.6.RELEASE/reference/htmlsingle/js/tocbot/tocbot.min.js @@ -0,0 +1 @@ +!function(e){function t(o){if(n[o])return n[o].exports;var l=n[o]={i:o,l:!1,exports:{}};return e[o].call(l.exports,l,l.exports,t),l.l=!0,l.exports}var n={};t.m=e,t.c=n,t.d=function(e,n,o){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:o})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=0)}([function(e,t,n){(function(o){var l,i,s;!function(n,o){i=[],l=o(n),void 0!==(s="function"==typeof l?l.apply(t,i):l)&&(e.exports=s)}(void 0!==o?o:this.window||this.global,function(e){"use strict";function t(){for(var e={},t=0;te.fixedSidebarOffset?-1===n.className.indexOf(e.positionFixedClass)&&(n.className+=h+e.positionFixedClass):n.className=n.className.split(h+e.positionFixedClass).join("")}function s(t){var n=document.documentElement.scrollTop||f.scrollTop;e.positionFixedSelector&&i();var o,l=t;if(m&&null!==document.querySelector(e.tocSelector)&&l.length>0){d.call(l,function(t,i){if(t.offsetTop>n+e.headingsOffset+10){return o=l[0===i?i:i-1],!0}if(i===l.length-1)return o=l[l.length-1],!0});var s=document.querySelector(e.tocSelector).querySelectorAll("."+e.linkClass);u.call(s,function(t){t.className=t.className.split(h+e.activeLinkClass).join("")});var c=document.querySelector(e.tocSelector).querySelectorAll("."+e.listItemClass);u.call(c,function(t){t.className=t.className.split(h+e.activeListItemClass).join("")});var a=document.querySelector(e.tocSelector).querySelector("."+e.linkClass+".node-name--"+o.nodeName+'[href="#'+o.id+'"]');-1===a.className.indexOf(e.activeLinkClass)&&(a.className+=h+e.activeLinkClass);var p=a.parentNode;p&&-1===p.className.indexOf(e.activeListItemClass)&&(p.className+=h+e.activeListItemClass);var C=document.querySelector(e.tocSelector).querySelectorAll("."+e.listClass+"."+e.collapsibleClass);u.call(C,function(t){-1===t.className.indexOf(e.isCollapsedClass)&&(t.className+=h+e.isCollapsedClass)}),a.nextSibling&&-1!==a.nextSibling.className.indexOf(e.isCollapsedClass)&&(a.nextSibling.className=a.nextSibling.className.split(h+e.isCollapsedClass).join("")),r(a.parentNode.parentNode)}}function r(t){return-1!==t.className.indexOf(e.collapsibleClass)&&-1!==t.className.indexOf(e.isCollapsedClass)?(t.className=t.className.split(h+e.isCollapsedClass).join(""),r(t.parentNode.parentNode)):t}function c(t){var n=t.target||t.srcElement;"string"==typeof n.className&&-1!==n.className.indexOf(e.linkClass)&&(m=!1)}function a(){m=!0}var u=[].forEach,d=[].some,f=document.body,m=!0,h=" ";return{enableTocAnimation:a,disableTocAnimation:c,render:n,updateToc:s}}},function(e,t){e.exports=function(e){function t(e){return e[e.length-1]}function n(e){return+e.nodeName.split("H").join("")}function o(t){var o={id:t.id,children:[],nodeName:t.nodeName,headingLevel:n(t),textContent:t.textContent.trim()};return e.includeHtml&&(o.childNodes=t.childNodes),o}function l(l,i){for(var s=o(l),r=n(l),c=i,a=t(c),u=a?a.headingLevel:0,d=r-u;d>0;)a=t(c),a&&void 0!==a.children&&(c=a.children),d--;return r>=e.collapseDepth&&(s.isCollapsed=!0),c.push(s),c}function i(t,n){var o=n;e.ignoreSelector&&(o=n.split(",").map(function(t){return t.trim()+":not("+e.ignoreSelector+")"}));try{return document.querySelector(t).querySelectorAll(o)}catch(e){return console.warn("Element not found: "+t),null}}function s(e){return r.call(e,function(e,t){return l(o(t),e.nest),e},{nest:[]})}var r=[].reduce;return{nestHeadingsArray:s,selectHeadings:i}}},function(e,t){function n(e){function t(e){return"a"===e.tagName.toLowerCase()&&(e.hash.length>0||"#"===e.href.charAt(e.href.length-1))&&(n(e.href)===s||n(e.href)+"#"===s)}function n(e){return e.slice(0,e.lastIndexOf("#"))}function l(e){var t=document.getElementById(e.substring(1));t&&(/^(?:a|select|input|button|textarea)$/i.test(t.tagName)||(t.tabIndex=-1),t.focus())}!function(){document.documentElement.style}();var i=e.duration,s=location.hash?n(location.href):location.href;!function(){function n(n){!t(n.target)||n.target.className.indexOf("no-smooth-scroll")>-1||"#"===n.target.href.charAt(n.target.href.length-2)&&"!"===n.target.href.charAt(n.target.href.length-1)||-1===n.target.className.indexOf(e.linkClass)||o(n.target.hash,{duration:i,callback:function(){l(n.target.hash)}})}document.body.addEventListener("click",n,!1)}()}function o(e,t){function n(e){s=e-i,window.scrollTo(0,c.easing(s,r,u,d)),s