From 9c95f50f634e7e9e242e5375590ae63afc81ef90 Mon Sep 17 00:00:00 2001 From: buildmaster Date: Mon, 22 Jun 2020 15:08:28 +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 | 1751 +++++++++++++ .../reference/html/appendix.html | 106 + .../reference/html/building.html | 251 ++ .../reference/html/contributing.html | 186 ++ .../reference/html/css/spring.css | 1 + .../3.0.6.RELEASE/reference/html/dlq.html | 371 +++ .../3.0.6.RELEASE/reference/html/favicon.ico | Bin 0 -> 111804 bytes .../reference/html/images/part-bindings.png | Bin 0 -> 61765 bytes .../reference/html/images/part-exchange.png | Bin 0 -> 24024 bytes .../reference/html/images/part-queues.png | Bin 0 -> 46910 bytes .../reference/html/images/rabbit-binder.png | Bin 0 -> 12440 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/overview.html | 1512 ++++++++++++ .../reference/html/partitions.html | 276 +++ ...-cloud-stream-binder-rabbit-aggregate.html | 1907 ++++++++++++++ .../spring-cloud-stream-binder-rabbit.html | 2195 +++++++++++++++++ .../reference/htmlsingle/Guardfile | 20 + .../reference/htmlsingle/css/spring.css | 1 + .../reference/htmlsingle/favicon.ico | Bin 0 -> 111804 bytes .../htmlsingle/images/part-bindings.png | Bin 0 -> 61765 bytes .../htmlsingle/images/part-exchange.png | Bin 0 -> 24024 bytes .../htmlsingle/images/part-queues.png | Bin 0 -> 46910 bytes .../htmlsingle/images/rabbit-binder.png | Bin 0 -> 12440 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 + 41 files changed, 9659 insertions(+) create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/Guardfile create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/README.html create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/appendix.html create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/building.html create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/contributing.html create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/css/spring.css create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/dlq.html create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/favicon.ico create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/images/part-bindings.png create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/images/part-exchange.png create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/images/part-queues.png create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/images/rabbit-binder.png create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/js/highlight/highlight.min.js create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/js/highlight/styles/atom-one-light.min.css create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/js/highlight/styles/github-gist.css create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/js/highlight/styles/github.min.css create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/js/highlight/styles/googlecode.css create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/js/highlight/styles/solarized-light.min.css create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/js/toc.js create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/js/tocbot/tocbot.css create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/js/tocbot/tocbot.min.js create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/overview.html create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/partitions.html create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/spring-cloud-stream-binder-rabbit-aggregate.html create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/spring-cloud-stream-binder-rabbit.html create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/htmlsingle/Guardfile create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/htmlsingle/css/spring.css create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/htmlsingle/favicon.ico create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/htmlsingle/images/part-bindings.png create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/htmlsingle/images/part-exchange.png create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/htmlsingle/images/part-queues.png create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/htmlsingle/images/rabbit-binder.png create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/htmlsingle/js/highlight/highlight.min.js create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/htmlsingle/js/highlight/styles/atom-one-light.min.css create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/htmlsingle/js/highlight/styles/github-gist.css create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/htmlsingle/js/highlight/styles/github.min.css create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/htmlsingle/js/highlight/styles/googlecode.css create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/htmlsingle/js/highlight/styles/solarized-light.min.css create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/htmlsingle/js/toc.js create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/htmlsingle/js/tocbot/tocbot.css create mode 100644 spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/htmlsingle/js/tocbot/tocbot.min.js diff --git a/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/Guardfile b/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/Guardfile new file mode 100644 index 00000000..bdd4d729 --- /dev/null +++ b/spring-cloud-stream-binder-rabbit/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-rabbit/3.0.6.RELEASE/reference/html/README.html b/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/README.html new file mode 100644 index 00000000..1fd3c94e --- /dev/null +++ b/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/README.html @@ -0,0 +1,1751 @@ + + + + + + + +Usage + + + + + + + + + + +
+
+
+
+
+CircleCI +
+
+
+
+codecov +
+
+
+
+Gitter +
+
+ +
+
+
+

Usage

+
+
+

To use the RabbitMQ binder, you can add it to your Spring Cloud Stream application, by using the following Maven coordinates:

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

Alternatively, you can use the Spring Cloud Stream RabbitMQ Starter, as follows:

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

RabbitMQ Binder Overview

+
+
+

The following simplified diagram shows how the RabbitMQ binder operates:

+
+
+
+rabbit binder +
+
Figure 1. RabbitMQ Binder
+
+
+

By default, the RabbitMQ Binder implementation maps each destination to a TopicExchange. +For each consumer group, a Queue is bound to that TopicExchange. +Each consumer instance has a corresponding RabbitMQ Consumer instance for its group’s Queue. +For partitioned producers and consumers, the queues are suffixed with the partition index and use the partition index as the routing key. +For anonymous consumers (those with no group property), an auto-delete queue (with a randomized unique name) is used.

+
+
+

By using the optional autoBindDlq option, you can configure the binder to create and configure dead-letter queues (DLQs) (and a dead-letter exchange DLX, as well as routing infrastructure). +By default, the dead letter queue has the name of the destination, appended with .dlq. +If retry is enabled (maxAttempts > 1), failed messages are delivered to the DLQ after retries are exhausted. +If retry is disabled (maxAttempts = 1), you should set requeueRejected to false (the default) so that failed messages are routed to the DLQ, instead of being re-queued. +In addition, republishToDlq causes the binder to publish a failed message to the DLQ (instead of rejecting it). +This feature lets additional information (such as the stack trace in the x-exception-stacktrace header) be added to the message in headers. +See the frameMaxHeadroom property for information about truncated stack traces. +This option does not need retry enabled. +You can republish a failed message after just one attempt. +Starting with version 1.2, you can configure the delivery mode of republished messages. +See the republishDeliveryMode property.

+
+
+

If the stream listener throws an ImmediateAcknowledgeAmqpException, the DLQ is bypassed and the message simply discarded. +Starting with version 2.1, this is true regardless of the setting of republishToDlq; previously it was only the case when republishToDlq was false.

+
+
+ + + + + +
+ + +Setting requeueRejected to true (with republishToDlq=false ) causes the message to be re-queued and redelivered continually, which is likely not what you want unless the reason for the failure is transient. +In general, you should enable retry within the binder by setting maxAttempts to greater than one or by setting republishToDlq to true. +
+
+
+

See RabbitMQ Binder Properties for more information about these properties.

+
+
+

The framework does not provide any standard mechanism to consume dead-letter messages (or to re-route them back to the primary queue). +Some options are described in [rabbit-dlq-processing].

+
+
+ + + + + +
+ + +When multiple RabbitMQ binders are used in a Spring Cloud Stream application, it is important to disable 'RabbitAutoConfiguration' to avoid the same configuration from RabbitAutoConfiguration being applied to the two binders. +You can exclude the class by using the @SpringBootApplication annotation. +
+
+
+

Starting with version 2.0, the RabbitMessageChannelBinder sets the RabbitTemplate.userPublisherConnection property to true so that the non-transactional producers avoid deadlocks on consumers, which can happen if cached connections are blocked because of a memory alarm on the broker.

+
+
+ + + + + +
+ + +Currently, a multiplex consumer (a single consumer listening to multiple queues) is only supported for message-driven conssumers; polled consumers can only retrieve messages from a single queue. +
+
+
+
+
+

Configuration Options

+
+
+

This section contains settings specific to the RabbitMQ Binder and bound channels.

+
+
+

For general binding configuration options and properties, see the Spring Cloud Stream core documentation.

+
+
+

RabbitMQ Binder Properties

+
+

By default, the RabbitMQ binder uses Spring Boot’s ConnectionFactory. +Conseuqently, it supports all Spring Boot configuration options for RabbitMQ. +(For reference, see the Spring Boot documentation). +RabbitMQ configuration options use the spring.rabbitmq prefix.

+
+
+

In addition to Spring Boot options, the RabbitMQ binder supports the following properties:

+
+
+
+
spring.cloud.stream.rabbit.binder.adminAddresses
+
+

A comma-separated list of RabbitMQ management plugin URLs. +Only used when nodes contains more than one entry. +Each entry in this list must have a corresponding entry in spring.rabbitmq.addresses. +Only needed if you use a RabbitMQ cluster and wish to consume from the node that hosts the queue. +See Queue Affinity and the LocalizedQueueConnectionFactory for more information.

+
+

Default: empty.

+
+
+
spring.cloud.stream.rabbit.binder.nodes
+
+

A comma-separated list of RabbitMQ node names. +When more than one entry, used to locate the server address where a queue is located. +Each entry in this list must have a corresponding entry in spring.rabbitmq.addresses. +Only needed if you use a RabbitMQ cluster and wish to consume from the node that hosts the queue. +See Queue Affinity and the LocalizedQueueConnectionFactory for more information.

+
+

Default: empty.

+
+
+
spring.cloud.stream.rabbit.binder.compressionLevel
+
+

The compression level for compressed bindings. +See java.util.zip.Deflater.

+
+

Default: 1 (BEST_LEVEL).

+
+
+
spring.cloud.stream.binder.connection-name-prefix
+
+

A connection name prefix used to name the connection(s) created by this binder. +The name is this prefix followed by #n, where n increments each time a new connection is opened.

+
+

Default: none (Spring AMQP default).

+
+
+
+
+
+
+

RabbitMQ Consumer Properties

+
+

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

+
+
+

However if the same set of properties needs to be applied to most bindings, to +avoid repetition, Spring Cloud Stream supports setting values for all channels, +in the format of spring.cloud.stream.rabbit.default.<property>=<value>.

+
+
+

Also, keep in mind that binding specific property will override its equivalent in the default.

+
+
+
+
acknowledgeMode
+
+

The acknowledge mode.

+
+

Default: AUTO.

+
+
+
anonymousGroupPrefix
+
+

When the binding has no group property, an anonymous, auto-delete queue is bound to the destination exchange. +The default naming stragegy for such queues results in a queue named anonymous.<base64 representation of a UUID>. +Set this property to change the prefix to something other than the default.

+
+

Default: anonymous..

+
+
+
autoBindDlq
+
+

Whether to automatically declare the DLQ and bind it to the binder DLX.

+
+

Default: false.

+
+
+
bindingRoutingKey
+
+

The routing key with which to bind the queue to the exchange (if bindQueue is true). +Can be multiple keys - see bindingRoutingKeyDelimiter. +For partitioned destinations, -<instanceIndex> is appended to each key.

+
+

Default: #.

+
+
+
bindingRoutingKeyDelimiter
+
+

When this is not null, 'bindingRoutingKey' is considered to be a list of keys delimited by this value; often a comma is used.

+
+

Default: null.

+
+
+
bindQueue
+
+

Whether to declare the queue and bind it to the destination exchange. +Set it to false if you have set up your own infrastructure and have previously created and bound the queue.

+
+

Default: true.

+
+
+
consumerTagPrefix
+
+

Used to create the consumer tag(s); will be appended by #n where n increments for each consumer created. +Example: ${spring.application.name}-${spring.cloud.stream.bindings.input.group}-${spring.cloud.stream.instance-index}.

+
+

Default: none - the broker will generate random consumer tags.

+
+
+
containerType
+
+

Select the type of listener container to be used. +See Choosing a Container in the Spring AMQP documentation for more information.

+
+

Default: simple

+
+
+
deadLetterQueueName
+
+

The name of the DLQ

+
+

Default: prefix+destination.dlq

+
+
+
deadLetterExchange
+
+

A DLX to assign to the queue. +Relevant only if autoBindDlq is true.

+
+

Default: 'prefix+DLX'

+
+
+
deadLetterExchangeType
+
+

The type of the DLX to assign to the queue. +Relevant only if autoBindDlq is true.

+
+

Default: 'direct'

+
+
+
deadLetterRoutingKey
+
+

A dead letter routing key to assign to the queue. +Relevant only if autoBindDlq is true.

+
+

Default: destination

+
+
+
declareDlx
+
+

Whether to declare the dead letter exchange for the destination. +Relevant only if autoBindDlq is true. +Set to false if you have a pre-configured DLX.

+
+

Default: true.

+
+
+
declareExchange
+
+

Whether to declare the exchange for the destination.

+
+

Default: true.

+
+
+
delayedExchange
+
+

Whether to declare the exchange as a Delayed Message Exchange. +Requires the delayed message exchange plugin on the broker. +The x-delayed-type argument is set to the exchangeType.

+
+

Default: false.

+
+
+
dlqBindingArguments
+
+

Arguments applied when binding the dlq to the dead letter exchange; used with headers deadLetterExchangeType to specify headers to match on. +For example …​dlqBindingArguments.x-match=any, …​dlqBindingArguments.someHeader=someValue.

+
+

Default: empty

+
+
+
dlqDeadLetterExchange
+
+

If a DLQ is declared, a DLX to assign to that queue.

+
+

Default: none

+
+
+
dlqDeadLetterRoutingKey
+
+

If a DLQ is declared, a dead letter routing key to assign to that queue.

+
+

Default: none

+
+
+
dlqExpires
+
+

How long before an unused dead letter queue is deleted (in milliseconds).

+
+

Default: no expiration

+
+
+
dlqLazy
+
+

Declare the dead letter queue with the x-queue-mode=lazy argument. +See “Lazy Queues”. +Consider using a policy instead of this setting, because using a policy allows changing the setting without deleting the queue.

+
+

Default: false.

+
+
+
dlqMaxLength
+
+

Maximum number of messages in the dead letter queue.

+
+

Default: no limit

+
+
+
dlqMaxLengthBytes
+
+

Maximum number of total bytes in the dead letter queue from all messages.

+
+

Default: no limit

+
+
+
dlqMaxPriority
+
+

Maximum priority of messages in the dead letter queue (0-255).

+
+

Default: none

+
+
+
dlqOverflowBehavior
+
+

Action to take when dlqMaxLength or dlqMaxLengthBytes is exceeded; currently drop-head or reject-publish but refer to the RabbitMQ documentation.

+
+

Default: none

+
+
+
dlqQuorum.deliveryLimit
+
+

When quorum.enabled=true, set a delivery limit after which the message is dropped or dead-lettered.

+
+

Default: none - broker default will apply.

+
+
+
dlqQuorum.enabled
+
+

When true, create a quorum dead letter queue instead of a classic queue.

+
+

Default: false

+
+
+
dlqQuorum.initialQuorumSize
+
+

When quorum.enabled=true, set the initial quorum size.

+
+

Default: none - broker default will apply.

+
+
+
dlqSingleActiveConsumer
+
+

Set to true to set the x-single-active-consumer queue property to true.

+
+

Default: false

+
+
+
dlqTtl
+
+

Default time to live to apply to the dead letter queue when declared (in milliseconds).

+
+

Default: no limit

+
+
+
durableSubscription
+
+

Whether the subscription should be durable. +Only effective if group is also set.

+
+

Default: true.

+
+
+
exchangeAutoDelete
+
+

If declareExchange is true, whether the exchange should be auto-deleted (that is, removed after the last queue is removed).

+
+

Default: true.

+
+
+
exchangeDurable
+
+

If declareExchange is true, whether the exchange should be durable (that is, it survives broker restart).

+
+

Default: true.

+
+
+
exchangeType
+
+

The exchange type: direct, fanout, headers or topic for non-partitioned destinations and direct, headers or topic for partitioned destinations.

+
+

Default: topic.

+
+
+
exclusive
+
+

Whether to create an exclusive consumer. +Concurrency should be 1 when this is true. +Often used when strict ordering is required but enabling a hot standby instance to take over after a failure. +See recoveryInterval, which controls how often a standby instance attempts to consume. +Consider using singleActiveConsumer instead when using RabbitMQ 3.8 or later.

+
+

Default: false.

+
+
+
expires
+
+

How long before an unused queue is deleted (in milliseconds).

+
+

Default: no expiration

+
+
+
failedDeclarationRetryInterval
+
+

The interval (in milliseconds) between attempts to consume from a queue if it is missing.

+
+

Default: 5000

+
+
+
+
+
+
+
frameMaxHeadroom
+
+

The number of bytes to reserve for other headers when adding the stack trace to a DLQ message header. +All headers must fit within the frame_max size configured on the broker. +Stack traces can be large; if the size plus this property exceeds frame_max then the stack trace will be truncated. +A WARN log will be written; consider increasing the frame_max or reducing the stack trace by catching the exception and throwing one with a smaller stack trace.

+
+

Default: 20000

+
+
+
headerPatterns
+
+

Patterns for headers to be mapped from inbound messages.

+
+

Default: ['*'] (all headers).

+
+
+
lazy
+
+

Declare the queue with the x-queue-mode=lazy argument. +See “Lazy Queues”. +Consider using a policy instead of this setting, because using a policy allows changing the setting without deleting the queue.

+
+

Default: false.

+
+
+
maxConcurrency
+
+

The maximum number of consumers. +Not supported when the containerType is direct.

+
+

Default: 1.

+
+
+
maxLength
+
+

The maximum number of messages in the queue.

+
+

Default: no limit

+
+
+
maxLengthBytes
+
+

The maximum number of total bytes in the queue from all messages.

+
+

Default: no limit

+
+
+
maxPriority
+
+

The maximum priority of messages in the queue (0-255).

+
+

Default: none

+
+
+
missingQueuesFatal
+
+

When the queue cannot be found, whether to treat the condition as fatal and stop the listener container. +Defaults to false so that the container keeps trying to consume from the queue — for example, when using a cluster and the node hosting a non-HA queue is down.

+
+

Default: false

+
+
+
overflowBehavior
+
+

Action to take when maxLength or maxLengthBytes is exceeded; currently drop-head or reject-publish but refer to the RabbitMQ documentation.

+
+

Default: none

+
+
+
prefetch
+
+

Prefetch count.

+
+

Default: 1.

+
+
+
prefix
+
+

A prefix to be added to the name of the destination and queues.

+
+

Default: "".

+
+
+
queueBindingArguments
+
+

Arguments applied when binding the queue to the exchange; used with headers exchangeType to specify headers to match on. +For example …​queueBindingArguments.x-match=any, …​queueBindingArguments.someHeader=someValue.

+
+

Default: empty

+
+
+
queueDeclarationRetries
+
+

The number of times to retry consuming from a queue if it is missing. +Relevant only when missingQueuesFatal is true. +Otherwise, the container keeps retrying indefinitely. +Not supported when the containerType is direct.

+
+

Default: 3

+
+
+
queueNameGroupOnly
+
+

When true, consume from a queue with a name equal to the group. +Otherwise the queue name is destination.group. +This is useful, for example, when using Spring Cloud Stream to consume from an existing RabbitMQ queue.

+
+

Default: false.

+
+
+
quorum.deliveryLimit
+
+

When quorum.enabled=true, set a delivery limit after which the message is dropped or dead-lettered.

+
+

Default: none - broker default will apply.

+
+
+
quorum.enabled
+
+

When true, create a quorum queue instead of a classic queue.

+
+

Default: false

+
+
+
quorum.initialQuorumSize
+
+

When quorum.enabled=true, set the initial quorum size.

+
+

Default: none - broker default will apply.

+
+
+
recoveryInterval
+
+

The interval between connection recovery attempts, in milliseconds.

+
+

Default: 5000.

+
+
+
requeueRejected
+
+

Whether delivery failures should be re-queued when retry is disabled or republishToDlq is false.

+
+

Default: false.

+
+
+
+
+
+
+
republishDeliveryMode
+
+

When republishToDlq is true, specifies the delivery mode of the republished message.

+
+

Default: DeliveryMode.PERSISTENT

+
+
+
republishToDlq
+
+

By default, messages that fail after retries are exhausted are rejected. +If a dead-letter queue (DLQ) is configured, RabbitMQ routes the failed message (unchanged) to the DLQ. +If set to true, the binder republishs failed messages to the DLQ with additional headers, including the exception message and stack trace from the cause of the final failure. +Also see the frameMaxHeadroom property.

+
+

Default: false

+
+
+
singleActiveConsumer
+
+

Set to true to set the x-single-active-consumer queue property to true.

+
+

Default: false

+
+
+
transacted
+
+

Whether to use transacted channels.

+
+

Default: false.

+
+
+
ttl
+
+

Default time to live to apply to the queue when declared (in milliseconds).

+
+

Default: no limit

+
+
+
txSize
+
+

The number of deliveries between acks. +Not supported when the containerType is direct.

+
+

Default: 1.

+
+
+
+
+
+
+

Advanced Listener Container Configuration

+
+

To set listener container properties that are not exposed as binder or binding properties, add a single bean of type ListenerContainerCustomizer to the application context. +The binder and binding properties will be set and then the customizer will be called. +The customizer (configure() method) is provided with the queue name as well as the consumer group as arguments.

+
+
+
+

Advanced Queue/Exchange/Binding Configuration

+
+

From time to time, the RabbitMQ team add new features that are enabled by setting some argument when declaring, for example, a queue. +Generally, such features are enabled in the binder by adding appropriate properties, but this may not be immediately available in a current version. +Starting with version 3.0.1, you can now add DeclarableCustomizer bean(s) to the application context to modify a Declarable (Queue, Exchange or Binding) just before the declaration is performed. +This allows you to add arguments that are not currently directly supported by the binder.

+
+
+
+

Receiving Batched Messages

+
+

Normally, if a producer binding has batch-enabled=true (see Rabbit Producer Properties), or a message is created by a BatchingRabbitTemplate, elements of the batch are returned as individual calls to the listener method. +Starting with version 3.0, any such batch can be presented as a List<?> to the listener method if spring.cloud.stream.bindings.<name>.consumer.batch-mode is set to true.

+
+
+
+

Rabbit Producer Properties

+
+

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

+
+
+

However if the same set of properties needs to be applied to most bindings, to +avoid repetition, Spring Cloud Stream supports setting values for all channels, +in the format of spring.cloud.stream.rabbit.default.<property>=<value>.

+
+
+

Also, keep in mind that binding specific property will override its equivalent in the default.

+
+
+
+
autoBindDlq
+
+

Whether to automatically declare the DLQ and bind it to the binder DLX.

+
+

Default: false.

+
+
+
batchingEnabled
+
+

Whether to enable message batching by producers. +Messages are batched into one message according to the following properties (described in the next three entries in this list): 'batchSize', batchBufferLimit, and batchTimeout. +See Batching for more information. +Also see Receiving Batched Messages.

+
+

Default: false.

+
+
+
batchSize
+
+

The number of messages to buffer when batching is enabled.

+
+

Default: 100.

+
+
+
batchBufferLimit
+
+

The maximum buffer size when batching is enabled.

+
+

Default: 10000.

+
+
+
batchTimeout
+
+

The batch timeout when batching is enabled.

+
+

Default: 5000.

+
+
+
bindingRoutingKey
+
+

The routing key with which to bind the queue to the exchange (if bindQueue is true). +Can be multiple keys - see bindingRoutingKeyDelimiter. +For partitioned destinations, -n is appended to each key. +Only applies if requiredGroups are provided and then only to those groups.

+
+

Default: #.

+
+
+
bindingRoutingKeyDelimiter
+
+

When this is not null, 'bindingRoutingKey' is considered to be a list of keys delimited by this value; often a comma is used. +Only applies if requiredGroups are provided and then only to those groups.

+
+

Default: null.

+
+
+
bindQueue
+
+

Whether to declare the queue and bind it to the destination exchange. +Set it to false if you have set up your own infrastructure and have previously created and bound the queue. +Only applies if requiredGroups are provided and then only to those groups.

+
+

Default: true.

+
+
+
compress
+
+

Whether data should be compressed when sent.

+
+

Default: false.

+
+
+
confirmAckChannel
+
+

When errorChannelEnabled is true, a channel to which to send positive delivery acknowledgments (aka publisher confirms). +If the channel does not exist, a DirectChannel is registered with this name. +The connection factory must be configured to enable publisher confirms.

+
+

Default: nullChannel (acks are discarded).

+
+
+
deadLetterQueueName
+
+

The name of the DLQ +Only applies if requiredGroups are provided and then only to those groups.

+
+

Default: prefix+destination.dlq

+
+
+
deadLetterExchange
+
+

A DLX to assign to the queue. +Relevant only when autoBindDlq is true. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: 'prefix+DLX'

+
+
+
deadLetterExchangeType
+
+

The type of the DLX to assign to the queue. +Relevant only if autoBindDlq is true. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: 'direct'

+
+
+
deadLetterRoutingKey
+
+

A dead letter routing key to assign to the queue. +Relevant only when autoBindDlq is true. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: destination

+
+
+
declareDlx
+
+

Whether to declare the dead letter exchange for the destination. +Relevant only if autoBindDlq is true. +Set to false if you have a pre-configured DLX. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: true.

+
+
+
declareExchange
+
+

Whether to declare the exchange for the destination.

+
+

Default: true.

+
+
+
delayExpression
+
+

A SpEL expression to evaluate the delay to apply to the message (x-delay header). +It has no effect if the exchange is not a delayed message exchange.

+
+

Default: No x-delay header is set.

+
+
+
delayedExchange
+
+

Whether to declare the exchange as a Delayed Message Exchange. +Requires the delayed message exchange plugin on the broker. +The x-delayed-type argument is set to the exchangeType.

+
+

Default: false.

+
+
+
deliveryMode
+
+

The delivery mode.

+
+

Default: PERSISTENT.

+
+
+
dlqBindingArguments
+
+

Arguments applied when binding the dlq to the dead letter exchange; used with headers deadLetterExchangeType to specify headers to match on. +For example …​dlqBindingArguments.x-match=any, …​dlqBindingArguments.someHeader=someValue. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: empty

+
+
+
dlqDeadLetterExchange
+
+

When a DLQ is declared, a DLX to assign to that queue. +Applies only if requiredGroups are provided and then only to those groups.

+
+

Default: none

+
+
+
dlqDeadLetterRoutingKey
+
+

When a DLQ is declared, a dead letter routing key to assign to that queue. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: none

+
+
+
dlqExpires
+
+

How long (in milliseconds) before an unused dead letter queue is deleted. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: no expiration

+
+
+
dlqLazy
+
+

Declare the dead letter queue with the x-queue-mode=lazy argument. +See “Lazy Queues”. +Consider using a policy instead of this setting, because using a policy allows changing the setting without deleting the queue. +Applies only when requiredGroups are provided and then only to those groups.

+
+
dlqMaxLength
+
+

Maximum number of messages in the dead letter queue. +Applies only if requiredGroups are provided and then only to those groups.

+
+

Default: no limit

+
+
+
dlqMaxLengthBytes
+
+

Maximum number of total bytes in the dead letter queue from all messages. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: no limit

+
+
+
dlqMaxPriority
+
+

Maximum priority of messages in the dead letter queue (0-255) +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: none

+
+
+
dlqQuorum.deliveryLimit
+
+

When quorum.enabled=true, set a delivery limit after which the message is dropped or dead-lettered. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: none - broker default will apply.

+
+
+
dlqQuorum.enabled
+
+

When true, create a quorum dead letter queue instead of a classic queue. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: false

+
+
+
dlqQuorum.initialQuorumSize
+
+

When quorum.enabled=true, set the initial quorum size. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: none - broker default will apply.

+
+
+
dlqSingleActiveConsumer
+
+

Set to true to set the x-single-active-consumer queue property to true. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: false

+
+
+
dlqTtl
+
+

Default time (in milliseconds) to live to apply to the dead letter queue when declared. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: no limit

+
+
+
exchangeAutoDelete
+
+

If declareExchange is true, whether the exchange should be auto-delete (it is removed after the last queue is removed).

+
+

Default: true.

+
+
+
exchangeDurable
+
+

If declareExchange is true, whether the exchange should be durable (survives broker restart).

+
+

Default: true.

+
+
+
exchangeType
+
+

The exchange type: direct, fanout, headers or topic for non-partitioned destinations and direct, headers or topic for partitioned destinations.

+
+

Default: topic.

+
+
+
expires
+
+

How long (in milliseconds) before an unused queue is deleted. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: no expiration

+
+
+
headerPatterns
+
+

Patterns for headers to be mapped to outbound messages.

+
+

Default: ['*'] (all headers).

+
+
+
lazy
+
+

Declare the queue with the x-queue-mode=lazy argument. +See “Lazy Queues”. +Consider using a policy instead of this setting, because using a policy allows changing the setting without deleting the queue. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: false.

+
+
+
maxLength
+
+

Maximum number of messages in the queue. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: no limit

+
+
+
maxLengthBytes
+
+

Maximum number of total bytes in the queue from all messages. +Only applies if requiredGroups are provided and then only to those groups.

+
+

Default: no limit

+
+
+
maxPriority
+
+

Maximum priority of messages in the queue (0-255). +Only applies if requiredGroups are provided and then only to those groups.

+
+

Default: none

+
+
+
prefix
+
+

A prefix to be added to the name of the destination exchange.

+
+

Default: "".

+
+
+
queueBindingArguments
+
+

Arguments applied when binding the queue to the exchange; used with headers exchangeType to specify headers to match on. +For example …​queueBindingArguments.x-match=any, …​queueBindingArguments.someHeader=someValue. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: empty

+
+
+
queueNameGroupOnly
+
+

When true, consume from a queue with a name equal to the group. +Otherwise the queue name is destination.group. +This is useful, for example, when using Spring Cloud Stream to consume from an existing RabbitMQ queue. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: false.

+
+
+
quorum.deliveryLimit
+
+

When quorum.enabled=true, set a delivery limit after which the message is dropped or dead-lettered. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: none - broker default will apply.

+
+
+
quorum.enabled
+
+

When true, create a quorum queue instead of a classic queue. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: false

+
+
+
quorum.initialQuorumSize
+
+

When quorum.enabled=true, set the initial quorum size. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: none - broker default will apply.

+
+
+
routingKeyExpression
+
+

A SpEL expression to determine the routing key to use when publishing messages. +For a fixed routing key, use a literal expression, such as routingKeyExpression='my.routingKey' in a properties file or routingKeyExpression: '''my.routingKey''' in a YAML file.

+
+

Default: destination or destination-<partition> for partitioned destinations.

+
+
+
singleActiveConsumer
+
+

Set to true to set the x-single-active-consumer queue property to true. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: false

+
+
+
transacted
+
+

Whether to use transacted channels.

+
+

Default: false.

+
+
+
ttl
+
+

Default time (in milliseconds) to live to apply to the queue when declared. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: no limit

+
+
+
+
+
+ + + + + +
+ + +In the case of RabbitMQ, content type headers can be set by external applications. +Spring Cloud Stream supports them as part of an extended internal protocol used for any type of transport — including transports, such as Kafka (prior to 0.11), that do not natively support headers. +
+
+
+
+
+
+

Using Existing Queues/Exchanges

+
+
+

By default, the binder will automatically provision a topic exchange with the name being derived from the value of the destination binding property <prefix><destination>. +The destination defaults to the binding name, if not provided. +When binding a consumer, a queue will automatically be provisioned with the name <prefix><destination>.<group> (if a group binding property is specified), or an anonymous, auto-delete queue when there is no group. +The queue will be bound to the exchange with the "match-all" wildcard routing key (#) for a non-partitioned binding or <destination>-<instanceIndex> for a partitioned binding. +The prefix is an empty String by default. +If an output binding is specified with requiredGroups, a queue/binding will be provisioned for each group.

+
+
+

There are a number of rabbit-specific binding properties that allow you to modify this default behavior.

+
+
+

If you have an existing exchange/queue that you wish to use, you can completely disable automatic provisioning as follows, assuming the exchange is named myExchange and the queue is named myQueue:

+
+
+
    +
  • +

    spring.cloud.stream.bindings.<binding name>.destination=myExhange

    +
  • +
  • +

    spring.cloud.stream.bindings.<binding name>.group=myQueue

    +
  • +
  • +

    spring.cloud.stream.rabbit.bindings.<binding name>.consumer.bindQueue=false

    +
  • +
  • +

    spring.cloud.stream.rabbit.bindings.<binding name>.consumer.declareExchange=false

    +
  • +
  • +

    spring.cloud.stream.rabbit.bindings.<binding name>.consumer.queueNameGroupOnly=true

    +
  • +
+
+
+

If you want the binder to provision the queue/exchange, but you want to do it using something other than the defaults discussed here, use the following properties. +Refer to the property documentation above for more information.

+
+
+
    +
  • +

    spring.cloud.stream.rabbit.bindings.<binding name>.consumer.bindingRoutingKey=myRoutingKey

    +
  • +
  • +

    spring.cloud.stream.rabbit.bindings.<binding name>.consumer.exchangeType=<type>

    +
  • +
  • +

    spring.cloud.stream.rabbit.bindings.<binding name>.producer.routingKeyExpression='myRoutingKey'

    +
  • +
+
+
+

There are similar properties used when declaring a dead-letter exchange/queue, when autoBindDlq is true.

+
+
+
+
+

Retry With the RabbitMQ Binder

+
+
+

When retry is enabled within the binder, the listener container thread is suspended for any back off periods that are configured. +This might be important when strict ordering is required with a single consumer. However, for other use cases, it prevents other messages from being processed on that thread. +An alternative to using binder retry is to set up dead lettering with time to live on the dead-letter queue (DLQ) as well as dead-letter configuration on the DLQ itself. +See “RabbitMQ Binder Properties” for more information about the properties discussed here. +You can use the following example configuration to enable this feature:

+
+
+
    +
  • +

    Set autoBindDlq to true. +The binder create a DLQ. +Optionally, you can specify a name in deadLetterQueueName.

    +
  • +
  • +

    Set dlqTtl to the back off time you want to wait between redeliveries.

    +
  • +
  • +

    Set the dlqDeadLetterExchange to the default exchange. +Expired messages from the DLQ are routed to the original queue, because the default deadLetterRoutingKey is the queue name (destination.group). +Setting to the default exchange is achieved by setting the property with no value, as shown in the next example.

    +
  • +
+
+
+

To force a message to be dead-lettered, either throw an AmqpRejectAndDontRequeueException or set requeueRejected to true (the default) and throw any exception.

+
+
+

The loop continue without end, which is fine for transient problems, but you may want to give up after some number of attempts. +Fortunately, RabbitMQ provides the x-death header, which lets you determine how many cycles have occurred.

+
+
+

To acknowledge a message after giving up, throw an ImmediateAcknowledgeAmqpException.

+
+
+

Putting it All Together

+
+

The following configuration creates an exchange myDestination with queue myDestination.consumerGroup bound to a topic exchange with a wildcard routing key #:

+
+
+
+
---
+spring.cloud.stream.bindings.input.destination=myDestination
+spring.cloud.stream.bindings.input.group=consumerGroup
+#disable binder retries
+spring.cloud.stream.bindings.input.consumer.max-attempts=1
+#dlx/dlq setup
+spring.cloud.stream.rabbit.bindings.input.consumer.auto-bind-dlq=true
+spring.cloud.stream.rabbit.bindings.input.consumer.dlq-ttl=5000
+spring.cloud.stream.rabbit.bindings.input.consumer.dlq-dead-letter-exchange=
+---
+
+
+
+

This configuration creates a DLQ bound to a direct exchange (DLX) with a routing key of myDestination.consumerGroup. +When messages are rejected, they are routed to the DLQ. +After 5 seconds, the message expires and is routed to the original queue by using the queue name as the routing key, as shown in the following example:

+
+
+
Spring Boot application
+
+
@SpringBootApplication
+@EnableBinding(Sink.class)
+public class XDeathApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(XDeathApplication.class, args);
+    }
+
+    @StreamListener(Sink.INPUT)
+    public void listen(String in, @Header(name = "x-death", required = false) Map<?,?> death) {
+        if (death != null && death.get("count").equals(3L)) {
+            // giving up - don't send to DLX
+            throw new ImmediateAcknowledgeAmqpException("Failed after 4 attempts");
+        }
+        throw new AmqpRejectAndDontRequeueException("failed");
+    }
+
+}
+
+
+
+

Notice that the count property in the x-death header is a Long.

+
+
+
+
+
+

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.

+
+
+

RabbitMQ has two types of send failures:

+
+
+ +
+
+

The latter is rare. +According to the RabbitMQ documentation "[A nack] will only be delivered if an internal error occurs in the Erlang process responsible for a queue.".

+
+
+

As well as enabling producer error channels (as described in “[spring-cloud-stream-overview-error-handling]”), the RabbitMQ binder only sends messages to the channels if the connection factory is appropriately configured, as follows:

+
+
+
    +
  • +

    ccf.setPublisherConfirms(true);

    +
  • +
  • +

    ccf.setPublisherReturns(true);

    +
  • +
+
+
+

When using Spring Boot configuration for the connection factory, set the following properties:

+
+
+
    +
  • +

    spring.rabbitmq.publisher-confirms

    +
  • +
  • +

    spring.rabbitmq.publisher-returns

    +
  • +
+
+
+

The payload of the ErrorMessage for a returned message is a ReturnedAmqpMessageException with the following properties:

+
+
+
    +
  • +

    failedMessage: The spring-messaging Message<?> that failed to be sent.

    +
  • +
  • +

    amqpMessage: The raw spring-amqp Message.

    +
  • +
  • +

    replyCode: An integer value indicating the reason for the failure (for example, 312 - No route).

    +
  • +
  • +

    replyText: A text value indicating the reason for the failure (for example, NO_ROUTE).

    +
  • +
  • +

    exchange: The exchange to which the message was published.

    +
  • +
  • +

    routingKey: The routing key used when the message was published.

    +
  • +
+
+
+

For negatively acknowledged confirmations, the payload is a NackedAmqpMessageException with the following properties:

+
+
+
    +
  • +

    failedMessage: The spring-messaging Message<?> that failed to be sent.

    +
  • +
  • +

    nackReason: A reason (if available — you may need to examine the broker logs for more information).

    +
  • +
+
+
+

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

+
+
+
+

Appendices

+
+

Appendix A: Building

+
+
+

Basic Compile and Test

+
+

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

+
+
+

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 RabbitMQ server running +on localhost and the default port (5672) +before building.

+
+
+

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 "docs" profile that will generate documentation.

+
+
+

./mvnw clean package -Pdocs -DskipTests

+
+
+

The reference documentation can then be found in docs/target/contents/reference.

+
+
+
+

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

+
+
+

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-rabbit/3.0.6.RELEASE/reference/html/appendix.html b/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/appendix.html new file mode 100644 index 00000000..451bd702 --- /dev/null +++ b/spring-cloud-stream-binder-rabbit/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-rabbit/3.0.6.RELEASE/reference/html/building.html b/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/building.html new file mode 100644 index 00000000..966f9961 --- /dev/null +++ b/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/building.html @@ -0,0 +1,251 @@ + + + + + + + +Building + + + + + + + + + + +
+
+

Building

+
+
+

Basic Compile and Test

+
+

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

+
+
+

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 RabbitMQ server running +on localhost and the default port (5672) +before building.

+
+
+

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 "docs" profile that will generate documentation.

+
+
+

./mvnw clean package -Pdocs -DskipTests

+
+
+

The reference documentation can then be found in docs/target/contents/reference.

+
+
+
+

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-rabbit/3.0.6.RELEASE/reference/html/contributing.html b/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/contributing.html new file mode 100644 index 00000000..f36172a3 --- /dev/null +++ b/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/contributing.html @@ -0,0 +1,186 @@ + + + + + + + +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-rabbit/3.0.6.RELEASE/reference/html/css/spring.css b/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/css/spring.css new file mode 100644 index 00000000..7fead00e --- /dev/null +++ b/spring-cloud-stream-binder-rabbit/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-rabbit/3.0.6.RELEASE/reference/html/dlq.html b/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/dlq.html new file mode 100644 index 00000000..cd1901dd --- /dev/null +++ b/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/dlq.html @@ -0,0 +1,371 @@ + + + + + + + +Dead-Letter Queue Processing + + + + + + + + + + +
+
+

Dead-Letter Queue Processing

+
+
+

Because you cannot anticipate how users would want to dispose of dead-lettered messages, the framework 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 queue. +However, if the problem is a permanent issue, that could cause an infinite loop. +The following Spring Boot application shows an example of how to route those messages back to the original queue but moves them to a third “parking lot” queue after three attempts. +The second example uses the RabbitMQ Delayed Message Exchange to introduce a delay to the re-queued message. +In this example, the delay increases for each attempt. +These examples use a @RabbitListener to receive messages from the DLQ. +You could also use RabbitTemplate.receive() in a batch process.

+
+
+

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

+
+
+

Non-Partitioned Destinations

+
+

The first two examples are for when the destination is not partitioned:

+
+
+
+
@SpringBootApplication
+public class ReRouteDlqApplication {
+
+    private static final String ORIGINAL_QUEUE = "so8400in.so8400";
+
+    private static final String DLQ = ORIGINAL_QUEUE + ".dlq";
+
+    private static final String PARKING_LOT = ORIGINAL_QUEUE + ".parkingLot";
+
+    private static final String X_RETRIES_HEADER = "x-retries";
+
+    public static void main(String[] args) throws Exception {
+        ConfigurableApplicationContext context = SpringApplication.run(ReRouteDlqApplication.class, args);
+        System.out.println("Hit enter to terminate");
+        System.in.read();
+        context.close();
+    }
+
+    @Autowired
+    private RabbitTemplate rabbitTemplate;
+
+    @RabbitListener(queues = DLQ)
+    public void rePublish(Message failedMessage) {
+        Integer retriesHeader = (Integer) failedMessage.getMessageProperties().getHeaders().get(X_RETRIES_HEADER);
+        if (retriesHeader == null) {
+            retriesHeader = Integer.valueOf(0);
+        }
+        if (retriesHeader < 3) {
+            failedMessage.getMessageProperties().getHeaders().put(X_RETRIES_HEADER, retriesHeader + 1);
+            this.rabbitTemplate.send(ORIGINAL_QUEUE, failedMessage);
+        }
+        else {
+            this.rabbitTemplate.send(PARKING_LOT, failedMessage);
+        }
+    }
+
+    @Bean
+    public Queue parkingLot() {
+        return new Queue(PARKING_LOT);
+    }
+
+}
+
+
+
+
+
@SpringBootApplication
+public class ReRouteDlqApplication {
+
+    private static final String ORIGINAL_QUEUE = "so8400in.so8400";
+
+    private static final String DLQ = ORIGINAL_QUEUE + ".dlq";
+
+    private static final String PARKING_LOT = ORIGINAL_QUEUE + ".parkingLot";
+
+    private static final String X_RETRIES_HEADER = "x-retries";
+
+    private static final String DELAY_EXCHANGE = "dlqReRouter";
+
+    public static void main(String[] args) throws Exception {
+        ConfigurableApplicationContext context = SpringApplication.run(ReRouteDlqApplication.class, args);
+        System.out.println("Hit enter to terminate");
+        System.in.read();
+        context.close();
+    }
+
+    @Autowired
+    private RabbitTemplate rabbitTemplate;
+
+    @RabbitListener(queues = DLQ)
+    public void rePublish(Message failedMessage) {
+        Map<String, Object> headers = failedMessage.getMessageProperties().getHeaders();
+        Integer retriesHeader = (Integer) headers.get(X_RETRIES_HEADER);
+        if (retriesHeader == null) {
+            retriesHeader = Integer.valueOf(0);
+        }
+        if (retriesHeader < 3) {
+            headers.put(X_RETRIES_HEADER, retriesHeader + 1);
+            headers.put("x-delay", 5000 * retriesHeader);
+            this.rabbitTemplate.send(DELAY_EXCHANGE, ORIGINAL_QUEUE, failedMessage);
+        }
+        else {
+            this.rabbitTemplate.send(PARKING_LOT, failedMessage);
+        }
+    }
+
+    @Bean
+    public DirectExchange delayExchange() {
+        DirectExchange exchange = new DirectExchange(DELAY_EXCHANGE);
+        exchange.setDelayed(true);
+        return exchange;
+    }
+
+    @Bean
+    public Binding bindOriginalToDelay() {
+        return BindingBuilder.bind(new Queue(ORIGINAL_QUEUE)).to(delayExchange()).with(ORIGINAL_QUEUE);
+    }
+
+    @Bean
+    public Queue parkingLot() {
+        return new Queue(PARKING_LOT);
+    }
+
+}
+
+
+
+
+

Partitioned Destinations

+
+

With partitioned destinations, there is one DLQ for all partitions. We determine the original queue from the headers.

+
+
+

republishToDlq=false

+
+

When republishToDlq is false, RabbitMQ publishes the message to the DLX/DLQ with an x-death header containing information about the original destination, as shown in the following example:

+
+
+
+
@SpringBootApplication
+public class ReRouteDlqApplication {
+
+	private static final String ORIGINAL_QUEUE = "so8400in.so8400";
+
+	private static final String DLQ = ORIGINAL_QUEUE + ".dlq";
+
+	private static final String PARKING_LOT = ORIGINAL_QUEUE + ".parkingLot";
+
+	private static final String X_DEATH_HEADER = "x-death";
+
+	private static final String X_RETRIES_HEADER = "x-retries";
+
+	public static void main(String[] args) throws Exception {
+		ConfigurableApplicationContext context = SpringApplication.run(ReRouteDlqApplication.class, args);
+		System.out.println("Hit enter to terminate");
+		System.in.read();
+		context.close();
+	}
+
+	@Autowired
+	private RabbitTemplate rabbitTemplate;
+
+	@SuppressWarnings("unchecked")
+	@RabbitListener(queues = DLQ)
+	public void rePublish(Message failedMessage) {
+		Map<String, Object> headers = failedMessage.getMessageProperties().getHeaders();
+		Integer retriesHeader = (Integer) headers.get(X_RETRIES_HEADER);
+		if (retriesHeader == null) {
+			retriesHeader = Integer.valueOf(0);
+		}
+		if (retriesHeader < 3) {
+			headers.put(X_RETRIES_HEADER, retriesHeader + 1);
+			List<Map<String, ?>> xDeath = (List<Map<String, ?>>) headers.get(X_DEATH_HEADER);
+			String exchange = (String) xDeath.get(0).get("exchange");
+			List<String> routingKeys = (List<String>) xDeath.get(0).get("routing-keys");
+			this.rabbitTemplate.send(exchange, routingKeys.get(0), failedMessage);
+		}
+		else {
+			this.rabbitTemplate.send(PARKING_LOT, failedMessage);
+		}
+	}
+
+	@Bean
+	public Queue parkingLot() {
+		return new Queue(PARKING_LOT);
+	}
+
+}
+
+
+
+
+

republishToDlq=true

+
+

When republishToDlq is true, the republishing recoverer adds the original exchange and routing key to headers, as shown in the following example:

+
+
+
+
@SpringBootApplication
+public class ReRouteDlqApplication {
+
+	private static final String ORIGINAL_QUEUE = "so8400in.so8400";
+
+	private static final String DLQ = ORIGINAL_QUEUE + ".dlq";
+
+	private static final String PARKING_LOT = ORIGINAL_QUEUE + ".parkingLot";
+
+	private static final String X_RETRIES_HEADER = "x-retries";
+
+	private static final String X_ORIGINAL_EXCHANGE_HEADER = RepublishMessageRecoverer.X_ORIGINAL_EXCHANGE;
+
+	private static final String X_ORIGINAL_ROUTING_KEY_HEADER = RepublishMessageRecoverer.X_ORIGINAL_ROUTING_KEY;
+
+	public static void main(String[] args) throws Exception {
+		ConfigurableApplicationContext context = SpringApplication.run(ReRouteDlqApplication.class, args);
+		System.out.println("Hit enter to terminate");
+		System.in.read();
+		context.close();
+	}
+
+	@Autowired
+	private RabbitTemplate rabbitTemplate;
+
+	@RabbitListener(queues = DLQ)
+	public void rePublish(Message failedMessage) {
+		Map<String, Object> headers = failedMessage.getMessageProperties().getHeaders();
+		Integer retriesHeader = (Integer) headers.get(X_RETRIES_HEADER);
+		if (retriesHeader == null) {
+			retriesHeader = Integer.valueOf(0);
+		}
+		if (retriesHeader < 3) {
+			headers.put(X_RETRIES_HEADER, retriesHeader + 1);
+			String exchange = (String) headers.get(X_ORIGINAL_EXCHANGE_HEADER);
+			String originalRoutingKey = (String) headers.get(X_ORIGINAL_ROUTING_KEY_HEADER);
+			this.rabbitTemplate.send(exchange, originalRoutingKey, failedMessage);
+		}
+		else {
+			this.rabbitTemplate.send(PARKING_LOT, failedMessage);
+		}
+	}
+
+	@Bean
+	public Queue parkingLot() {
+		return new Queue(PARKING_LOT);
+	}
+
+}
+
+
+
+
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/favicon.ico b/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..1a4956e64705230122da8c19d762a7f8e6971533 GIT binary patch literal 111804 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 literal 0 HcmV?d00001 diff --git a/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/images/rabbit-binder.png b/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/images/rabbit-binder.png new file mode 100644 index 0000000000000000000000000000000000000000..aabf698b3a9873395764d1d974996a22436188a9 GIT binary patch literal 12440 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 literal 0 HcmV?d00001 diff --git a/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/js/highlight/highlight.min.js b/spring-cloud-stream-binder-rabbit/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-rabbit/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-rabbit/3.0.6.RELEASE/reference/html/js/highlight/styles/atom-one-light.min.css b/spring-cloud-stream-binder-rabbit/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-rabbit/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-rabbit/3.0.6.RELEASE/reference/html/js/highlight/styles/github-gist.css b/spring-cloud-stream-binder-rabbit/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-rabbit/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-rabbit/3.0.6.RELEASE/reference/html/js/highlight/styles/github.min.css b/spring-cloud-stream-binder-rabbit/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-rabbit/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-rabbit/3.0.6.RELEASE/reference/html/js/highlight/styles/googlecode.css b/spring-cloud-stream-binder-rabbit/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-rabbit/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-rabbit/3.0.6.RELEASE/reference/html/js/highlight/styles/solarized-light.min.css b/spring-cloud-stream-binder-rabbit/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-rabbit/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-rabbit/3.0.6.RELEASE/reference/html/js/toc.js b/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/js/toc.js new file mode 100644 index 00000000..0b6fcd65 --- /dev/null +++ b/spring-cloud-stream-binder-rabbit/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 = '

\n' + + '

\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '

\n' + + '
'; + +var header = document.createElement("div"); +header.innerHTML = headerHtml; +document.body.insertBefore(header, document.body.firstChild); diff --git a/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/js/tocbot/tocbot.css b/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/js/tocbot/tocbot.css new file mode 100644 index 00000000..0632de23 --- /dev/null +++ b/spring-cloud-stream-binder-rabbit/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-rabbit/3.0.6.RELEASE/reference/html/js/tocbot/tocbot.min.js b/spring-cloud-stream-binder-rabbit/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-rabbit/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 + + + + + + +Usage + + + + + + + + + +
+
+
+
+ +
+
+
+

Usage

+
+
+

To use the RabbitMQ binder, you can add it to your Spring Cloud Stream application, by using the following Maven coordinates:

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

Alternatively, you can use the Spring Cloud Stream RabbitMQ Starter, as follows:

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

RabbitMQ Binder Overview

+
+
+

The following simplified diagram shows how the RabbitMQ binder operates:

+
+
+
+rabbit binder +
+
Figure 1. RabbitMQ Binder
+
+
+

By default, the RabbitMQ Binder implementation maps each destination to a TopicExchange. +For each consumer group, a Queue is bound to that TopicExchange. +Each consumer instance has a corresponding RabbitMQ Consumer instance for its group’s Queue. +For partitioned producers and consumers, the queues are suffixed with the partition index and use the partition index as the routing key. +For anonymous consumers (those with no group property), an auto-delete queue (with a randomized unique name) is used.

+
+
+

By using the optional autoBindDlq option, you can configure the binder to create and configure dead-letter queues (DLQs) (and a dead-letter exchange DLX, as well as routing infrastructure). +By default, the dead letter queue has the name of the destination, appended with .dlq. +If retry is enabled (maxAttempts > 1), failed messages are delivered to the DLQ after retries are exhausted. +If retry is disabled (maxAttempts = 1), you should set requeueRejected to false (the default) so that failed messages are routed to the DLQ, instead of being re-queued. +In addition, republishToDlq causes the binder to publish a failed message to the DLQ (instead of rejecting it). +This feature lets additional information (such as the stack trace in the x-exception-stacktrace header) be added to the message in headers. +See the frameMaxHeadroom property for information about truncated stack traces. +This option does not need retry enabled. +You can republish a failed message after just one attempt. +Starting with version 1.2, you can configure the delivery mode of republished messages. +See the republishDeliveryMode property.

+
+
+

If the stream listener throws an ImmediateAcknowledgeAmqpException, the DLQ is bypassed and the message simply discarded. +Starting with version 2.1, this is true regardless of the setting of republishToDlq; previously it was only the case when republishToDlq was false.

+
+
+ + + + + +
+ + +Setting requeueRejected to true (with republishToDlq=false ) causes the message to be re-queued and redelivered continually, which is likely not what you want unless the reason for the failure is transient. +In general, you should enable retry within the binder by setting maxAttempts to greater than one or by setting republishToDlq to true. +
+
+
+

See RabbitMQ Binder Properties for more information about these properties.

+
+
+

The framework does not provide any standard mechanism to consume dead-letter messages (or to re-route them back to the primary queue). +Some options are described in [rabbit-dlq-processing].

+
+
+ + + + + +
+ + +When multiple RabbitMQ binders are used in a Spring Cloud Stream application, it is important to disable 'RabbitAutoConfiguration' to avoid the same configuration from RabbitAutoConfiguration being applied to the two binders. +You can exclude the class by using the @SpringBootApplication annotation. +
+
+
+

Starting with version 2.0, the RabbitMessageChannelBinder sets the RabbitTemplate.userPublisherConnection property to true so that the non-transactional producers avoid deadlocks on consumers, which can happen if cached connections are blocked because of a memory alarm on the broker.

+
+
+ + + + + +
+ + +Currently, a multiplex consumer (a single consumer listening to multiple queues) is only supported for message-driven conssumers; polled consumers can only retrieve messages from a single queue. +
+
+
+
+
+

Configuration Options

+
+
+

This section contains settings specific to the RabbitMQ Binder and bound channels.

+
+
+

For general binding configuration options and properties, see the Spring Cloud Stream core documentation.

+
+
+

RabbitMQ Binder Properties

+
+

By default, the RabbitMQ binder uses Spring Boot’s ConnectionFactory. +Conseuqently, it supports all Spring Boot configuration options for RabbitMQ. +(For reference, see the Spring Boot documentation). +RabbitMQ configuration options use the spring.rabbitmq prefix.

+
+
+

In addition to Spring Boot options, the RabbitMQ binder supports the following properties:

+
+
+
+
spring.cloud.stream.rabbit.binder.adminAddresses
+
+

A comma-separated list of RabbitMQ management plugin URLs. +Only used when nodes contains more than one entry. +Each entry in this list must have a corresponding entry in spring.rabbitmq.addresses. +Only needed if you use a RabbitMQ cluster and wish to consume from the node that hosts the queue. +See Queue Affinity and the LocalizedQueueConnectionFactory for more information.

+
+

Default: empty.

+
+
+
spring.cloud.stream.rabbit.binder.nodes
+
+

A comma-separated list of RabbitMQ node names. +When more than one entry, used to locate the server address where a queue is located. +Each entry in this list must have a corresponding entry in spring.rabbitmq.addresses. +Only needed if you use a RabbitMQ cluster and wish to consume from the node that hosts the queue. +See Queue Affinity and the LocalizedQueueConnectionFactory for more information.

+
+

Default: empty.

+
+
+
spring.cloud.stream.rabbit.binder.compressionLevel
+
+

The compression level for compressed bindings. +See java.util.zip.Deflater.

+
+

Default: 1 (BEST_LEVEL).

+
+
+
spring.cloud.stream.binder.connection-name-prefix
+
+

A connection name prefix used to name the connection(s) created by this binder. +The name is this prefix followed by #n, where n increments each time a new connection is opened.

+
+

Default: none (Spring AMQP default).

+
+
+
+
+
+
+

RabbitMQ Consumer Properties

+
+

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

+
+
+

However if the same set of properties needs to be applied to most bindings, to +avoid repetition, Spring Cloud Stream supports setting values for all channels, +in the format of spring.cloud.stream.rabbit.default.<property>=<value>.

+
+
+

Also, keep in mind that binding specific property will override its equivalent in the default.

+
+
+
+
acknowledgeMode
+
+

The acknowledge mode.

+
+

Default: AUTO.

+
+
+
anonymousGroupPrefix
+
+

When the binding has no group property, an anonymous, auto-delete queue is bound to the destination exchange. +The default naming stragegy for such queues results in a queue named anonymous.<base64 representation of a UUID>. +Set this property to change the prefix to something other than the default.

+
+

Default: anonymous..

+
+
+
autoBindDlq
+
+

Whether to automatically declare the DLQ and bind it to the binder DLX.

+
+

Default: false.

+
+
+
bindingRoutingKey
+
+

The routing key with which to bind the queue to the exchange (if bindQueue is true). +Can be multiple keys - see bindingRoutingKeyDelimiter. +For partitioned destinations, -<instanceIndex> is appended to each key.

+
+

Default: #.

+
+
+
bindingRoutingKeyDelimiter
+
+

When this is not null, 'bindingRoutingKey' is considered to be a list of keys delimited by this value; often a comma is used.

+
+

Default: null.

+
+
+
bindQueue
+
+

Whether to declare the queue and bind it to the destination exchange. +Set it to false if you have set up your own infrastructure and have previously created and bound the queue.

+
+

Default: true.

+
+
+
consumerTagPrefix
+
+

Used to create the consumer tag(s); will be appended by #n where n increments for each consumer created. +Example: ${spring.application.name}-${spring.cloud.stream.bindings.input.group}-${spring.cloud.stream.instance-index}.

+
+

Default: none - the broker will generate random consumer tags.

+
+
+
containerType
+
+

Select the type of listener container to be used. +See Choosing a Container in the Spring AMQP documentation for more information.

+
+

Default: simple

+
+
+
deadLetterQueueName
+
+

The name of the DLQ

+
+

Default: prefix+destination.dlq

+
+
+
deadLetterExchange
+
+

A DLX to assign to the queue. +Relevant only if autoBindDlq is true.

+
+

Default: 'prefix+DLX'

+
+
+
deadLetterExchangeType
+
+

The type of the DLX to assign to the queue. +Relevant only if autoBindDlq is true.

+
+

Default: 'direct'

+
+
+
deadLetterRoutingKey
+
+

A dead letter routing key to assign to the queue. +Relevant only if autoBindDlq is true.

+
+

Default: destination

+
+
+
declareDlx
+
+

Whether to declare the dead letter exchange for the destination. +Relevant only if autoBindDlq is true. +Set to false if you have a pre-configured DLX.

+
+

Default: true.

+
+
+
declareExchange
+
+

Whether to declare the exchange for the destination.

+
+

Default: true.

+
+
+
delayedExchange
+
+

Whether to declare the exchange as a Delayed Message Exchange. +Requires the delayed message exchange plugin on the broker. +The x-delayed-type argument is set to the exchangeType.

+
+

Default: false.

+
+
+
dlqBindingArguments
+
+

Arguments applied when binding the dlq to the dead letter exchange; used with headers deadLetterExchangeType to specify headers to match on. +For example …​dlqBindingArguments.x-match=any, …​dlqBindingArguments.someHeader=someValue.

+
+

Default: empty

+
+
+
dlqDeadLetterExchange
+
+

If a DLQ is declared, a DLX to assign to that queue.

+
+

Default: none

+
+
+
dlqDeadLetterRoutingKey
+
+

If a DLQ is declared, a dead letter routing key to assign to that queue.

+
+

Default: none

+
+
+
dlqExpires
+
+

How long before an unused dead letter queue is deleted (in milliseconds).

+
+

Default: no expiration

+
+
+
dlqLazy
+
+

Declare the dead letter queue with the x-queue-mode=lazy argument. +See “Lazy Queues”. +Consider using a policy instead of this setting, because using a policy allows changing the setting without deleting the queue.

+
+

Default: false.

+
+
+
dlqMaxLength
+
+

Maximum number of messages in the dead letter queue.

+
+

Default: no limit

+
+
+
dlqMaxLengthBytes
+
+

Maximum number of total bytes in the dead letter queue from all messages.

+
+

Default: no limit

+
+
+
dlqMaxPriority
+
+

Maximum priority of messages in the dead letter queue (0-255).

+
+

Default: none

+
+
+
dlqOverflowBehavior
+
+

Action to take when dlqMaxLength or dlqMaxLengthBytes is exceeded; currently drop-head or reject-publish but refer to the RabbitMQ documentation.

+
+

Default: none

+
+
+
dlqQuorum.deliveryLimit
+
+

When quorum.enabled=true, set a delivery limit after which the message is dropped or dead-lettered.

+
+

Default: none - broker default will apply.

+
+
+
dlqQuorum.enabled
+
+

When true, create a quorum dead letter queue instead of a classic queue.

+
+

Default: false

+
+
+
dlqQuorum.initialQuorumSize
+
+

When quorum.enabled=true, set the initial quorum size.

+
+

Default: none - broker default will apply.

+
+
+
dlqSingleActiveConsumer
+
+

Set to true to set the x-single-active-consumer queue property to true.

+
+

Default: false

+
+
+
dlqTtl
+
+

Default time to live to apply to the dead letter queue when declared (in milliseconds).

+
+

Default: no limit

+
+
+
durableSubscription
+
+

Whether the subscription should be durable. +Only effective if group is also set.

+
+

Default: true.

+
+
+
exchangeAutoDelete
+
+

If declareExchange is true, whether the exchange should be auto-deleted (that is, removed after the last queue is removed).

+
+

Default: true.

+
+
+
exchangeDurable
+
+

If declareExchange is true, whether the exchange should be durable (that is, it survives broker restart).

+
+

Default: true.

+
+
+
exchangeType
+
+

The exchange type: direct, fanout, headers or topic for non-partitioned destinations and direct, headers or topic for partitioned destinations.

+
+

Default: topic.

+
+
+
exclusive
+
+

Whether to create an exclusive consumer. +Concurrency should be 1 when this is true. +Often used when strict ordering is required but enabling a hot standby instance to take over after a failure. +See recoveryInterval, which controls how often a standby instance attempts to consume. +Consider using singleActiveConsumer instead when using RabbitMQ 3.8 or later.

+
+

Default: false.

+
+
+
expires
+
+

How long before an unused queue is deleted (in milliseconds).

+
+

Default: no expiration

+
+
+
failedDeclarationRetryInterval
+
+

The interval (in milliseconds) between attempts to consume from a queue if it is missing.

+
+

Default: 5000

+
+
+
+
+
+
+
frameMaxHeadroom
+
+

The number of bytes to reserve for other headers when adding the stack trace to a DLQ message header. +All headers must fit within the frame_max size configured on the broker. +Stack traces can be large; if the size plus this property exceeds frame_max then the stack trace will be truncated. +A WARN log will be written; consider increasing the frame_max or reducing the stack trace by catching the exception and throwing one with a smaller stack trace.

+
+

Default: 20000

+
+
+
headerPatterns
+
+

Patterns for headers to be mapped from inbound messages.

+
+

Default: ['*'] (all headers).

+
+
+
lazy
+
+

Declare the queue with the x-queue-mode=lazy argument. +See “Lazy Queues”. +Consider using a policy instead of this setting, because using a policy allows changing the setting without deleting the queue.

+
+

Default: false.

+
+
+
maxConcurrency
+
+

The maximum number of consumers. +Not supported when the containerType is direct.

+
+

Default: 1.

+
+
+
maxLength
+
+

The maximum number of messages in the queue.

+
+

Default: no limit

+
+
+
maxLengthBytes
+
+

The maximum number of total bytes in the queue from all messages.

+
+

Default: no limit

+
+
+
maxPriority
+
+

The maximum priority of messages in the queue (0-255).

+
+

Default: none

+
+
+
missingQueuesFatal
+
+

When the queue cannot be found, whether to treat the condition as fatal and stop the listener container. +Defaults to false so that the container keeps trying to consume from the queue — for example, when using a cluster and the node hosting a non-HA queue is down.

+
+

Default: false

+
+
+
overflowBehavior
+
+

Action to take when maxLength or maxLengthBytes is exceeded; currently drop-head or reject-publish but refer to the RabbitMQ documentation.

+
+

Default: none

+
+
+
prefetch
+
+

Prefetch count.

+
+

Default: 1.

+
+
+
prefix
+
+

A prefix to be added to the name of the destination and queues.

+
+

Default: "".

+
+
+
queueBindingArguments
+
+

Arguments applied when binding the queue to the exchange; used with headers exchangeType to specify headers to match on. +For example …​queueBindingArguments.x-match=any, …​queueBindingArguments.someHeader=someValue.

+
+

Default: empty

+
+
+
queueDeclarationRetries
+
+

The number of times to retry consuming from a queue if it is missing. +Relevant only when missingQueuesFatal is true. +Otherwise, the container keeps retrying indefinitely. +Not supported when the containerType is direct.

+
+

Default: 3

+
+
+
queueNameGroupOnly
+
+

When true, consume from a queue with a name equal to the group. +Otherwise the queue name is destination.group. +This is useful, for example, when using Spring Cloud Stream to consume from an existing RabbitMQ queue.

+
+

Default: false.

+
+
+
quorum.deliveryLimit
+
+

When quorum.enabled=true, set a delivery limit after which the message is dropped or dead-lettered.

+
+

Default: none - broker default will apply.

+
+
+
quorum.enabled
+
+

When true, create a quorum queue instead of a classic queue.

+
+

Default: false

+
+
+
quorum.initialQuorumSize
+
+

When quorum.enabled=true, set the initial quorum size.

+
+

Default: none - broker default will apply.

+
+
+
recoveryInterval
+
+

The interval between connection recovery attempts, in milliseconds.

+
+

Default: 5000.

+
+
+
requeueRejected
+
+

Whether delivery failures should be re-queued when retry is disabled or republishToDlq is false.

+
+

Default: false.

+
+
+
+
+
+
+
republishDeliveryMode
+
+

When republishToDlq is true, specifies the delivery mode of the republished message.

+
+

Default: DeliveryMode.PERSISTENT

+
+
+
republishToDlq
+
+

By default, messages that fail after retries are exhausted are rejected. +If a dead-letter queue (DLQ) is configured, RabbitMQ routes the failed message (unchanged) to the DLQ. +If set to true, the binder republishs failed messages to the DLQ with additional headers, including the exception message and stack trace from the cause of the final failure. +Also see the frameMaxHeadroom property.

+
+

Default: false

+
+
+
singleActiveConsumer
+
+

Set to true to set the x-single-active-consumer queue property to true.

+
+

Default: false

+
+
+
transacted
+
+

Whether to use transacted channels.

+
+

Default: false.

+
+
+
ttl
+
+

Default time to live to apply to the queue when declared (in milliseconds).

+
+

Default: no limit

+
+
+
txSize
+
+

The number of deliveries between acks. +Not supported when the containerType is direct.

+
+

Default: 1.

+
+
+
+
+
+
+

Advanced Listener Container Configuration

+
+

To set listener container properties that are not exposed as binder or binding properties, add a single bean of type ListenerContainerCustomizer to the application context. +The binder and binding properties will be set and then the customizer will be called. +The customizer (configure() method) is provided with the queue name as well as the consumer group as arguments.

+
+
+
+

Advanced Queue/Exchange/Binding Configuration

+
+

From time to time, the RabbitMQ team add new features that are enabled by setting some argument when declaring, for example, a queue. +Generally, such features are enabled in the binder by adding appropriate properties, but this may not be immediately available in a current version. +Starting with version 3.0.1, you can now add DeclarableCustomizer bean(s) to the application context to modify a Declarable (Queue, Exchange or Binding) just before the declaration is performed. +This allows you to add arguments that are not currently directly supported by the binder.

+
+
+
+

Receiving Batched Messages

+
+

Normally, if a producer binding has batch-enabled=true (see Rabbit Producer Properties), or a message is created by a BatchingRabbitTemplate, elements of the batch are returned as individual calls to the listener method. +Starting with version 3.0, any such batch can be presented as a List<?> to the listener method if spring.cloud.stream.bindings.<name>.consumer.batch-mode is set to true.

+
+
+
+

Rabbit Producer Properties

+
+

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

+
+
+

However if the same set of properties needs to be applied to most bindings, to +avoid repetition, Spring Cloud Stream supports setting values for all channels, +in the format of spring.cloud.stream.rabbit.default.<property>=<value>.

+
+
+

Also, keep in mind that binding specific property will override its equivalent in the default.

+
+
+
+
autoBindDlq
+
+

Whether to automatically declare the DLQ and bind it to the binder DLX.

+
+

Default: false.

+
+
+
batchingEnabled
+
+

Whether to enable message batching by producers. +Messages are batched into one message according to the following properties (described in the next three entries in this list): 'batchSize', batchBufferLimit, and batchTimeout. +See Batching for more information. +Also see Receiving Batched Messages.

+
+

Default: false.

+
+
+
batchSize
+
+

The number of messages to buffer when batching is enabled.

+
+

Default: 100.

+
+
+
batchBufferLimit
+
+

The maximum buffer size when batching is enabled.

+
+

Default: 10000.

+
+
+
batchTimeout
+
+

The batch timeout when batching is enabled.

+
+

Default: 5000.

+
+
+
bindingRoutingKey
+
+

The routing key with which to bind the queue to the exchange (if bindQueue is true). +Can be multiple keys - see bindingRoutingKeyDelimiter. +For partitioned destinations, -n is appended to each key. +Only applies if requiredGroups are provided and then only to those groups.

+
+

Default: #.

+
+
+
bindingRoutingKeyDelimiter
+
+

When this is not null, 'bindingRoutingKey' is considered to be a list of keys delimited by this value; often a comma is used. +Only applies if requiredGroups are provided and then only to those groups.

+
+

Default: null.

+
+
+
bindQueue
+
+

Whether to declare the queue and bind it to the destination exchange. +Set it to false if you have set up your own infrastructure and have previously created and bound the queue. +Only applies if requiredGroups are provided and then only to those groups.

+
+

Default: true.

+
+
+
compress
+
+

Whether data should be compressed when sent.

+
+

Default: false.

+
+
+
confirmAckChannel
+
+

When errorChannelEnabled is true, a channel to which to send positive delivery acknowledgments (aka publisher confirms). +If the channel does not exist, a DirectChannel is registered with this name. +The connection factory must be configured to enable publisher confirms.

+
+

Default: nullChannel (acks are discarded).

+
+
+
deadLetterQueueName
+
+

The name of the DLQ +Only applies if requiredGroups are provided and then only to those groups.

+
+

Default: prefix+destination.dlq

+
+
+
deadLetterExchange
+
+

A DLX to assign to the queue. +Relevant only when autoBindDlq is true. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: 'prefix+DLX'

+
+
+
deadLetterExchangeType
+
+

The type of the DLX to assign to the queue. +Relevant only if autoBindDlq is true. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: 'direct'

+
+
+
deadLetterRoutingKey
+
+

A dead letter routing key to assign to the queue. +Relevant only when autoBindDlq is true. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: destination

+
+
+
declareDlx
+
+

Whether to declare the dead letter exchange for the destination. +Relevant only if autoBindDlq is true. +Set to false if you have a pre-configured DLX. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: true.

+
+
+
declareExchange
+
+

Whether to declare the exchange for the destination.

+
+

Default: true.

+
+
+
delayExpression
+
+

A SpEL expression to evaluate the delay to apply to the message (x-delay header). +It has no effect if the exchange is not a delayed message exchange.

+
+

Default: No x-delay header is set.

+
+
+
delayedExchange
+
+

Whether to declare the exchange as a Delayed Message Exchange. +Requires the delayed message exchange plugin on the broker. +The x-delayed-type argument is set to the exchangeType.

+
+

Default: false.

+
+
+
deliveryMode
+
+

The delivery mode.

+
+

Default: PERSISTENT.

+
+
+
dlqBindingArguments
+
+

Arguments applied when binding the dlq to the dead letter exchange; used with headers deadLetterExchangeType to specify headers to match on. +For example …​dlqBindingArguments.x-match=any, …​dlqBindingArguments.someHeader=someValue. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: empty

+
+
+
dlqDeadLetterExchange
+
+

When a DLQ is declared, a DLX to assign to that queue. +Applies only if requiredGroups are provided and then only to those groups.

+
+

Default: none

+
+
+
dlqDeadLetterRoutingKey
+
+

When a DLQ is declared, a dead letter routing key to assign to that queue. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: none

+
+
+
dlqExpires
+
+

How long (in milliseconds) before an unused dead letter queue is deleted. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: no expiration

+
+
+
dlqLazy
+
+

Declare the dead letter queue with the x-queue-mode=lazy argument. +See “Lazy Queues”. +Consider using a policy instead of this setting, because using a policy allows changing the setting without deleting the queue. +Applies only when requiredGroups are provided and then only to those groups.

+
+
dlqMaxLength
+
+

Maximum number of messages in the dead letter queue. +Applies only if requiredGroups are provided and then only to those groups.

+
+

Default: no limit

+
+
+
dlqMaxLengthBytes
+
+

Maximum number of total bytes in the dead letter queue from all messages. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: no limit

+
+
+
dlqMaxPriority
+
+

Maximum priority of messages in the dead letter queue (0-255) +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: none

+
+
+
dlqQuorum.deliveryLimit
+
+

When quorum.enabled=true, set a delivery limit after which the message is dropped or dead-lettered. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: none - broker default will apply.

+
+
+
dlqQuorum.enabled
+
+

When true, create a quorum dead letter queue instead of a classic queue. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: false

+
+
+
dlqQuorum.initialQuorumSize
+
+

When quorum.enabled=true, set the initial quorum size. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: none - broker default will apply.

+
+
+
dlqSingleActiveConsumer
+
+

Set to true to set the x-single-active-consumer queue property to true. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: false

+
+
+
dlqTtl
+
+

Default time (in milliseconds) to live to apply to the dead letter queue when declared. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: no limit

+
+
+
exchangeAutoDelete
+
+

If declareExchange is true, whether the exchange should be auto-delete (it is removed after the last queue is removed).

+
+

Default: true.

+
+
+
exchangeDurable
+
+

If declareExchange is true, whether the exchange should be durable (survives broker restart).

+
+

Default: true.

+
+
+
exchangeType
+
+

The exchange type: direct, fanout, headers or topic for non-partitioned destinations and direct, headers or topic for partitioned destinations.

+
+

Default: topic.

+
+
+
expires
+
+

How long (in milliseconds) before an unused queue is deleted. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: no expiration

+
+
+
headerPatterns
+
+

Patterns for headers to be mapped to outbound messages.

+
+

Default: ['*'] (all headers).

+
+
+
lazy
+
+

Declare the queue with the x-queue-mode=lazy argument. +See “Lazy Queues”. +Consider using a policy instead of this setting, because using a policy allows changing the setting without deleting the queue. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: false.

+
+
+
maxLength
+
+

Maximum number of messages in the queue. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: no limit

+
+
+
maxLengthBytes
+
+

Maximum number of total bytes in the queue from all messages. +Only applies if requiredGroups are provided and then only to those groups.

+
+

Default: no limit

+
+
+
maxPriority
+
+

Maximum priority of messages in the queue (0-255). +Only applies if requiredGroups are provided and then only to those groups.

+
+

Default: none

+
+
+
prefix
+
+

A prefix to be added to the name of the destination exchange.

+
+

Default: "".

+
+
+
queueBindingArguments
+
+

Arguments applied when binding the queue to the exchange; used with headers exchangeType to specify headers to match on. +For example …​queueBindingArguments.x-match=any, …​queueBindingArguments.someHeader=someValue. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: empty

+
+
+
queueNameGroupOnly
+
+

When true, consume from a queue with a name equal to the group. +Otherwise the queue name is destination.group. +This is useful, for example, when using Spring Cloud Stream to consume from an existing RabbitMQ queue. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: false.

+
+
+
quorum.deliveryLimit
+
+

When quorum.enabled=true, set a delivery limit after which the message is dropped or dead-lettered. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: none - broker default will apply.

+
+
+
quorum.enabled
+
+

When true, create a quorum queue instead of a classic queue. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: false

+
+
+
quorum.initialQuorumSize
+
+

When quorum.enabled=true, set the initial quorum size. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: none - broker default will apply.

+
+
+
routingKeyExpression
+
+

A SpEL expression to determine the routing key to use when publishing messages. +For a fixed routing key, use a literal expression, such as routingKeyExpression='my.routingKey' in a properties file or routingKeyExpression: '''my.routingKey''' in a YAML file.

+
+

Default: destination or destination-<partition> for partitioned destinations.

+
+
+
singleActiveConsumer
+
+

Set to true to set the x-single-active-consumer queue property to true. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: false

+
+
+
transacted
+
+

Whether to use transacted channels.

+
+

Default: false.

+
+
+
ttl
+
+

Default time (in milliseconds) to live to apply to the queue when declared. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: no limit

+
+
+
+
+
+ + + + + +
+ + +In the case of RabbitMQ, content type headers can be set by external applications. +Spring Cloud Stream supports them as part of an extended internal protocol used for any type of transport — including transports, such as Kafka (prior to 0.11), that do not natively support headers. +
+
+
+
+
+
+

Using Existing Queues/Exchanges

+
+
+

By default, the binder will automatically provision a topic exchange with the name being derived from the value of the destination binding property <prefix><destination>. +The destination defaults to the binding name, if not provided. +When binding a consumer, a queue will automatically be provisioned with the name <prefix><destination>.<group> (if a group binding property is specified), or an anonymous, auto-delete queue when there is no group. +The queue will be bound to the exchange with the "match-all" wildcard routing key (#) for a non-partitioned binding or <destination>-<instanceIndex> for a partitioned binding. +The prefix is an empty String by default. +If an output binding is specified with requiredGroups, a queue/binding will be provisioned for each group.

+
+
+

There are a number of rabbit-specific binding properties that allow you to modify this default behavior.

+
+
+

If you have an existing exchange/queue that you wish to use, you can completely disable automatic provisioning as follows, assuming the exchange is named myExchange and the queue is named myQueue:

+
+
+
    +
  • +

    spring.cloud.stream.bindings.<binding name>.destination=myExhange

    +
  • +
  • +

    spring.cloud.stream.bindings.<binding name>.group=myQueue

    +
  • +
  • +

    spring.cloud.stream.rabbit.bindings.<binding name>.consumer.bindQueue=false

    +
  • +
  • +

    spring.cloud.stream.rabbit.bindings.<binding name>.consumer.declareExchange=false

    +
  • +
  • +

    spring.cloud.stream.rabbit.bindings.<binding name>.consumer.queueNameGroupOnly=true

    +
  • +
+
+
+

If you want the binder to provision the queue/exchange, but you want to do it using something other than the defaults discussed here, use the following properties. +Refer to the property documentation above for more information.

+
+
+
    +
  • +

    spring.cloud.stream.rabbit.bindings.<binding name>.consumer.bindingRoutingKey=myRoutingKey

    +
  • +
  • +

    spring.cloud.stream.rabbit.bindings.<binding name>.consumer.exchangeType=<type>

    +
  • +
  • +

    spring.cloud.stream.rabbit.bindings.<binding name>.producer.routingKeyExpression='myRoutingKey'

    +
  • +
+
+
+

There are similar properties used when declaring a dead-letter exchange/queue, when autoBindDlq is true.

+
+
+
+
+

Retry With the RabbitMQ Binder

+
+
+

When retry is enabled within the binder, the listener container thread is suspended for any back off periods that are configured. +This might be important when strict ordering is required with a single consumer. However, for other use cases, it prevents other messages from being processed on that thread. +An alternative to using binder retry is to set up dead lettering with time to live on the dead-letter queue (DLQ) as well as dead-letter configuration on the DLQ itself. +See “RabbitMQ Binder Properties” for more information about the properties discussed here. +You can use the following example configuration to enable this feature:

+
+
+
    +
  • +

    Set autoBindDlq to true. +The binder create a DLQ. +Optionally, you can specify a name in deadLetterQueueName.

    +
  • +
  • +

    Set dlqTtl to the back off time you want to wait between redeliveries.

    +
  • +
  • +

    Set the dlqDeadLetterExchange to the default exchange. +Expired messages from the DLQ are routed to the original queue, because the default deadLetterRoutingKey is the queue name (destination.group). +Setting to the default exchange is achieved by setting the property with no value, as shown in the next example.

    +
  • +
+
+
+

To force a message to be dead-lettered, either throw an AmqpRejectAndDontRequeueException or set requeueRejected to true (the default) and throw any exception.

+
+
+

The loop continue without end, which is fine for transient problems, but you may want to give up after some number of attempts. +Fortunately, RabbitMQ provides the x-death header, which lets you determine how many cycles have occurred.

+
+
+

To acknowledge a message after giving up, throw an ImmediateAcknowledgeAmqpException.

+
+
+

Putting it All Together

+
+

The following configuration creates an exchange myDestination with queue myDestination.consumerGroup bound to a topic exchange with a wildcard routing key #:

+
+
+
+
---
+spring.cloud.stream.bindings.input.destination=myDestination
+spring.cloud.stream.bindings.input.group=consumerGroup
+#disable binder retries
+spring.cloud.stream.bindings.input.consumer.max-attempts=1
+#dlx/dlq setup
+spring.cloud.stream.rabbit.bindings.input.consumer.auto-bind-dlq=true
+spring.cloud.stream.rabbit.bindings.input.consumer.dlq-ttl=5000
+spring.cloud.stream.rabbit.bindings.input.consumer.dlq-dead-letter-exchange=
+---
+
+
+
+

This configuration creates a DLQ bound to a direct exchange (DLX) with a routing key of myDestination.consumerGroup. +When messages are rejected, they are routed to the DLQ. +After 5 seconds, the message expires and is routed to the original queue by using the queue name as the routing key, as shown in the following example:

+
+
+
Spring Boot application
+
+
@SpringBootApplication
+@EnableBinding(Sink.class)
+public class XDeathApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(XDeathApplication.class, args);
+    }
+
+    @StreamListener(Sink.INPUT)
+    public void listen(String in, @Header(name = "x-death", required = false) Map<?,?> death) {
+        if (death != null && death.get("count").equals(3L)) {
+            // giving up - don't send to DLX
+            throw new ImmediateAcknowledgeAmqpException("Failed after 4 attempts");
+        }
+        throw new AmqpRejectAndDontRequeueException("failed");
+    }
+
+}
+
+
+
+

Notice that the count property in the x-death header is a Long.

+
+
+
+
+
+

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.

+
+
+

RabbitMQ has two types of send failures:

+
+
+ +
+
+

The latter is rare. +According to the RabbitMQ documentation "[A nack] will only be delivered if an internal error occurs in the Erlang process responsible for a queue.".

+
+
+

As well as enabling producer error channels (as described in “[spring-cloud-stream-overview-error-handling]”), the RabbitMQ binder only sends messages to the channels if the connection factory is appropriately configured, as follows:

+
+
+
    +
  • +

    ccf.setPublisherConfirms(true);

    +
  • +
  • +

    ccf.setPublisherReturns(true);

    +
  • +
+
+
+

When using Spring Boot configuration for the connection factory, set the following properties:

+
+
+
    +
  • +

    spring.rabbitmq.publisher-confirms

    +
  • +
  • +

    spring.rabbitmq.publisher-returns

    +
  • +
+
+
+

The payload of the ErrorMessage for a returned message is a ReturnedAmqpMessageException with the following properties:

+
+
+
    +
  • +

    failedMessage: The spring-messaging Message<?> that failed to be sent.

    +
  • +
  • +

    amqpMessage: The raw spring-amqp Message.

    +
  • +
  • +

    replyCode: An integer value indicating the reason for the failure (for example, 312 - No route).

    +
  • +
  • +

    replyText: A text value indicating the reason for the failure (for example, NO_ROUTE).

    +
  • +
  • +

    exchange: The exchange to which the message was published.

    +
  • +
  • +

    routingKey: The routing key used when the message was published.

    +
  • +
+
+
+

For negatively acknowledged confirmations, the payload is a NackedAmqpMessageException with the following properties:

+
+
+
    +
  • +

    failedMessage: The spring-messaging Message<?> that failed to be sent.

    +
  • +
  • +

    nackReason: A reason (if available — you may need to examine the broker logs for more information).

    +
  • +
+
+
+

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

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

Partitioning with the RabbitMQ Binder

+
+
+

RabbitMQ does not support 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 RabbitMessageChannelBinder provides partitioning by binding a queue for each partition to the destination exchange.

+
+
+

The following Java and YAML examples show how to configure the producer:

+
+
+
Producer
+
+
@SpringBootApplication
+@EnableBinding(Source.class)
+public class RabbitPartitionProducerApplication {
+
+    private static final Random RANDOM = new Random(System.currentTimeMillis());
+
+    private static final String[] data = new String[] {
+            "abc1", "def1", "qux1",
+            "abc2", "def2", "qux2",
+            "abc3", "def3", "qux3",
+            "abc4", "def4", "qux4",
+            };
+
+    public static void main(String[] args) {
+        new SpringApplicationBuilder(RabbitPartitionProducerApplication.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.destination
+              producer:
+                partitioned: true
+                partition-key-expression: headers['partitionKey']
+                partition-count: 2
+                required-groups:
+                - myGroup
+
+
+
+ + + + + +
+ + +
+

The configuration in the prececing example 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.

+
+
+

The required-groups property is required only if you need the consumer queues to be provisioned when the producer is deployed. +Otherwise, any messages sent to a partition are lost until the corresponding consumer is deployed.

+
+
+
+
+

The following configuration provisions a topic exchange:

+
+
+
+part exchange +
+
+
+

The following queues are bound to that exchange:

+
+
+
+part queues +
+
+
+

The following bindings associate the queues to the exchange:

+
+
+
+part bindings +
+
+
+

The following Java and YAML examples continue the previous examples and show how to configure the consumer:

+
+
+
Consumer
+
+
@SpringBootApplication
+@EnableBinding(Sink.class)
+public class RabbitPartitionConsumerApplication {
+
+    public static void main(String[] args) {
+        new SpringApplicationBuilder(RabbitPartitionConsumerApplication.class)
+            .web(false)
+            .run(args);
+    }
+
+    @StreamListener(Sink.INPUT)
+    public void listen(@Payload String in, @Header(AmqpHeaders.CONSUMER_QUEUE) String queue) {
+        System.out.println(in + " received from queue " + queue);
+    }
+
+}
+
+
+
+
application.yml
+
+
    spring:
+      cloud:
+        stream:
+          bindings:
+            input:
+              destination: partitioned.destination
+              group: myGroup
+              consumer:
+                partitioned: true
+                instance-index: 0
+
+
+
+ + + + + +
+ + +The RabbitMessageChannelBinder does not support dynamic scaling. +There must be at least one consumer per partition. +The consumer’s instanceIndex is used to indicate which partition is consumed. +Platforms such as Cloud Foundry can have only one instance with an instanceIndex. +
+
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/spring-cloud-stream-binder-rabbit-aggregate.html b/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/spring-cloud-stream-binder-rabbit-aggregate.html new file mode 100644 index 00000000..44b632c7 --- /dev/null +++ b/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/spring-cloud-stream-binder-rabbit-aggregate.html @@ -0,0 +1,1907 @@ + + + + + + + +Usage + + + + + + + + + + +
+
+
+ +
+
+
+

Usage

+
+

To use the RabbitMQ binder, you can add it to your Spring Cloud Stream application, by using the following Maven coordinates:

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

Alternatively, you can use the Spring Cloud Stream RabbitMQ Starter, as follows:

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

RabbitMQ Binder Overview

+
+

The following simplified diagram shows how the RabbitMQ binder operates:

+
+
+
+rabbit binder +
+
Figure 1. RabbitMQ Binder
+
+
+

By default, the RabbitMQ Binder implementation maps each destination to a TopicExchange. +For each consumer group, a Queue is bound to that TopicExchange. +Each consumer instance has a corresponding RabbitMQ Consumer instance for its group’s Queue. +For partitioned producers and consumers, the queues are suffixed with the partition index and use the partition index as the routing key. +For anonymous consumers (those with no group property), an auto-delete queue (with a randomized unique name) is used.

+
+
+

By using the optional autoBindDlq option, you can configure the binder to create and configure dead-letter queues (DLQs) (and a dead-letter exchange DLX, as well as routing infrastructure). +By default, the dead letter queue has the name of the destination, appended with .dlq. +If retry is enabled (maxAttempts > 1), failed messages are delivered to the DLQ after retries are exhausted. +If retry is disabled (maxAttempts = 1), you should set requeueRejected to false (the default) so that failed messages are routed to the DLQ, instead of being re-queued. +In addition, republishToDlq causes the binder to publish a failed message to the DLQ (instead of rejecting it). +This feature lets additional information (such as the stack trace in the x-exception-stacktrace header) be added to the message in headers. +See the frameMaxHeadroom property for information about truncated stack traces. +This option does not need retry enabled. +You can republish a failed message after just one attempt. +Starting with version 1.2, you can configure the delivery mode of republished messages. +See the republishDeliveryMode property.

+
+
+

If the stream listener throws an ImmediateAcknowledgeAmqpException, the DLQ is bypassed and the message simply discarded. +Starting with version 2.1, this is true regardless of the setting of republishToDlq; previously it was only the case when republishToDlq was false.

+
+
+ + + + + +
+ + +Setting requeueRejected to true (with republishToDlq=false ) causes the message to be re-queued and redelivered continually, which is likely not what you want unless the reason for the failure is transient. +In general, you should enable retry within the binder by setting maxAttempts to greater than one or by setting republishToDlq to true. +
+
+
+

See RabbitMQ Binder Properties for more information about these properties.

+
+
+

The framework does not provide any standard mechanism to consume dead-letter messages (or to re-route them back to the primary queue). +Some options are described in Dead-Letter Queue Processing.

+
+
+ + + + + +
+ + +When multiple RabbitMQ binders are used in a Spring Cloud Stream application, it is important to disable 'RabbitAutoConfiguration' to avoid the same configuration from RabbitAutoConfiguration being applied to the two binders. +You can exclude the class by using the @SpringBootApplication annotation. +
+
+
+

Starting with version 2.0, the RabbitMessageChannelBinder sets the RabbitTemplate.userPublisherConnection property to true so that the non-transactional producers avoid deadlocks on consumers, which can happen if cached connections are blocked because of a memory alarm on the broker.

+
+
+ + + + + +
+ + +Currently, a multiplex consumer (a single consumer listening to multiple queues) is only supported for message-driven conssumers; polled consumers can only retrieve messages from a single queue. +
+
+
+
+

Configuration Options

+
+

This section contains settings specific to the RabbitMQ Binder and bound channels.

+
+
+

For general binding configuration options and properties, see the Spring Cloud Stream core documentation.

+
+
+

RabbitMQ Binder Properties

+
+

By default, the RabbitMQ binder uses Spring Boot’s ConnectionFactory. +Conseuqently, it supports all Spring Boot configuration options for RabbitMQ. +(For reference, see the Spring Boot documentation). +RabbitMQ configuration options use the spring.rabbitmq prefix.

+
+
+

In addition to Spring Boot options, the RabbitMQ binder supports the following properties:

+
+
+
+
spring.cloud.stream.rabbit.binder.adminAddresses
+
+

A comma-separated list of RabbitMQ management plugin URLs. +Only used when nodes contains more than one entry. +Each entry in this list must have a corresponding entry in spring.rabbitmq.addresses. +Only needed if you use a RabbitMQ cluster and wish to consume from the node that hosts the queue. +See Queue Affinity and the LocalizedQueueConnectionFactory for more information.

+
+

Default: empty.

+
+
+
spring.cloud.stream.rabbit.binder.nodes
+
+

A comma-separated list of RabbitMQ node names. +When more than one entry, used to locate the server address where a queue is located. +Each entry in this list must have a corresponding entry in spring.rabbitmq.addresses. +Only needed if you use a RabbitMQ cluster and wish to consume from the node that hosts the queue. +See Queue Affinity and the LocalizedQueueConnectionFactory for more information.

+
+

Default: empty.

+
+
+
spring.cloud.stream.rabbit.binder.compressionLevel
+
+

The compression level for compressed bindings. +See java.util.zip.Deflater.

+
+

Default: 1 (BEST_LEVEL).

+
+
+
spring.cloud.stream.binder.connection-name-prefix
+
+

A connection name prefix used to name the connection(s) created by this binder. +The name is this prefix followed by #n, where n increments each time a new connection is opened.

+
+

Default: none (Spring AMQP default).

+
+
+
+
+
+
+

RabbitMQ Consumer Properties

+
+

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

+
+
+

However if the same set of properties needs to be applied to most bindings, to +avoid repetition, Spring Cloud Stream supports setting values for all channels, +in the format of spring.cloud.stream.rabbit.default.<property>=<value>.

+
+
+

Also, keep in mind that binding specific property will override its equivalent in the default.

+
+
+
+
acknowledgeMode
+
+

The acknowledge mode.

+
+

Default: AUTO.

+
+
+
anonymousGroupPrefix
+
+

When the binding has no group property, an anonymous, auto-delete queue is bound to the destination exchange. +The default naming stragegy for such queues results in a queue named anonymous.<base64 representation of a UUID>. +Set this property to change the prefix to something other than the default.

+
+

Default: anonymous..

+
+
+
autoBindDlq
+
+

Whether to automatically declare the DLQ and bind it to the binder DLX.

+
+

Default: false.

+
+
+
bindingRoutingKey
+
+

The routing key with which to bind the queue to the exchange (if bindQueue is true). +Can be multiple keys - see bindingRoutingKeyDelimiter. +For partitioned destinations, -<instanceIndex> is appended to each key.

+
+

Default: #.

+
+
+
bindingRoutingKeyDelimiter
+
+

When this is not null, 'bindingRoutingKey' is considered to be a list of keys delimited by this value; often a comma is used.

+
+

Default: null.

+
+
+
bindQueue
+
+

Whether to declare the queue and bind it to the destination exchange. +Set it to false if you have set up your own infrastructure and have previously created and bound the queue.

+
+

Default: true.

+
+
+
consumerTagPrefix
+
+

Used to create the consumer tag(s); will be appended by #n where n increments for each consumer created. +Example: ${spring.application.name}-${spring.cloud.stream.bindings.input.group}-${spring.cloud.stream.instance-index}.

+
+

Default: none - the broker will generate random consumer tags.

+
+
+
containerType
+
+

Select the type of listener container to be used. +See Choosing a Container in the Spring AMQP documentation for more information.

+
+

Default: simple

+
+
+
deadLetterQueueName
+
+

The name of the DLQ

+
+

Default: prefix+destination.dlq

+
+
+
deadLetterExchange
+
+

A DLX to assign to the queue. +Relevant only if autoBindDlq is true.

+
+

Default: 'prefix+DLX'

+
+
+
deadLetterExchangeType
+
+

The type of the DLX to assign to the queue. +Relevant only if autoBindDlq is true.

+
+

Default: 'direct'

+
+
+
deadLetterRoutingKey
+
+

A dead letter routing key to assign to the queue. +Relevant only if autoBindDlq is true.

+
+

Default: destination

+
+
+
declareDlx
+
+

Whether to declare the dead letter exchange for the destination. +Relevant only if autoBindDlq is true. +Set to false if you have a pre-configured DLX.

+
+

Default: true.

+
+
+
declareExchange
+
+

Whether to declare the exchange for the destination.

+
+

Default: true.

+
+
+
delayedExchange
+
+

Whether to declare the exchange as a Delayed Message Exchange. +Requires the delayed message exchange plugin on the broker. +The x-delayed-type argument is set to the exchangeType.

+
+

Default: false.

+
+
+
dlqBindingArguments
+
+

Arguments applied when binding the dlq to the dead letter exchange; used with headers deadLetterExchangeType to specify headers to match on. +For example …​dlqBindingArguments.x-match=any, …​dlqBindingArguments.someHeader=someValue.

+
+

Default: empty

+
+
+
dlqDeadLetterExchange
+
+

If a DLQ is declared, a DLX to assign to that queue.

+
+

Default: none

+
+
+
dlqDeadLetterRoutingKey
+
+

If a DLQ is declared, a dead letter routing key to assign to that queue.

+
+

Default: none

+
+
+
dlqExpires
+
+

How long before an unused dead letter queue is deleted (in milliseconds).

+
+

Default: no expiration

+
+
+
dlqLazy
+
+

Declare the dead letter queue with the x-queue-mode=lazy argument. +See “Lazy Queues”. +Consider using a policy instead of this setting, because using a policy allows changing the setting without deleting the queue.

+
+

Default: false.

+
+
+
dlqMaxLength
+
+

Maximum number of messages in the dead letter queue.

+
+

Default: no limit

+
+
+
dlqMaxLengthBytes
+
+

Maximum number of total bytes in the dead letter queue from all messages.

+
+

Default: no limit

+
+
+
dlqMaxPriority
+
+

Maximum priority of messages in the dead letter queue (0-255).

+
+

Default: none

+
+
+
dlqOverflowBehavior
+
+

Action to take when dlqMaxLength or dlqMaxLengthBytes is exceeded; currently drop-head or reject-publish but refer to the RabbitMQ documentation.

+
+

Default: none

+
+
+
dlqQuorum.deliveryLimit
+
+

When quorum.enabled=true, set a delivery limit after which the message is dropped or dead-lettered.

+
+

Default: none - broker default will apply.

+
+
+
dlqQuorum.enabled
+
+

When true, create a quorum dead letter queue instead of a classic queue.

+
+

Default: false

+
+
+
dlqQuorum.initialQuorumSize
+
+

When quorum.enabled=true, set the initial quorum size.

+
+

Default: none - broker default will apply.

+
+
+
dlqSingleActiveConsumer
+
+

Set to true to set the x-single-active-consumer queue property to true.

+
+

Default: false

+
+
+
dlqTtl
+
+

Default time to live to apply to the dead letter queue when declared (in milliseconds).

+
+

Default: no limit

+
+
+
durableSubscription
+
+

Whether the subscription should be durable. +Only effective if group is also set.

+
+

Default: true.

+
+
+
exchangeAutoDelete
+
+

If declareExchange is true, whether the exchange should be auto-deleted (that is, removed after the last queue is removed).

+
+

Default: true.

+
+
+
exchangeDurable
+
+

If declareExchange is true, whether the exchange should be durable (that is, it survives broker restart).

+
+

Default: true.

+
+
+
exchangeType
+
+

The exchange type: direct, fanout, headers or topic for non-partitioned destinations and direct, headers or topic for partitioned destinations.

+
+

Default: topic.

+
+
+
exclusive
+
+

Whether to create an exclusive consumer. +Concurrency should be 1 when this is true. +Often used when strict ordering is required but enabling a hot standby instance to take over after a failure. +See recoveryInterval, which controls how often a standby instance attempts to consume. +Consider using singleActiveConsumer instead when using RabbitMQ 3.8 or later.

+
+

Default: false.

+
+
+
expires
+
+

How long before an unused queue is deleted (in milliseconds).

+
+

Default: no expiration

+
+
+
failedDeclarationRetryInterval
+
+

The interval (in milliseconds) between attempts to consume from a queue if it is missing.

+
+

Default: 5000

+
+
+
+
+
+
+
frameMaxHeadroom
+
+

The number of bytes to reserve for other headers when adding the stack trace to a DLQ message header. +All headers must fit within the frame_max size configured on the broker. +Stack traces can be large; if the size plus this property exceeds frame_max then the stack trace will be truncated. +A WARN log will be written; consider increasing the frame_max or reducing the stack trace by catching the exception and throwing one with a smaller stack trace.

+
+

Default: 20000

+
+
+
headerPatterns
+
+

Patterns for headers to be mapped from inbound messages.

+
+

Default: ['*'] (all headers).

+
+
+
lazy
+
+

Declare the queue with the x-queue-mode=lazy argument. +See “Lazy Queues”. +Consider using a policy instead of this setting, because using a policy allows changing the setting without deleting the queue.

+
+

Default: false.

+
+
+
maxConcurrency
+
+

The maximum number of consumers. +Not supported when the containerType is direct.

+
+

Default: 1.

+
+
+
maxLength
+
+

The maximum number of messages in the queue.

+
+

Default: no limit

+
+
+
maxLengthBytes
+
+

The maximum number of total bytes in the queue from all messages.

+
+

Default: no limit

+
+
+
maxPriority
+
+

The maximum priority of messages in the queue (0-255).

+
+

Default: none

+
+
+
missingQueuesFatal
+
+

When the queue cannot be found, whether to treat the condition as fatal and stop the listener container. +Defaults to false so that the container keeps trying to consume from the queue — for example, when using a cluster and the node hosting a non-HA queue is down.

+
+

Default: false

+
+
+
overflowBehavior
+
+

Action to take when maxLength or maxLengthBytes is exceeded; currently drop-head or reject-publish but refer to the RabbitMQ documentation.

+
+

Default: none

+
+
+
prefetch
+
+

Prefetch count.

+
+

Default: 1.

+
+
+
prefix
+
+

A prefix to be added to the name of the destination and queues.

+
+

Default: "".

+
+
+
queueBindingArguments
+
+

Arguments applied when binding the queue to the exchange; used with headers exchangeType to specify headers to match on. +For example …​queueBindingArguments.x-match=any, …​queueBindingArguments.someHeader=someValue.

+
+

Default: empty

+
+
+
queueDeclarationRetries
+
+

The number of times to retry consuming from a queue if it is missing. +Relevant only when missingQueuesFatal is true. +Otherwise, the container keeps retrying indefinitely. +Not supported when the containerType is direct.

+
+

Default: 3

+
+
+
queueNameGroupOnly
+
+

When true, consume from a queue with a name equal to the group. +Otherwise the queue name is destination.group. +This is useful, for example, when using Spring Cloud Stream to consume from an existing RabbitMQ queue.

+
+

Default: false.

+
+
+
quorum.deliveryLimit
+
+

When quorum.enabled=true, set a delivery limit after which the message is dropped or dead-lettered.

+
+

Default: none - broker default will apply.

+
+
+
quorum.enabled
+
+

When true, create a quorum queue instead of a classic queue.

+
+

Default: false

+
+
+
quorum.initialQuorumSize
+
+

When quorum.enabled=true, set the initial quorum size.

+
+

Default: none - broker default will apply.

+
+
+
recoveryInterval
+
+

The interval between connection recovery attempts, in milliseconds.

+
+

Default: 5000.

+
+
+
requeueRejected
+
+

Whether delivery failures should be re-queued when retry is disabled or republishToDlq is false.

+
+

Default: false.

+
+
+
+
+
+
+
republishDeliveryMode
+
+

When republishToDlq is true, specifies the delivery mode of the republished message.

+
+

Default: DeliveryMode.PERSISTENT

+
+
+
republishToDlq
+
+

By default, messages that fail after retries are exhausted are rejected. +If a dead-letter queue (DLQ) is configured, RabbitMQ routes the failed message (unchanged) to the DLQ. +If set to true, the binder republishs failed messages to the DLQ with additional headers, including the exception message and stack trace from the cause of the final failure. +Also see the frameMaxHeadroom property.

+
+

Default: false

+
+
+
singleActiveConsumer
+
+

Set to true to set the x-single-active-consumer queue property to true.

+
+

Default: false

+
+
+
transacted
+
+

Whether to use transacted channels.

+
+

Default: false.

+
+
+
ttl
+
+

Default time to live to apply to the queue when declared (in milliseconds).

+
+

Default: no limit

+
+
+
txSize
+
+

The number of deliveries between acks. +Not supported when the containerType is direct.

+
+

Default: 1.

+
+
+
+
+
+
+

Advanced Listener Container Configuration

+
+

To set listener container properties that are not exposed as binder or binding properties, add a single bean of type ListenerContainerCustomizer to the application context. +The binder and binding properties will be set and then the customizer will be called. +The customizer (configure() method) is provided with the queue name as well as the consumer group as arguments.

+
+
+
+

Advanced Queue/Exchange/Binding Configuration

+
+

From time to time, the RabbitMQ team add new features that are enabled by setting some argument when declaring, for example, a queue. +Generally, such features are enabled in the binder by adding appropriate properties, but this may not be immediately available in a current version. +Starting with version 3.0.1, you can now add DeclarableCustomizer bean(s) to the application context to modify a Declarable (Queue, Exchange or Binding) just before the declaration is performed. +This allows you to add arguments that are not currently directly supported by the binder.

+
+
+
+

Receiving Batched Messages

+
+

Normally, if a producer binding has batch-enabled=true (see Rabbit Producer Properties), or a message is created by a BatchingRabbitTemplate, elements of the batch are returned as individual calls to the listener method. +Starting with version 3.0, any such batch can be presented as a List<?> to the listener method if spring.cloud.stream.bindings.<name>.consumer.batch-mode is set to true.

+
+
+
+

Rabbit Producer Properties

+
+

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

+
+
+

However if the same set of properties needs to be applied to most bindings, to +avoid repetition, Spring Cloud Stream supports setting values for all channels, +in the format of spring.cloud.stream.rabbit.default.<property>=<value>.

+
+
+

Also, keep in mind that binding specific property will override its equivalent in the default.

+
+
+
+
autoBindDlq
+
+

Whether to automatically declare the DLQ and bind it to the binder DLX.

+
+

Default: false.

+
+
+
batchingEnabled
+
+

Whether to enable message batching by producers. +Messages are batched into one message according to the following properties (described in the next three entries in this list): 'batchSize', batchBufferLimit, and batchTimeout. +See Batching for more information. +Also see Receiving Batched Messages.

+
+

Default: false.

+
+
+
batchSize
+
+

The number of messages to buffer when batching is enabled.

+
+

Default: 100.

+
+
+
batchBufferLimit
+
+

The maximum buffer size when batching is enabled.

+
+

Default: 10000.

+
+
+
batchTimeout
+
+

The batch timeout when batching is enabled.

+
+

Default: 5000.

+
+
+
bindingRoutingKey
+
+

The routing key with which to bind the queue to the exchange (if bindQueue is true). +Can be multiple keys - see bindingRoutingKeyDelimiter. +For partitioned destinations, -n is appended to each key. +Only applies if requiredGroups are provided and then only to those groups.

+
+

Default: #.

+
+
+
bindingRoutingKeyDelimiter
+
+

When this is not null, 'bindingRoutingKey' is considered to be a list of keys delimited by this value; often a comma is used. +Only applies if requiredGroups are provided and then only to those groups.

+
+

Default: null.

+
+
+
bindQueue
+
+

Whether to declare the queue and bind it to the destination exchange. +Set it to false if you have set up your own infrastructure and have previously created and bound the queue. +Only applies if requiredGroups are provided and then only to those groups.

+
+

Default: true.

+
+
+
compress
+
+

Whether data should be compressed when sent.

+
+

Default: false.

+
+
+
confirmAckChannel
+
+

When errorChannelEnabled is true, a channel to which to send positive delivery acknowledgments (aka publisher confirms). +If the channel does not exist, a DirectChannel is registered with this name. +The connection factory must be configured to enable publisher confirms.

+
+

Default: nullChannel (acks are discarded).

+
+
+
deadLetterQueueName
+
+

The name of the DLQ +Only applies if requiredGroups are provided and then only to those groups.

+
+

Default: prefix+destination.dlq

+
+
+
deadLetterExchange
+
+

A DLX to assign to the queue. +Relevant only when autoBindDlq is true. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: 'prefix+DLX'

+
+
+
deadLetterExchangeType
+
+

The type of the DLX to assign to the queue. +Relevant only if autoBindDlq is true. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: 'direct'

+
+
+
deadLetterRoutingKey
+
+

A dead letter routing key to assign to the queue. +Relevant only when autoBindDlq is true. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: destination

+
+
+
declareDlx
+
+

Whether to declare the dead letter exchange for the destination. +Relevant only if autoBindDlq is true. +Set to false if you have a pre-configured DLX. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: true.

+
+
+
declareExchange
+
+

Whether to declare the exchange for the destination.

+
+

Default: true.

+
+
+
delayExpression
+
+

A SpEL expression to evaluate the delay to apply to the message (x-delay header). +It has no effect if the exchange is not a delayed message exchange.

+
+

Default: No x-delay header is set.

+
+
+
delayedExchange
+
+

Whether to declare the exchange as a Delayed Message Exchange. +Requires the delayed message exchange plugin on the broker. +The x-delayed-type argument is set to the exchangeType.

+
+

Default: false.

+
+
+
deliveryMode
+
+

The delivery mode.

+
+

Default: PERSISTENT.

+
+
+
dlqBindingArguments
+
+

Arguments applied when binding the dlq to the dead letter exchange; used with headers deadLetterExchangeType to specify headers to match on. +For example …​dlqBindingArguments.x-match=any, …​dlqBindingArguments.someHeader=someValue. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: empty

+
+
+
dlqDeadLetterExchange
+
+

When a DLQ is declared, a DLX to assign to that queue. +Applies only if requiredGroups are provided and then only to those groups.

+
+

Default: none

+
+
+
dlqDeadLetterRoutingKey
+
+

When a DLQ is declared, a dead letter routing key to assign to that queue. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: none

+
+
+
dlqExpires
+
+

How long (in milliseconds) before an unused dead letter queue is deleted. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: no expiration

+
+
+
dlqLazy
+
+

Declare the dead letter queue with the x-queue-mode=lazy argument. +See “Lazy Queues”. +Consider using a policy instead of this setting, because using a policy allows changing the setting without deleting the queue. +Applies only when requiredGroups are provided and then only to those groups.

+
+
dlqMaxLength
+
+

Maximum number of messages in the dead letter queue. +Applies only if requiredGroups are provided and then only to those groups.

+
+

Default: no limit

+
+
+
dlqMaxLengthBytes
+
+

Maximum number of total bytes in the dead letter queue from all messages. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: no limit

+
+
+
dlqMaxPriority
+
+

Maximum priority of messages in the dead letter queue (0-255) +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: none

+
+
+
dlqQuorum.deliveryLimit
+
+

When quorum.enabled=true, set a delivery limit after which the message is dropped or dead-lettered. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: none - broker default will apply.

+
+
+
dlqQuorum.enabled
+
+

When true, create a quorum dead letter queue instead of a classic queue. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: false

+
+
+
dlqQuorum.initialQuorumSize
+
+

When quorum.enabled=true, set the initial quorum size. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: none - broker default will apply.

+
+
+
dlqSingleActiveConsumer
+
+

Set to true to set the x-single-active-consumer queue property to true. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: false

+
+
+
dlqTtl
+
+

Default time (in milliseconds) to live to apply to the dead letter queue when declared. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: no limit

+
+
+
exchangeAutoDelete
+
+

If declareExchange is true, whether the exchange should be auto-delete (it is removed after the last queue is removed).

+
+

Default: true.

+
+
+
exchangeDurable
+
+

If declareExchange is true, whether the exchange should be durable (survives broker restart).

+
+

Default: true.

+
+
+
exchangeType
+
+

The exchange type: direct, fanout, headers or topic for non-partitioned destinations and direct, headers or topic for partitioned destinations.

+
+

Default: topic.

+
+
+
expires
+
+

How long (in milliseconds) before an unused queue is deleted. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: no expiration

+
+
+
headerPatterns
+
+

Patterns for headers to be mapped to outbound messages.

+
+

Default: ['*'] (all headers).

+
+
+
lazy
+
+

Declare the queue with the x-queue-mode=lazy argument. +See “Lazy Queues”. +Consider using a policy instead of this setting, because using a policy allows changing the setting without deleting the queue. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: false.

+
+
+
maxLength
+
+

Maximum number of messages in the queue. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: no limit

+
+
+
maxLengthBytes
+
+

Maximum number of total bytes in the queue from all messages. +Only applies if requiredGroups are provided and then only to those groups.

+
+

Default: no limit

+
+
+
maxPriority
+
+

Maximum priority of messages in the queue (0-255). +Only applies if requiredGroups are provided and then only to those groups.

+
+

Default: none

+
+
+
prefix
+
+

A prefix to be added to the name of the destination exchange.

+
+

Default: "".

+
+
+
queueBindingArguments
+
+

Arguments applied when binding the queue to the exchange; used with headers exchangeType to specify headers to match on. +For example …​queueBindingArguments.x-match=any, …​queueBindingArguments.someHeader=someValue. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: empty

+
+
+
queueNameGroupOnly
+
+

When true, consume from a queue with a name equal to the group. +Otherwise the queue name is destination.group. +This is useful, for example, when using Spring Cloud Stream to consume from an existing RabbitMQ queue. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: false.

+
+
+
quorum.deliveryLimit
+
+

When quorum.enabled=true, set a delivery limit after which the message is dropped or dead-lettered. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: none - broker default will apply.

+
+
+
quorum.enabled
+
+

When true, create a quorum queue instead of a classic queue. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: false

+
+
+
quorum.initialQuorumSize
+
+

When quorum.enabled=true, set the initial quorum size. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: none - broker default will apply.

+
+
+
routingKeyExpression
+
+

A SpEL expression to determine the routing key to use when publishing messages. +For a fixed routing key, use a literal expression, such as routingKeyExpression='my.routingKey' in a properties file or routingKeyExpression: '''my.routingKey''' in a YAML file.

+
+

Default: destination or destination-<partition> for partitioned destinations.

+
+
+
singleActiveConsumer
+
+

Set to true to set the x-single-active-consumer queue property to true. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: false

+
+
+
transacted
+
+

Whether to use transacted channels.

+
+

Default: false.

+
+
+
ttl
+
+

Default time (in milliseconds) to live to apply to the queue when declared. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: no limit

+
+
+
+
+
+ + + + + +
+ + +In the case of RabbitMQ, content type headers can be set by external applications. +Spring Cloud Stream supports them as part of an extended internal protocol used for any type of transport — including transports, such as Kafka (prior to 0.11), that do not natively support headers. +
+
+
+
+
+

Using Existing Queues/Exchanges

+
+

By default, the binder will automatically provision a topic exchange with the name being derived from the value of the destination binding property <prefix><destination>. +The destination defaults to the binding name, if not provided. +When binding a consumer, a queue will automatically be provisioned with the name <prefix><destination>.<group> (if a group binding property is specified), or an anonymous, auto-delete queue when there is no group. +The queue will be bound to the exchange with the "match-all" wildcard routing key (#) for a non-partitioned binding or <destination>-<instanceIndex> for a partitioned binding. +The prefix is an empty String by default. +If an output binding is specified with requiredGroups, a queue/binding will be provisioned for each group.

+
+
+

There are a number of rabbit-specific binding properties that allow you to modify this default behavior.

+
+
+

If you have an existing exchange/queue that you wish to use, you can completely disable automatic provisioning as follows, assuming the exchange is named myExchange and the queue is named myQueue:

+
+
+
    +
  • +

    spring.cloud.stream.bindings.<binding name>.destination=myExhange

    +
  • +
  • +

    spring.cloud.stream.bindings.<binding name>.group=myQueue

    +
  • +
  • +

    spring.cloud.stream.rabbit.bindings.<binding name>.consumer.bindQueue=false

    +
  • +
  • +

    spring.cloud.stream.rabbit.bindings.<binding name>.consumer.declareExchange=false

    +
  • +
  • +

    spring.cloud.stream.rabbit.bindings.<binding name>.consumer.queueNameGroupOnly=true

    +
  • +
+
+
+

If you want the binder to provision the queue/exchange, but you want to do it using something other than the defaults discussed here, use the following properties. +Refer to the property documentation above for more information.

+
+
+
    +
  • +

    spring.cloud.stream.rabbit.bindings.<binding name>.consumer.bindingRoutingKey=myRoutingKey

    +
  • +
  • +

    spring.cloud.stream.rabbit.bindings.<binding name>.consumer.exchangeType=<type>

    +
  • +
  • +

    spring.cloud.stream.rabbit.bindings.<binding name>.producer.routingKeyExpression='myRoutingKey'

    +
  • +
+
+
+

There are similar properties used when declaring a dead-letter exchange/queue, when autoBindDlq is true.

+
+
+
+

Retry With the RabbitMQ Binder

+
+

When retry is enabled within the binder, the listener container thread is suspended for any back off periods that are configured. +This might be important when strict ordering is required with a single consumer. However, for other use cases, it prevents other messages from being processed on that thread. +An alternative to using binder retry is to set up dead lettering with time to live on the dead-letter queue (DLQ) as well as dead-letter configuration on the DLQ itself. +See “RabbitMQ Binder Properties” for more information about the properties discussed here. +You can use the following example configuration to enable this feature:

+
+
+
    +
  • +

    Set autoBindDlq to true. +The binder create a DLQ. +Optionally, you can specify a name in deadLetterQueueName.

    +
  • +
  • +

    Set dlqTtl to the back off time you want to wait between redeliveries.

    +
  • +
  • +

    Set the dlqDeadLetterExchange to the default exchange. +Expired messages from the DLQ are routed to the original queue, because the default deadLetterRoutingKey is the queue name (destination.group). +Setting to the default exchange is achieved by setting the property with no value, as shown in the next example.

    +
  • +
+
+
+

To force a message to be dead-lettered, either throw an AmqpRejectAndDontRequeueException or set requeueRejected to true (the default) and throw any exception.

+
+
+

The loop continue without end, which is fine for transient problems, but you may want to give up after some number of attempts. +Fortunately, RabbitMQ provides the x-death header, which lets you determine how many cycles have occurred.

+
+
+

To acknowledge a message after giving up, throw an ImmediateAcknowledgeAmqpException.

+
+
+

Putting it All Together

+
+

The following configuration creates an exchange myDestination with queue myDestination.consumerGroup bound to a topic exchange with a wildcard routing key #:

+
+
+
+
---
+spring.cloud.stream.bindings.input.destination=myDestination
+spring.cloud.stream.bindings.input.group=consumerGroup
+#disable binder retries
+spring.cloud.stream.bindings.input.consumer.max-attempts=1
+#dlx/dlq setup
+spring.cloud.stream.rabbit.bindings.input.consumer.auto-bind-dlq=true
+spring.cloud.stream.rabbit.bindings.input.consumer.dlq-ttl=5000
+spring.cloud.stream.rabbit.bindings.input.consumer.dlq-dead-letter-exchange=
+---
+
+
+
+

This configuration creates a DLQ bound to a direct exchange (DLX) with a routing key of myDestination.consumerGroup. +When messages are rejected, they are routed to the DLQ. +After 5 seconds, the message expires and is routed to the original queue by using the queue name as the routing key, as shown in the following example:

+
+
+
Spring Boot application
+
+
@SpringBootApplication
+@EnableBinding(Sink.class)
+public class XDeathApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(XDeathApplication.class, args);
+    }
+
+    @StreamListener(Sink.INPUT)
+    public void listen(String in, @Header(name = "x-death", required = false) Map<?,?> death) {
+        if (death != null && death.get("count").equals(3L)) {
+            // giving up - don't send to DLX
+            throw new ImmediateAcknowledgeAmqpException("Failed after 4 attempts");
+        }
+        throw new AmqpRejectAndDontRequeueException("failed");
+    }
+
+}
+
+
+
+

Notice that the count property in the x-death header is a Long.

+
+
+
+
+

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.

+
+
+

RabbitMQ has two types of send failures:

+
+
+ +
+
+

The latter is rare. +According to the RabbitMQ documentation "[A nack] will only be delivered if an internal error occurs in the Erlang process responsible for a queue.".

+
+
+

As well as enabling producer error channels (as described in “[spring-cloud-stream-overview-error-handling]”), the RabbitMQ binder only sends messages to the channels if the connection factory is appropriately configured, as follows:

+
+
+
    +
  • +

    ccf.setPublisherConfirms(true);

    +
  • +
  • +

    ccf.setPublisherReturns(true);

    +
  • +
+
+
+

When using Spring Boot configuration for the connection factory, set the following properties:

+
+
+
    +
  • +

    spring.rabbitmq.publisher-confirms

    +
  • +
  • +

    spring.rabbitmq.publisher-returns

    +
  • +
+
+
+

The payload of the ErrorMessage for a returned message is a ReturnedAmqpMessageException with the following properties:

+
+
+
    +
  • +

    failedMessage: The spring-messaging Message<?> that failed to be sent.

    +
  • +
  • +

    amqpMessage: The raw spring-amqp Message.

    +
  • +
  • +

    replyCode: An integer value indicating the reason for the failure (for example, 312 - No route).

    +
  • +
  • +

    replyText: A text value indicating the reason for the failure (for example, NO_ROUTE).

    +
  • +
  • +

    exchange: The exchange to which the message was published.

    +
  • +
  • +

    routingKey: The routing key used when the message was published.

    +
  • +
+
+
+

For negatively acknowledged confirmations, the payload is a NackedAmqpMessageException with the following properties:

+
+
+
    +
  • +

    failedMessage: The spring-messaging Message<?> that failed to be sent.

    +
  • +
  • +

    nackReason: A reason (if available — you may need to examine the broker logs for more information).

    +
  • +
+
+
+

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

+
+
+
+

Dead-Letter Queue Processing

+
+

Because you cannot anticipate how users would want to dispose of dead-lettered messages, the framework 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 queue. +However, if the problem is a permanent issue, that could cause an infinite loop. +The following Spring Boot application shows an example of how to route those messages back to the original queue but moves them to a third “parking lot” queue after three attempts. +The second example uses the RabbitMQ Delayed Message Exchange to introduce a delay to the re-queued message. +In this example, the delay increases for each attempt. +These examples use a @RabbitListener to receive messages from the DLQ. +You could also use RabbitTemplate.receive() in a batch process.

+
+
+

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

+
+
+

Non-Partitioned Destinations

+
+

The first two examples are for when the destination is not partitioned:

+
+
+
+
@SpringBootApplication
+public class ReRouteDlqApplication {
+
+    private static final String ORIGINAL_QUEUE = "so8400in.so8400";
+
+    private static final String DLQ = ORIGINAL_QUEUE + ".dlq";
+
+    private static final String PARKING_LOT = ORIGINAL_QUEUE + ".parkingLot";
+
+    private static final String X_RETRIES_HEADER = "x-retries";
+
+    public static void main(String[] args) throws Exception {
+        ConfigurableApplicationContext context = SpringApplication.run(ReRouteDlqApplication.class, args);
+        System.out.println("Hit enter to terminate");
+        System.in.read();
+        context.close();
+    }
+
+    @Autowired
+    private RabbitTemplate rabbitTemplate;
+
+    @RabbitListener(queues = DLQ)
+    public void rePublish(Message failedMessage) {
+        Integer retriesHeader = (Integer) failedMessage.getMessageProperties().getHeaders().get(X_RETRIES_HEADER);
+        if (retriesHeader == null) {
+            retriesHeader = Integer.valueOf(0);
+        }
+        if (retriesHeader < 3) {
+            failedMessage.getMessageProperties().getHeaders().put(X_RETRIES_HEADER, retriesHeader + 1);
+            this.rabbitTemplate.send(ORIGINAL_QUEUE, failedMessage);
+        }
+        else {
+            this.rabbitTemplate.send(PARKING_LOT, failedMessage);
+        }
+    }
+
+    @Bean
+    public Queue parkingLot() {
+        return new Queue(PARKING_LOT);
+    }
+
+}
+
+
+
+
+
@SpringBootApplication
+public class ReRouteDlqApplication {
+
+    private static final String ORIGINAL_QUEUE = "so8400in.so8400";
+
+    private static final String DLQ = ORIGINAL_QUEUE + ".dlq";
+
+    private static final String PARKING_LOT = ORIGINAL_QUEUE + ".parkingLot";
+
+    private static final String X_RETRIES_HEADER = "x-retries";
+
+    private static final String DELAY_EXCHANGE = "dlqReRouter";
+
+    public static void main(String[] args) throws Exception {
+        ConfigurableApplicationContext context = SpringApplication.run(ReRouteDlqApplication.class, args);
+        System.out.println("Hit enter to terminate");
+        System.in.read();
+        context.close();
+    }
+
+    @Autowired
+    private RabbitTemplate rabbitTemplate;
+
+    @RabbitListener(queues = DLQ)
+    public void rePublish(Message failedMessage) {
+        Map<String, Object> headers = failedMessage.getMessageProperties().getHeaders();
+        Integer retriesHeader = (Integer) headers.get(X_RETRIES_HEADER);
+        if (retriesHeader == null) {
+            retriesHeader = Integer.valueOf(0);
+        }
+        if (retriesHeader < 3) {
+            headers.put(X_RETRIES_HEADER, retriesHeader + 1);
+            headers.put("x-delay", 5000 * retriesHeader);
+            this.rabbitTemplate.send(DELAY_EXCHANGE, ORIGINAL_QUEUE, failedMessage);
+        }
+        else {
+            this.rabbitTemplate.send(PARKING_LOT, failedMessage);
+        }
+    }
+
+    @Bean
+    public DirectExchange delayExchange() {
+        DirectExchange exchange = new DirectExchange(DELAY_EXCHANGE);
+        exchange.setDelayed(true);
+        return exchange;
+    }
+
+    @Bean
+    public Binding bindOriginalToDelay() {
+        return BindingBuilder.bind(new Queue(ORIGINAL_QUEUE)).to(delayExchange()).with(ORIGINAL_QUEUE);
+    }
+
+    @Bean
+    public Queue parkingLot() {
+        return new Queue(PARKING_LOT);
+    }
+
+}
+
+
+
+
+

Partitioned Destinations

+
+

With partitioned destinations, there is one DLQ for all partitions. We determine the original queue from the headers.

+
+
+
republishToDlq=false
+
+

When republishToDlq is false, RabbitMQ publishes the message to the DLX/DLQ with an x-death header containing information about the original destination, as shown in the following example:

+
+
+
+
@SpringBootApplication
+public class ReRouteDlqApplication {
+
+	private static final String ORIGINAL_QUEUE = "so8400in.so8400";
+
+	private static final String DLQ = ORIGINAL_QUEUE + ".dlq";
+
+	private static final String PARKING_LOT = ORIGINAL_QUEUE + ".parkingLot";
+
+	private static final String X_DEATH_HEADER = "x-death";
+
+	private static final String X_RETRIES_HEADER = "x-retries";
+
+	public static void main(String[] args) throws Exception {
+		ConfigurableApplicationContext context = SpringApplication.run(ReRouteDlqApplication.class, args);
+		System.out.println("Hit enter to terminate");
+		System.in.read();
+		context.close();
+	}
+
+	@Autowired
+	private RabbitTemplate rabbitTemplate;
+
+	@SuppressWarnings("unchecked")
+	@RabbitListener(queues = DLQ)
+	public void rePublish(Message failedMessage) {
+		Map<String, Object> headers = failedMessage.getMessageProperties().getHeaders();
+		Integer retriesHeader = (Integer) headers.get(X_RETRIES_HEADER);
+		if (retriesHeader == null) {
+			retriesHeader = Integer.valueOf(0);
+		}
+		if (retriesHeader < 3) {
+			headers.put(X_RETRIES_HEADER, retriesHeader + 1);
+			List<Map<String, ?>> xDeath = (List<Map<String, ?>>) headers.get(X_DEATH_HEADER);
+			String exchange = (String) xDeath.get(0).get("exchange");
+			List<String> routingKeys = (List<String>) xDeath.get(0).get("routing-keys");
+			this.rabbitTemplate.send(exchange, routingKeys.get(0), failedMessage);
+		}
+		else {
+			this.rabbitTemplate.send(PARKING_LOT, failedMessage);
+		}
+	}
+
+	@Bean
+	public Queue parkingLot() {
+		return new Queue(PARKING_LOT);
+	}
+
+}
+
+
+
+
+
republishToDlq=true
+
+

When republishToDlq is true, the republishing recoverer adds the original exchange and routing key to headers, as shown in the following example:

+
+
+
+
@SpringBootApplication
+public class ReRouteDlqApplication {
+
+	private static final String ORIGINAL_QUEUE = "so8400in.so8400";
+
+	private static final String DLQ = ORIGINAL_QUEUE + ".dlq";
+
+	private static final String PARKING_LOT = ORIGINAL_QUEUE + ".parkingLot";
+
+	private static final String X_RETRIES_HEADER = "x-retries";
+
+	private static final String X_ORIGINAL_EXCHANGE_HEADER = RepublishMessageRecoverer.X_ORIGINAL_EXCHANGE;
+
+	private static final String X_ORIGINAL_ROUTING_KEY_HEADER = RepublishMessageRecoverer.X_ORIGINAL_ROUTING_KEY;
+
+	public static void main(String[] args) throws Exception {
+		ConfigurableApplicationContext context = SpringApplication.run(ReRouteDlqApplication.class, args);
+		System.out.println("Hit enter to terminate");
+		System.in.read();
+		context.close();
+	}
+
+	@Autowired
+	private RabbitTemplate rabbitTemplate;
+
+	@RabbitListener(queues = DLQ)
+	public void rePublish(Message failedMessage) {
+		Map<String, Object> headers = failedMessage.getMessageProperties().getHeaders();
+		Integer retriesHeader = (Integer) headers.get(X_RETRIES_HEADER);
+		if (retriesHeader == null) {
+			retriesHeader = Integer.valueOf(0);
+		}
+		if (retriesHeader < 3) {
+			headers.put(X_RETRIES_HEADER, retriesHeader + 1);
+			String exchange = (String) headers.get(X_ORIGINAL_EXCHANGE_HEADER);
+			String originalRoutingKey = (String) headers.get(X_ORIGINAL_ROUTING_KEY_HEADER);
+			this.rabbitTemplate.send(exchange, originalRoutingKey, failedMessage);
+		}
+		else {
+			this.rabbitTemplate.send(PARKING_LOT, failedMessage);
+		}
+	}
+
+	@Bean
+	public Queue parkingLot() {
+		return new Queue(PARKING_LOT);
+	}
+
+}
+
+
+
+
+
+
+

Partitioning with the RabbitMQ Binder

+
+

RabbitMQ does not support 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 RabbitMessageChannelBinder provides partitioning by binding a queue for each partition to the destination exchange.

+
+
+

The following Java and YAML examples show how to configure the producer:

+
+
+
Producer
+
+
@SpringBootApplication
+@EnableBinding(Source.class)
+public class RabbitPartitionProducerApplication {
+
+    private static final Random RANDOM = new Random(System.currentTimeMillis());
+
+    private static final String[] data = new String[] {
+            "abc1", "def1", "qux1",
+            "abc2", "def2", "qux2",
+            "abc3", "def3", "qux3",
+            "abc4", "def4", "qux4",
+            };
+
+    public static void main(String[] args) {
+        new SpringApplicationBuilder(RabbitPartitionProducerApplication.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.destination
+              producer:
+                partitioned: true
+                partition-key-expression: headers['partitionKey']
+                partition-count: 2
+                required-groups:
+                - myGroup
+
+
+
+ + + + + +
+ + +
+

The configuration in the prececing example 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.

+
+
+

The required-groups property is required only if you need the consumer queues to be provisioned when the producer is deployed. +Otherwise, any messages sent to a partition are lost until the corresponding consumer is deployed.

+
+
+
+
+

The following configuration provisions a topic exchange:

+
+
+
+part exchange +
+
+
+

The following queues are bound to that exchange:

+
+
+
+part queues +
+
+
+

The following bindings associate the queues to the exchange:

+
+
+
+part bindings +
+
+
+

The following Java and YAML examples continue the previous examples and show how to configure the consumer:

+
+
+
Consumer
+
+
@SpringBootApplication
+@EnableBinding(Sink.class)
+public class RabbitPartitionConsumerApplication {
+
+    public static void main(String[] args) {
+        new SpringApplicationBuilder(RabbitPartitionConsumerApplication.class)
+            .web(false)
+            .run(args);
+    }
+
+    @StreamListener(Sink.INPUT)
+    public void listen(@Payload String in, @Header(AmqpHeaders.CONSUMER_QUEUE) String queue) {
+        System.out.println(in + " received from queue " + queue);
+    }
+
+}
+
+
+
+
application.yml
+
+
    spring:
+      cloud:
+        stream:
+          bindings:
+            input:
+              destination: partitioned.destination
+              group: myGroup
+              consumer:
+                partitioned: true
+                instance-index: 0
+
+
+
+ + + + + +
+ + +The RabbitMessageChannelBinder does not support dynamic scaling. +There must be at least one consumer per partition. +The consumer’s instanceIndex is used to indicate which partition is consumed. +Platforms such as Cloud Foundry can have only one instance with an instanceIndex. +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/spring-cloud-stream-binder-rabbit.html b/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/spring-cloud-stream-binder-rabbit.html new file mode 100644 index 00000000..64e6e4ac --- /dev/null +++ b/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/html/spring-cloud-stream-binder-rabbit.html @@ -0,0 +1,2195 @@ + + + + + + + + +Spring Cloud Stream RabbitMQ Binder Reference Guide + + + + + + + + + + +
+
+
+
+

3.0.6.RELEASE

+
+
+
+

Reference Guide

+
+
+
+

This guide describes the RabbitMQ 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 into RabbitMQ specific constructs.

+
+
+
+
+

1. Usage

+
+
+

To use the RabbitMQ binder, you can add it to your Spring Cloud Stream application, by using the following Maven coordinates:

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

Alternatively, you can use the Spring Cloud Stream RabbitMQ Starter, as follows:

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

2. RabbitMQ Binder Overview

+
+
+

The following simplified diagram shows how the RabbitMQ binder operates:

+
+
+
+rabbit binder +
+
Figure 1. RabbitMQ Binder
+
+
+

By default, the RabbitMQ Binder implementation maps each destination to a TopicExchange. +For each consumer group, a Queue is bound to that TopicExchange. +Each consumer instance has a corresponding RabbitMQ Consumer instance for its group’s Queue. +For partitioned producers and consumers, the queues are suffixed with the partition index and use the partition index as the routing key. +For anonymous consumers (those with no group property), an auto-delete queue (with a randomized unique name) is used.

+
+
+

By using the optional autoBindDlq option, you can configure the binder to create and configure dead-letter queues (DLQs) (and a dead-letter exchange DLX, as well as routing infrastructure). +By default, the dead letter queue has the name of the destination, appended with .dlq. +If retry is enabled (maxAttempts > 1), failed messages are delivered to the DLQ after retries are exhausted. +If retry is disabled (maxAttempts = 1), you should set requeueRejected to false (the default) so that failed messages are routed to the DLQ, instead of being re-queued. +In addition, republishToDlq causes the binder to publish a failed message to the DLQ (instead of rejecting it). +This feature lets additional information (such as the stack trace in the x-exception-stacktrace header) be added to the message in headers. +See the frameMaxHeadroom property for information about truncated stack traces. +This option does not need retry enabled. +You can republish a failed message after just one attempt. +Starting with version 1.2, you can configure the delivery mode of republished messages. +See the republishDeliveryMode property.

+
+
+

If the stream listener throws an ImmediateAcknowledgeAmqpException, the DLQ is bypassed and the message simply discarded. +Starting with version 2.1, this is true regardless of the setting of republishToDlq; previously it was only the case when republishToDlq was false.

+
+
+ + + + + +
+ + +Setting requeueRejected to true (with republishToDlq=false ) causes the message to be re-queued and redelivered continually, which is likely not what you want unless the reason for the failure is transient. +In general, you should enable retry within the binder by setting maxAttempts to greater than one or by setting republishToDlq to true. +
+
+
+

See RabbitMQ Binder Properties for more information about these properties.

+
+
+

The framework does not provide any standard mechanism to consume dead-letter messages (or to re-route them back to the primary queue). +Some options are described in Dead-Letter Queue Processing.

+
+
+ + + + + +
+ + +When multiple RabbitMQ binders are used in a Spring Cloud Stream application, it is important to disable 'RabbitAutoConfiguration' to avoid the same configuration from RabbitAutoConfiguration being applied to the two binders. +You can exclude the class by using the @SpringBootApplication annotation. +
+
+
+

Starting with version 2.0, the RabbitMessageChannelBinder sets the RabbitTemplate.userPublisherConnection property to true so that the non-transactional producers avoid deadlocks on consumers, which can happen if cached connections are blocked because of a memory alarm on the broker.

+
+
+ + + + + +
+ + +Currently, a multiplex consumer (a single consumer listening to multiple queues) is only supported for message-driven conssumers; polled consumers can only retrieve messages from a single queue. +
+
+
+
+
+

3. Configuration Options

+
+
+

This section contains settings specific to the RabbitMQ Binder and bound channels.

+
+
+

For general binding configuration options and properties, see the Spring Cloud Stream core documentation.

+
+
+

3.1. RabbitMQ Binder Properties

+
+

By default, the RabbitMQ binder uses Spring Boot’s ConnectionFactory. +Conseuqently, it supports all Spring Boot configuration options for RabbitMQ. +(For reference, see the Spring Boot documentation). +RabbitMQ configuration options use the spring.rabbitmq prefix.

+
+
+

In addition to Spring Boot options, the RabbitMQ binder supports the following properties:

+
+
+
+
spring.cloud.stream.rabbit.binder.adminAddresses
+
+

A comma-separated list of RabbitMQ management plugin URLs. +Only used when nodes contains more than one entry. +Each entry in this list must have a corresponding entry in spring.rabbitmq.addresses. +Only needed if you use a RabbitMQ cluster and wish to consume from the node that hosts the queue. +See Queue Affinity and the LocalizedQueueConnectionFactory for more information.

+
+

Default: empty.

+
+
+
spring.cloud.stream.rabbit.binder.nodes
+
+

A comma-separated list of RabbitMQ node names. +When more than one entry, used to locate the server address where a queue is located. +Each entry in this list must have a corresponding entry in spring.rabbitmq.addresses. +Only needed if you use a RabbitMQ cluster and wish to consume from the node that hosts the queue. +See Queue Affinity and the LocalizedQueueConnectionFactory for more information.

+
+

Default: empty.

+
+
+
spring.cloud.stream.rabbit.binder.compressionLevel
+
+

The compression level for compressed bindings. +See java.util.zip.Deflater.

+
+

Default: 1 (BEST_LEVEL).

+
+
+
spring.cloud.stream.binder.connection-name-prefix
+
+

A connection name prefix used to name the connection(s) created by this binder. +The name is this prefix followed by #n, where n increments each time a new connection is opened.

+
+

Default: none (Spring AMQP default).

+
+
+
+
+
+
+

3.2. RabbitMQ Consumer Properties

+
+

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

+
+
+

However if the same set of properties needs to be applied to most bindings, to +avoid repetition, Spring Cloud Stream supports setting values for all channels, +in the format of spring.cloud.stream.rabbit.default.<property>=<value>.

+
+
+

Also, keep in mind that binding specific property will override its equivalent in the default.

+
+
+
+
acknowledgeMode
+
+

The acknowledge mode.

+
+

Default: AUTO.

+
+
+
anonymousGroupPrefix
+
+

When the binding has no group property, an anonymous, auto-delete queue is bound to the destination exchange. +The default naming stragegy for such queues results in a queue named anonymous.<base64 representation of a UUID>. +Set this property to change the prefix to something other than the default.

+
+

Default: anonymous..

+
+
+
autoBindDlq
+
+

Whether to automatically declare the DLQ and bind it to the binder DLX.

+
+

Default: false.

+
+
+
bindingRoutingKey
+
+

The routing key with which to bind the queue to the exchange (if bindQueue is true). +Can be multiple keys - see bindingRoutingKeyDelimiter. +For partitioned destinations, -<instanceIndex> is appended to each key.

+
+

Default: #.

+
+
+
bindingRoutingKeyDelimiter
+
+

When this is not null, 'bindingRoutingKey' is considered to be a list of keys delimited by this value; often a comma is used.

+
+

Default: null.

+
+
+
bindQueue
+
+

Whether to declare the queue and bind it to the destination exchange. +Set it to false if you have set up your own infrastructure and have previously created and bound the queue.

+
+

Default: true.

+
+
+
consumerTagPrefix
+
+

Used to create the consumer tag(s); will be appended by #n where n increments for each consumer created. +Example: ${spring.application.name}-${spring.cloud.stream.bindings.input.group}-${spring.cloud.stream.instance-index}.

+
+

Default: none - the broker will generate random consumer tags.

+
+
+
containerType
+
+

Select the type of listener container to be used. +See Choosing a Container in the Spring AMQP documentation for more information.

+
+

Default: simple

+
+
+
deadLetterQueueName
+
+

The name of the DLQ

+
+

Default: prefix+destination.dlq

+
+
+
deadLetterExchange
+
+

A DLX to assign to the queue. +Relevant only if autoBindDlq is true.

+
+

Default: 'prefix+DLX'

+
+
+
deadLetterExchangeType
+
+

The type of the DLX to assign to the queue. +Relevant only if autoBindDlq is true.

+
+

Default: 'direct'

+
+
+
deadLetterRoutingKey
+
+

A dead letter routing key to assign to the queue. +Relevant only if autoBindDlq is true.

+
+

Default: destination

+
+
+
declareDlx
+
+

Whether to declare the dead letter exchange for the destination. +Relevant only if autoBindDlq is true. +Set to false if you have a pre-configured DLX.

+
+

Default: true.

+
+
+
declareExchange
+
+

Whether to declare the exchange for the destination.

+
+

Default: true.

+
+
+
delayedExchange
+
+

Whether to declare the exchange as a Delayed Message Exchange. +Requires the delayed message exchange plugin on the broker. +The x-delayed-type argument is set to the exchangeType.

+
+

Default: false.

+
+
+
dlqBindingArguments
+
+

Arguments applied when binding the dlq to the dead letter exchange; used with headers deadLetterExchangeType to specify headers to match on. +For example …​dlqBindingArguments.x-match=any, …​dlqBindingArguments.someHeader=someValue.

+
+

Default: empty

+
+
+
dlqDeadLetterExchange
+
+

If a DLQ is declared, a DLX to assign to that queue.

+
+

Default: none

+
+
+
dlqDeadLetterRoutingKey
+
+

If a DLQ is declared, a dead letter routing key to assign to that queue.

+
+

Default: none

+
+
+
dlqExpires
+
+

How long before an unused dead letter queue is deleted (in milliseconds).

+
+

Default: no expiration

+
+
+
dlqLazy
+
+

Declare the dead letter queue with the x-queue-mode=lazy argument. +See “Lazy Queues”. +Consider using a policy instead of this setting, because using a policy allows changing the setting without deleting the queue.

+
+

Default: false.

+
+
+
dlqMaxLength
+
+

Maximum number of messages in the dead letter queue.

+
+

Default: no limit

+
+
+
dlqMaxLengthBytes
+
+

Maximum number of total bytes in the dead letter queue from all messages.

+
+

Default: no limit

+
+
+
dlqMaxPriority
+
+

Maximum priority of messages in the dead letter queue (0-255).

+
+

Default: none

+
+
+
dlqOverflowBehavior
+
+

Action to take when dlqMaxLength or dlqMaxLengthBytes is exceeded; currently drop-head or reject-publish but refer to the RabbitMQ documentation.

+
+

Default: none

+
+
+
dlqQuorum.deliveryLimit
+
+

When quorum.enabled=true, set a delivery limit after which the message is dropped or dead-lettered.

+
+

Default: none - broker default will apply.

+
+
+
dlqQuorum.enabled
+
+

When true, create a quorum dead letter queue instead of a classic queue.

+
+

Default: false

+
+
+
dlqQuorum.initialQuorumSize
+
+

When quorum.enabled=true, set the initial quorum size.

+
+

Default: none - broker default will apply.

+
+
+
dlqSingleActiveConsumer
+
+

Set to true to set the x-single-active-consumer queue property to true.

+
+

Default: false

+
+
+
dlqTtl
+
+

Default time to live to apply to the dead letter queue when declared (in milliseconds).

+
+

Default: no limit

+
+
+
durableSubscription
+
+

Whether the subscription should be durable. +Only effective if group is also set.

+
+

Default: true.

+
+
+
exchangeAutoDelete
+
+

If declareExchange is true, whether the exchange should be auto-deleted (that is, removed after the last queue is removed).

+
+

Default: true.

+
+
+
exchangeDurable
+
+

If declareExchange is true, whether the exchange should be durable (that is, it survives broker restart).

+
+

Default: true.

+
+
+
exchangeType
+
+

The exchange type: direct, fanout, headers or topic for non-partitioned destinations and direct, headers or topic for partitioned destinations.

+
+

Default: topic.

+
+
+
exclusive
+
+

Whether to create an exclusive consumer. +Concurrency should be 1 when this is true. +Often used when strict ordering is required but enabling a hot standby instance to take over after a failure. +See recoveryInterval, which controls how often a standby instance attempts to consume. +Consider using singleActiveConsumer instead when using RabbitMQ 3.8 or later.

+
+

Default: false.

+
+
+
expires
+
+

How long before an unused queue is deleted (in milliseconds).

+
+

Default: no expiration

+
+
+
failedDeclarationRetryInterval
+
+

The interval (in milliseconds) between attempts to consume from a queue if it is missing.

+
+

Default: 5000

+
+
+
+
+
+
+
frameMaxHeadroom
+
+

The number of bytes to reserve for other headers when adding the stack trace to a DLQ message header. +All headers must fit within the frame_max size configured on the broker. +Stack traces can be large; if the size plus this property exceeds frame_max then the stack trace will be truncated. +A WARN log will be written; consider increasing the frame_max or reducing the stack trace by catching the exception and throwing one with a smaller stack trace.

+
+

Default: 20000

+
+
+
headerPatterns
+
+

Patterns for headers to be mapped from inbound messages.

+
+

Default: ['*'] (all headers).

+
+
+
lazy
+
+

Declare the queue with the x-queue-mode=lazy argument. +See “Lazy Queues”. +Consider using a policy instead of this setting, because using a policy allows changing the setting without deleting the queue.

+
+

Default: false.

+
+
+
maxConcurrency
+
+

The maximum number of consumers. +Not supported when the containerType is direct.

+
+

Default: 1.

+
+
+
maxLength
+
+

The maximum number of messages in the queue.

+
+

Default: no limit

+
+
+
maxLengthBytes
+
+

The maximum number of total bytes in the queue from all messages.

+
+

Default: no limit

+
+
+
maxPriority
+
+

The maximum priority of messages in the queue (0-255).

+
+

Default: none

+
+
+
missingQueuesFatal
+
+

When the queue cannot be found, whether to treat the condition as fatal and stop the listener container. +Defaults to false so that the container keeps trying to consume from the queue — for example, when using a cluster and the node hosting a non-HA queue is down.

+
+

Default: false

+
+
+
overflowBehavior
+
+

Action to take when maxLength or maxLengthBytes is exceeded; currently drop-head or reject-publish but refer to the RabbitMQ documentation.

+
+

Default: none

+
+
+
prefetch
+
+

Prefetch count.

+
+

Default: 1.

+
+
+
prefix
+
+

A prefix to be added to the name of the destination and queues.

+
+

Default: "".

+
+
+
queueBindingArguments
+
+

Arguments applied when binding the queue to the exchange; used with headers exchangeType to specify headers to match on. +For example …​queueBindingArguments.x-match=any, …​queueBindingArguments.someHeader=someValue.

+
+

Default: empty

+
+
+
queueDeclarationRetries
+
+

The number of times to retry consuming from a queue if it is missing. +Relevant only when missingQueuesFatal is true. +Otherwise, the container keeps retrying indefinitely. +Not supported when the containerType is direct.

+
+

Default: 3

+
+
+
queueNameGroupOnly
+
+

When true, consume from a queue with a name equal to the group. +Otherwise the queue name is destination.group. +This is useful, for example, when using Spring Cloud Stream to consume from an existing RabbitMQ queue.

+
+

Default: false.

+
+
+
quorum.deliveryLimit
+
+

When quorum.enabled=true, set a delivery limit after which the message is dropped or dead-lettered.

+
+

Default: none - broker default will apply.

+
+
+
quorum.enabled
+
+

When true, create a quorum queue instead of a classic queue.

+
+

Default: false

+
+
+
quorum.initialQuorumSize
+
+

When quorum.enabled=true, set the initial quorum size.

+
+

Default: none - broker default will apply.

+
+
+
recoveryInterval
+
+

The interval between connection recovery attempts, in milliseconds.

+
+

Default: 5000.

+
+
+
requeueRejected
+
+

Whether delivery failures should be re-queued when retry is disabled or republishToDlq is false.

+
+

Default: false.

+
+
+
+
+
+
+
republishDeliveryMode
+
+

When republishToDlq is true, specifies the delivery mode of the republished message.

+
+

Default: DeliveryMode.PERSISTENT

+
+
+
republishToDlq
+
+

By default, messages that fail after retries are exhausted are rejected. +If a dead-letter queue (DLQ) is configured, RabbitMQ routes the failed message (unchanged) to the DLQ. +If set to true, the binder republishs failed messages to the DLQ with additional headers, including the exception message and stack trace from the cause of the final failure. +Also see the frameMaxHeadroom property.

+
+

Default: false

+
+
+
singleActiveConsumer
+
+

Set to true to set the x-single-active-consumer queue property to true.

+
+

Default: false

+
+
+
transacted
+
+

Whether to use transacted channels.

+
+

Default: false.

+
+
+
ttl
+
+

Default time to live to apply to the queue when declared (in milliseconds).

+
+

Default: no limit

+
+
+
txSize
+
+

The number of deliveries between acks. +Not supported when the containerType is direct.

+
+

Default: 1.

+
+
+
+
+
+
+

3.3. Advanced Listener Container Configuration

+
+

To set listener container properties that are not exposed as binder or binding properties, add a single bean of type ListenerContainerCustomizer to the application context. +The binder and binding properties will be set and then the customizer will be called. +The customizer (configure() method) is provided with the queue name as well as the consumer group as arguments.

+
+
+
+

3.4. Advanced Queue/Exchange/Binding Configuration

+
+

From time to time, the RabbitMQ team add new features that are enabled by setting some argument when declaring, for example, a queue. +Generally, such features are enabled in the binder by adding appropriate properties, but this may not be immediately available in a current version. +Starting with version 3.0.1, you can now add DeclarableCustomizer bean(s) to the application context to modify a Declarable (Queue, Exchange or Binding) just before the declaration is performed. +This allows you to add arguments that are not currently directly supported by the binder.

+
+
+
+

3.5. Receiving Batched Messages

+
+

Normally, if a producer binding has batch-enabled=true (see Rabbit Producer Properties), or a message is created by a BatchingRabbitTemplate, elements of the batch are returned as individual calls to the listener method. +Starting with version 3.0, any such batch can be presented as a List<?> to the listener method if spring.cloud.stream.bindings.<name>.consumer.batch-mode is set to true.

+
+
+
+

3.6. Rabbit Producer Properties

+
+

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

+
+
+

However if the same set of properties needs to be applied to most bindings, to +avoid repetition, Spring Cloud Stream supports setting values for all channels, +in the format of spring.cloud.stream.rabbit.default.<property>=<value>.

+
+
+

Also, keep in mind that binding specific property will override its equivalent in the default.

+
+
+
+
autoBindDlq
+
+

Whether to automatically declare the DLQ and bind it to the binder DLX.

+
+

Default: false.

+
+
+
batchingEnabled
+
+

Whether to enable message batching by producers. +Messages are batched into one message according to the following properties (described in the next three entries in this list): 'batchSize', batchBufferLimit, and batchTimeout. +See Batching for more information. +Also see Receiving Batched Messages.

+
+

Default: false.

+
+
+
batchSize
+
+

The number of messages to buffer when batching is enabled.

+
+

Default: 100.

+
+
+
batchBufferLimit
+
+

The maximum buffer size when batching is enabled.

+
+

Default: 10000.

+
+
+
batchTimeout
+
+

The batch timeout when batching is enabled.

+
+

Default: 5000.

+
+
+
bindingRoutingKey
+
+

The routing key with which to bind the queue to the exchange (if bindQueue is true). +Can be multiple keys - see bindingRoutingKeyDelimiter. +For partitioned destinations, -n is appended to each key. +Only applies if requiredGroups are provided and then only to those groups.

+
+

Default: #.

+
+
+
bindingRoutingKeyDelimiter
+
+

When this is not null, 'bindingRoutingKey' is considered to be a list of keys delimited by this value; often a comma is used. +Only applies if requiredGroups are provided and then only to those groups.

+
+

Default: null.

+
+
+
bindQueue
+
+

Whether to declare the queue and bind it to the destination exchange. +Set it to false if you have set up your own infrastructure and have previously created and bound the queue. +Only applies if requiredGroups are provided and then only to those groups.

+
+

Default: true.

+
+
+
compress
+
+

Whether data should be compressed when sent.

+
+

Default: false.

+
+
+
confirmAckChannel
+
+

When errorChannelEnabled is true, a channel to which to send positive delivery acknowledgments (aka publisher confirms). +If the channel does not exist, a DirectChannel is registered with this name. +The connection factory must be configured to enable publisher confirms.

+
+

Default: nullChannel (acks are discarded).

+
+
+
deadLetterQueueName
+
+

The name of the DLQ +Only applies if requiredGroups are provided and then only to those groups.

+
+

Default: prefix+destination.dlq

+
+
+
deadLetterExchange
+
+

A DLX to assign to the queue. +Relevant only when autoBindDlq is true. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: 'prefix+DLX'

+
+
+
deadLetterExchangeType
+
+

The type of the DLX to assign to the queue. +Relevant only if autoBindDlq is true. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: 'direct'

+
+
+
deadLetterRoutingKey
+
+

A dead letter routing key to assign to the queue. +Relevant only when autoBindDlq is true. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: destination

+
+
+
declareDlx
+
+

Whether to declare the dead letter exchange for the destination. +Relevant only if autoBindDlq is true. +Set to false if you have a pre-configured DLX. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: true.

+
+
+
declareExchange
+
+

Whether to declare the exchange for the destination.

+
+

Default: true.

+
+
+
delayExpression
+
+

A SpEL expression to evaluate the delay to apply to the message (x-delay header). +It has no effect if the exchange is not a delayed message exchange.

+
+

Default: No x-delay header is set.

+
+
+
delayedExchange
+
+

Whether to declare the exchange as a Delayed Message Exchange. +Requires the delayed message exchange plugin on the broker. +The x-delayed-type argument is set to the exchangeType.

+
+

Default: false.

+
+
+
deliveryMode
+
+

The delivery mode.

+
+

Default: PERSISTENT.

+
+
+
dlqBindingArguments
+
+

Arguments applied when binding the dlq to the dead letter exchange; used with headers deadLetterExchangeType to specify headers to match on. +For example …​dlqBindingArguments.x-match=any, …​dlqBindingArguments.someHeader=someValue. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: empty

+
+
+
dlqDeadLetterExchange
+
+

When a DLQ is declared, a DLX to assign to that queue. +Applies only if requiredGroups are provided and then only to those groups.

+
+

Default: none

+
+
+
dlqDeadLetterRoutingKey
+
+

When a DLQ is declared, a dead letter routing key to assign to that queue. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: none

+
+
+
dlqExpires
+
+

How long (in milliseconds) before an unused dead letter queue is deleted. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: no expiration

+
+
+
dlqLazy
+
+

Declare the dead letter queue with the x-queue-mode=lazy argument. +See “Lazy Queues”. +Consider using a policy instead of this setting, because using a policy allows changing the setting without deleting the queue. +Applies only when requiredGroups are provided and then only to those groups.

+
+
dlqMaxLength
+
+

Maximum number of messages in the dead letter queue. +Applies only if requiredGroups are provided and then only to those groups.

+
+

Default: no limit

+
+
+
dlqMaxLengthBytes
+
+

Maximum number of total bytes in the dead letter queue from all messages. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: no limit

+
+
+
dlqMaxPriority
+
+

Maximum priority of messages in the dead letter queue (0-255) +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: none

+
+
+
dlqQuorum.deliveryLimit
+
+

When quorum.enabled=true, set a delivery limit after which the message is dropped or dead-lettered. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: none - broker default will apply.

+
+
+
dlqQuorum.enabled
+
+

When true, create a quorum dead letter queue instead of a classic queue. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: false

+
+
+
dlqQuorum.initialQuorumSize
+
+

When quorum.enabled=true, set the initial quorum size. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: none - broker default will apply.

+
+
+
dlqSingleActiveConsumer
+
+

Set to true to set the x-single-active-consumer queue property to true. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: false

+
+
+
dlqTtl
+
+

Default time (in milliseconds) to live to apply to the dead letter queue when declared. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: no limit

+
+
+
exchangeAutoDelete
+
+

If declareExchange is true, whether the exchange should be auto-delete (it is removed after the last queue is removed).

+
+

Default: true.

+
+
+
exchangeDurable
+
+

If declareExchange is true, whether the exchange should be durable (survives broker restart).

+
+

Default: true.

+
+
+
exchangeType
+
+

The exchange type: direct, fanout, headers or topic for non-partitioned destinations and direct, headers or topic for partitioned destinations.

+
+

Default: topic.

+
+
+
expires
+
+

How long (in milliseconds) before an unused queue is deleted. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: no expiration

+
+
+
headerPatterns
+
+

Patterns for headers to be mapped to outbound messages.

+
+

Default: ['*'] (all headers).

+
+
+
lazy
+
+

Declare the queue with the x-queue-mode=lazy argument. +See “Lazy Queues”. +Consider using a policy instead of this setting, because using a policy allows changing the setting without deleting the queue. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: false.

+
+
+
maxLength
+
+

Maximum number of messages in the queue. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: no limit

+
+
+
maxLengthBytes
+
+

Maximum number of total bytes in the queue from all messages. +Only applies if requiredGroups are provided and then only to those groups.

+
+

Default: no limit

+
+
+
maxPriority
+
+

Maximum priority of messages in the queue (0-255). +Only applies if requiredGroups are provided and then only to those groups.

+
+

Default: none

+
+
+
prefix
+
+

A prefix to be added to the name of the destination exchange.

+
+

Default: "".

+
+
+
queueBindingArguments
+
+

Arguments applied when binding the queue to the exchange; used with headers exchangeType to specify headers to match on. +For example …​queueBindingArguments.x-match=any, …​queueBindingArguments.someHeader=someValue. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: empty

+
+
+
queueNameGroupOnly
+
+

When true, consume from a queue with a name equal to the group. +Otherwise the queue name is destination.group. +This is useful, for example, when using Spring Cloud Stream to consume from an existing RabbitMQ queue. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: false.

+
+
+
quorum.deliveryLimit
+
+

When quorum.enabled=true, set a delivery limit after which the message is dropped or dead-lettered. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: none - broker default will apply.

+
+
+
quorum.enabled
+
+

When true, create a quorum queue instead of a classic queue. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: false

+
+
+
quorum.initialQuorumSize
+
+

When quorum.enabled=true, set the initial quorum size. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: none - broker default will apply.

+
+
+
routingKeyExpression
+
+

A SpEL expression to determine the routing key to use when publishing messages. +For a fixed routing key, use a literal expression, such as routingKeyExpression='my.routingKey' in a properties file or routingKeyExpression: '''my.routingKey''' in a YAML file.

+
+

Default: destination or destination-<partition> for partitioned destinations.

+
+
+
singleActiveConsumer
+
+

Set to true to set the x-single-active-consumer queue property to true. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: false

+
+
+
transacted
+
+

Whether to use transacted channels.

+
+

Default: false.

+
+
+
ttl
+
+

Default time (in milliseconds) to live to apply to the queue when declared. +Applies only when requiredGroups are provided and then only to those groups.

+
+

Default: no limit

+
+
+
+
+
+ + + + + +
+ + +In the case of RabbitMQ, content type headers can be set by external applications. +Spring Cloud Stream supports them as part of an extended internal protocol used for any type of transport — including transports, such as Kafka (prior to 0.11), that do not natively support headers. +
+
+
+
+
+
+

4. Using Existing Queues/Exchanges

+
+
+

By default, the binder will automatically provision a topic exchange with the name being derived from the value of the destination binding property <prefix><destination>. +The destination defaults to the binding name, if not provided. +When binding a consumer, a queue will automatically be provisioned with the name <prefix><destination>.<group> (if a group binding property is specified), or an anonymous, auto-delete queue when there is no group. +The queue will be bound to the exchange with the "match-all" wildcard routing key (#) for a non-partitioned binding or <destination>-<instanceIndex> for a partitioned binding. +The prefix is an empty String by default. +If an output binding is specified with requiredGroups, a queue/binding will be provisioned for each group.

+
+
+

There are a number of rabbit-specific binding properties that allow you to modify this default behavior.

+
+
+

If you have an existing exchange/queue that you wish to use, you can completely disable automatic provisioning as follows, assuming the exchange is named myExchange and the queue is named myQueue:

+
+
+
    +
  • +

    spring.cloud.stream.bindings.<binding name>.destination=myExhange

    +
  • +
  • +

    spring.cloud.stream.bindings.<binding name>.group=myQueue

    +
  • +
  • +

    spring.cloud.stream.rabbit.bindings.<binding name>.consumer.bindQueue=false

    +
  • +
  • +

    spring.cloud.stream.rabbit.bindings.<binding name>.consumer.declareExchange=false

    +
  • +
  • +

    spring.cloud.stream.rabbit.bindings.<binding name>.consumer.queueNameGroupOnly=true

    +
  • +
+
+
+

If you want the binder to provision the queue/exchange, but you want to do it using something other than the defaults discussed here, use the following properties. +Refer to the property documentation above for more information.

+
+
+
    +
  • +

    spring.cloud.stream.rabbit.bindings.<binding name>.consumer.bindingRoutingKey=myRoutingKey

    +
  • +
  • +

    spring.cloud.stream.rabbit.bindings.<binding name>.consumer.exchangeType=<type>

    +
  • +
  • +

    spring.cloud.stream.rabbit.bindings.<binding name>.producer.routingKeyExpression='myRoutingKey'

    +
  • +
+
+
+

There are similar properties used when declaring a dead-letter exchange/queue, when autoBindDlq is true.

+
+
+
+
+

5. Retry With the RabbitMQ Binder

+
+
+

When retry is enabled within the binder, the listener container thread is suspended for any back off periods that are configured. +This might be important when strict ordering is required with a single consumer. However, for other use cases, it prevents other messages from being processed on that thread. +An alternative to using binder retry is to set up dead lettering with time to live on the dead-letter queue (DLQ) as well as dead-letter configuration on the DLQ itself. +See “RabbitMQ Binder Properties” for more information about the properties discussed here. +You can use the following example configuration to enable this feature:

+
+
+
    +
  • +

    Set autoBindDlq to true. +The binder create a DLQ. +Optionally, you can specify a name in deadLetterQueueName.

    +
  • +
  • +

    Set dlqTtl to the back off time you want to wait between redeliveries.

    +
  • +
  • +

    Set the dlqDeadLetterExchange to the default exchange. +Expired messages from the DLQ are routed to the original queue, because the default deadLetterRoutingKey is the queue name (destination.group). +Setting to the default exchange is achieved by setting the property with no value, as shown in the next example.

    +
  • +
+
+
+

To force a message to be dead-lettered, either throw an AmqpRejectAndDontRequeueException or set requeueRejected to true (the default) and throw any exception.

+
+
+

The loop continue without end, which is fine for transient problems, but you may want to give up after some number of attempts. +Fortunately, RabbitMQ provides the x-death header, which lets you determine how many cycles have occurred.

+
+
+

To acknowledge a message after giving up, throw an ImmediateAcknowledgeAmqpException.

+
+
+

5.1. Putting it All Together

+
+

The following configuration creates an exchange myDestination with queue myDestination.consumerGroup bound to a topic exchange with a wildcard routing key #:

+
+
+
+
---
+spring.cloud.stream.bindings.input.destination=myDestination
+spring.cloud.stream.bindings.input.group=consumerGroup
+#disable binder retries
+spring.cloud.stream.bindings.input.consumer.max-attempts=1
+#dlx/dlq setup
+spring.cloud.stream.rabbit.bindings.input.consumer.auto-bind-dlq=true
+spring.cloud.stream.rabbit.bindings.input.consumer.dlq-ttl=5000
+spring.cloud.stream.rabbit.bindings.input.consumer.dlq-dead-letter-exchange=
+---
+
+
+
+

This configuration creates a DLQ bound to a direct exchange (DLX) with a routing key of myDestination.consumerGroup. +When messages are rejected, they are routed to the DLQ. +After 5 seconds, the message expires and is routed to the original queue by using the queue name as the routing key, as shown in the following example:

+
+
+
Spring Boot application
+
+
@SpringBootApplication
+@EnableBinding(Sink.class)
+public class XDeathApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(XDeathApplication.class, args);
+    }
+
+    @StreamListener(Sink.INPUT)
+    public void listen(String in, @Header(name = "x-death", required = false) Map<?,?> death) {
+        if (death != null && death.get("count").equals(3L)) {
+            // giving up - don't send to DLX
+            throw new ImmediateAcknowledgeAmqpException("Failed after 4 attempts");
+        }
+        throw new AmqpRejectAndDontRequeueException("failed");
+    }
+
+}
+
+
+
+

Notice that the count property in the x-death header is a Long.

+
+
+
+
+
+

6. 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.

+
+
+

RabbitMQ has two types of send failures:

+
+
+ +
+
+

The latter is rare. +According to the RabbitMQ documentation "[A nack] will only be delivered if an internal error occurs in the Erlang process responsible for a queue.".

+
+
+

As well as enabling producer error channels (as described in “[spring-cloud-stream-overview-error-handling]”), the RabbitMQ binder only sends messages to the channels if the connection factory is appropriately configured, as follows:

+
+
+
    +
  • +

    ccf.setPublisherConfirms(true);

    +
  • +
  • +

    ccf.setPublisherReturns(true);

    +
  • +
+
+
+

When using Spring Boot configuration for the connection factory, set the following properties:

+
+
+
    +
  • +

    spring.rabbitmq.publisher-confirms

    +
  • +
  • +

    spring.rabbitmq.publisher-returns

    +
  • +
+
+
+

The payload of the ErrorMessage for a returned message is a ReturnedAmqpMessageException with the following properties:

+
+
+
    +
  • +

    failedMessage: The spring-messaging Message<?> that failed to be sent.

    +
  • +
  • +

    amqpMessage: The raw spring-amqp Message.

    +
  • +
  • +

    replyCode: An integer value indicating the reason for the failure (for example, 312 - No route).

    +
  • +
  • +

    replyText: A text value indicating the reason for the failure (for example, NO_ROUTE).

    +
  • +
  • +

    exchange: The exchange to which the message was published.

    +
  • +
  • +

    routingKey: The routing key used when the message was published.

    +
  • +
+
+
+

For negatively acknowledged confirmations, the payload is a NackedAmqpMessageException with the following properties:

+
+
+
    +
  • +

    failedMessage: The spring-messaging Message<?> that failed to be sent.

    +
  • +
  • +

    nackReason: A reason (if available — you may need to examine the broker logs for more information).

    +
  • +
+
+
+

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

+
+
+
+
+

7. Dead-Letter Queue Processing

+
+
+

Because you cannot anticipate how users would want to dispose of dead-lettered messages, the framework 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 queue. +However, if the problem is a permanent issue, that could cause an infinite loop. +The following Spring Boot application shows an example of how to route those messages back to the original queue but moves them to a third “parking lot” queue after three attempts. +The second example uses the RabbitMQ Delayed Message Exchange to introduce a delay to the re-queued message. +In this example, the delay increases for each attempt. +These examples use a @RabbitListener to receive messages from the DLQ. +You could also use RabbitTemplate.receive() in a batch process.

+
+
+

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

+
+
+

7.1. Non-Partitioned Destinations

+
+

The first two examples are for when the destination is not partitioned:

+
+
+
+
@SpringBootApplication
+public class ReRouteDlqApplication {
+
+    private static final String ORIGINAL_QUEUE = "so8400in.so8400";
+
+    private static final String DLQ = ORIGINAL_QUEUE + ".dlq";
+
+    private static final String PARKING_LOT = ORIGINAL_QUEUE + ".parkingLot";
+
+    private static final String X_RETRIES_HEADER = "x-retries";
+
+    public static void main(String[] args) throws Exception {
+        ConfigurableApplicationContext context = SpringApplication.run(ReRouteDlqApplication.class, args);
+        System.out.println("Hit enter to terminate");
+        System.in.read();
+        context.close();
+    }
+
+    @Autowired
+    private RabbitTemplate rabbitTemplate;
+
+    @RabbitListener(queues = DLQ)
+    public void rePublish(Message failedMessage) {
+        Integer retriesHeader = (Integer) failedMessage.getMessageProperties().getHeaders().get(X_RETRIES_HEADER);
+        if (retriesHeader == null) {
+            retriesHeader = Integer.valueOf(0);
+        }
+        if (retriesHeader < 3) {
+            failedMessage.getMessageProperties().getHeaders().put(X_RETRIES_HEADER, retriesHeader + 1);
+            this.rabbitTemplate.send(ORIGINAL_QUEUE, failedMessage);
+        }
+        else {
+            this.rabbitTemplate.send(PARKING_LOT, failedMessage);
+        }
+    }
+
+    @Bean
+    public Queue parkingLot() {
+        return new Queue(PARKING_LOT);
+    }
+
+}
+
+
+
+
+
@SpringBootApplication
+public class ReRouteDlqApplication {
+
+    private static final String ORIGINAL_QUEUE = "so8400in.so8400";
+
+    private static final String DLQ = ORIGINAL_QUEUE + ".dlq";
+
+    private static final String PARKING_LOT = ORIGINAL_QUEUE + ".parkingLot";
+
+    private static final String X_RETRIES_HEADER = "x-retries";
+
+    private static final String DELAY_EXCHANGE = "dlqReRouter";
+
+    public static void main(String[] args) throws Exception {
+        ConfigurableApplicationContext context = SpringApplication.run(ReRouteDlqApplication.class, args);
+        System.out.println("Hit enter to terminate");
+        System.in.read();
+        context.close();
+    }
+
+    @Autowired
+    private RabbitTemplate rabbitTemplate;
+
+    @RabbitListener(queues = DLQ)
+    public void rePublish(Message failedMessage) {
+        Map<String, Object> headers = failedMessage.getMessageProperties().getHeaders();
+        Integer retriesHeader = (Integer) headers.get(X_RETRIES_HEADER);
+        if (retriesHeader == null) {
+            retriesHeader = Integer.valueOf(0);
+        }
+        if (retriesHeader < 3) {
+            headers.put(X_RETRIES_HEADER, retriesHeader + 1);
+            headers.put("x-delay", 5000 * retriesHeader);
+            this.rabbitTemplate.send(DELAY_EXCHANGE, ORIGINAL_QUEUE, failedMessage);
+        }
+        else {
+            this.rabbitTemplate.send(PARKING_LOT, failedMessage);
+        }
+    }
+
+    @Bean
+    public DirectExchange delayExchange() {
+        DirectExchange exchange = new DirectExchange(DELAY_EXCHANGE);
+        exchange.setDelayed(true);
+        return exchange;
+    }
+
+    @Bean
+    public Binding bindOriginalToDelay() {
+        return BindingBuilder.bind(new Queue(ORIGINAL_QUEUE)).to(delayExchange()).with(ORIGINAL_QUEUE);
+    }
+
+    @Bean
+    public Queue parkingLot() {
+        return new Queue(PARKING_LOT);
+    }
+
+}
+
+
+
+
+

7.2. Partitioned Destinations

+
+

With partitioned destinations, there is one DLQ for all partitions. We determine the original queue from the headers.

+
+
+

7.2.1. republishToDlq=false

+
+

When republishToDlq is false, RabbitMQ publishes the message to the DLX/DLQ with an x-death header containing information about the original destination, as shown in the following example:

+
+
+
+
@SpringBootApplication
+public class ReRouteDlqApplication {
+
+	private static final String ORIGINAL_QUEUE = "so8400in.so8400";
+
+	private static final String DLQ = ORIGINAL_QUEUE + ".dlq";
+
+	private static final String PARKING_LOT = ORIGINAL_QUEUE + ".parkingLot";
+
+	private static final String X_DEATH_HEADER = "x-death";
+
+	private static final String X_RETRIES_HEADER = "x-retries";
+
+	public static void main(String[] args) throws Exception {
+		ConfigurableApplicationContext context = SpringApplication.run(ReRouteDlqApplication.class, args);
+		System.out.println("Hit enter to terminate");
+		System.in.read();
+		context.close();
+	}
+
+	@Autowired
+	private RabbitTemplate rabbitTemplate;
+
+	@SuppressWarnings("unchecked")
+	@RabbitListener(queues = DLQ)
+	public void rePublish(Message failedMessage) {
+		Map<String, Object> headers = failedMessage.getMessageProperties().getHeaders();
+		Integer retriesHeader = (Integer) headers.get(X_RETRIES_HEADER);
+		if (retriesHeader == null) {
+			retriesHeader = Integer.valueOf(0);
+		}
+		if (retriesHeader < 3) {
+			headers.put(X_RETRIES_HEADER, retriesHeader + 1);
+			List<Map<String, ?>> xDeath = (List<Map<String, ?>>) headers.get(X_DEATH_HEADER);
+			String exchange = (String) xDeath.get(0).get("exchange");
+			List<String> routingKeys = (List<String>) xDeath.get(0).get("routing-keys");
+			this.rabbitTemplate.send(exchange, routingKeys.get(0), failedMessage);
+		}
+		else {
+			this.rabbitTemplate.send(PARKING_LOT, failedMessage);
+		}
+	}
+
+	@Bean
+	public Queue parkingLot() {
+		return new Queue(PARKING_LOT);
+	}
+
+}
+
+
+
+
+

7.2.2. republishToDlq=true

+
+

When republishToDlq is true, the republishing recoverer adds the original exchange and routing key to headers, as shown in the following example:

+
+
+
+
@SpringBootApplication
+public class ReRouteDlqApplication {
+
+	private static final String ORIGINAL_QUEUE = "so8400in.so8400";
+
+	private static final String DLQ = ORIGINAL_QUEUE + ".dlq";
+
+	private static final String PARKING_LOT = ORIGINAL_QUEUE + ".parkingLot";
+
+	private static final String X_RETRIES_HEADER = "x-retries";
+
+	private static final String X_ORIGINAL_EXCHANGE_HEADER = RepublishMessageRecoverer.X_ORIGINAL_EXCHANGE;
+
+	private static final String X_ORIGINAL_ROUTING_KEY_HEADER = RepublishMessageRecoverer.X_ORIGINAL_ROUTING_KEY;
+
+	public static void main(String[] args) throws Exception {
+		ConfigurableApplicationContext context = SpringApplication.run(ReRouteDlqApplication.class, args);
+		System.out.println("Hit enter to terminate");
+		System.in.read();
+		context.close();
+	}
+
+	@Autowired
+	private RabbitTemplate rabbitTemplate;
+
+	@RabbitListener(queues = DLQ)
+	public void rePublish(Message failedMessage) {
+		Map<String, Object> headers = failedMessage.getMessageProperties().getHeaders();
+		Integer retriesHeader = (Integer) headers.get(X_RETRIES_HEADER);
+		if (retriesHeader == null) {
+			retriesHeader = Integer.valueOf(0);
+		}
+		if (retriesHeader < 3) {
+			headers.put(X_RETRIES_HEADER, retriesHeader + 1);
+			String exchange = (String) headers.get(X_ORIGINAL_EXCHANGE_HEADER);
+			String originalRoutingKey = (String) headers.get(X_ORIGINAL_ROUTING_KEY_HEADER);
+			this.rabbitTemplate.send(exchange, originalRoutingKey, failedMessage);
+		}
+		else {
+			this.rabbitTemplate.send(PARKING_LOT, failedMessage);
+		}
+	}
+
+	@Bean
+	public Queue parkingLot() {
+		return new Queue(PARKING_LOT);
+	}
+
+}
+
+
+
+
+
+
+
+

8. Partitioning with the RabbitMQ Binder

+
+
+

RabbitMQ does not support 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 RabbitMessageChannelBinder provides partitioning by binding a queue for each partition to the destination exchange.

+
+
+

The following Java and YAML examples show how to configure the producer:

+
+
+
Producer
+
+
@SpringBootApplication
+@EnableBinding(Source.class)
+public class RabbitPartitionProducerApplication {
+
+    private static final Random RANDOM = new Random(System.currentTimeMillis());
+
+    private static final String[] data = new String[] {
+            "abc1", "def1", "qux1",
+            "abc2", "def2", "qux2",
+            "abc3", "def3", "qux3",
+            "abc4", "def4", "qux4",
+            };
+
+    public static void main(String[] args) {
+        new SpringApplicationBuilder(RabbitPartitionProducerApplication.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.destination
+              producer:
+                partitioned: true
+                partition-key-expression: headers['partitionKey']
+                partition-count: 2
+                required-groups:
+                - myGroup
+
+
+
+ + + + + +
+ + +
+

The configuration in the prececing example 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.

+
+
+

The required-groups property is required only if you need the consumer queues to be provisioned when the producer is deployed. +Otherwise, any messages sent to a partition are lost until the corresponding consumer is deployed.

+
+
+
+
+

The following configuration provisions a topic exchange:

+
+
+
+part exchange +
+
+
+

The following queues are bound to that exchange:

+
+
+
+part queues +
+
+
+

The following bindings associate the queues to the exchange:

+
+
+
+part bindings +
+
+
+

The following Java and YAML examples continue the previous examples and show how to configure the consumer:

+
+
+
Consumer
+
+
@SpringBootApplication
+@EnableBinding(Sink.class)
+public class RabbitPartitionConsumerApplication {
+
+    public static void main(String[] args) {
+        new SpringApplicationBuilder(RabbitPartitionConsumerApplication.class)
+            .web(false)
+            .run(args);
+    }
+
+    @StreamListener(Sink.INPUT)
+    public void listen(@Payload String in, @Header(AmqpHeaders.CONSUMER_QUEUE) String queue) {
+        System.out.println(in + " received from queue " + queue);
+    }
+
+}
+
+
+
+
application.yml
+
+
    spring:
+      cloud:
+        stream:
+          bindings:
+            input:
+              destination: partitioned.destination
+              group: myGroup
+              consumer:
+                partitioned: true
+                instance-index: 0
+
+
+
+ + + + + +
+ + +The RabbitMessageChannelBinder does not support dynamic scaling. +There must be at least one consumer per partition. +The consumer’s instanceIndex is used to indicate which partition is consumed. +Platforms such as Cloud Foundry can have only one instance with an instanceIndex. +
+
+
+
+

Appendices

+
+

Appendix A: Building

+
+
+

A.1. Basic Compile and Test

+
+

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

+
+
+

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 RabbitMQ server running +on localhost and the default port (5672) +before building.

+
+
+

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 "docs" profile that will generate documentation.

+
+
+

./mvnw clean package -Pdocs -DskipTests

+
+
+

The reference documentation can then be found in docs/target/contents/reference.

+
+
+
+

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.

+
+
+
+
+
+
+

Appendix B: 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.

+
+
+

B.1. 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.

+
+
+
+

B.2. 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-rabbit/3.0.6.RELEASE/reference/htmlsingle/Guardfile b/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/htmlsingle/Guardfile new file mode 100644 index 00000000..bdd4d729 --- /dev/null +++ b/spring-cloud-stream-binder-rabbit/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-rabbit/3.0.6.RELEASE/reference/htmlsingle/css/spring.css b/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/htmlsingle/css/spring.css new file mode 100644 index 00000000..7fead00e --- /dev/null +++ b/spring-cloud-stream-binder-rabbit/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-rabbit/3.0.6.RELEASE/reference/htmlsingle/favicon.ico b/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/htmlsingle/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..1a4956e64705230122da8c19d762a7f8e6971533 GIT binary patch literal 111804 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 literal 0 HcmV?d00001 diff --git a/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/htmlsingle/images/rabbit-binder.png b/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/htmlsingle/images/rabbit-binder.png new file mode 100644 index 0000000000000000000000000000000000000000..aabf698b3a9873395764d1d974996a22436188a9 GIT binary patch literal 12440 zcmb8VcT`hL7dK1?sVX8!ji^-VL^=dfvCyk@q<5s3&{4Tai-MHU6s1D|si9+m&}-;L zCDZ_+hZ5jD;Jxel*82W=U)ExsIg^=v_UzfS%WqG#mWC=FH7hj{5fR;!#}9Ofh={j= ze(@9J^I6Nm5sFb8ALj zrlN?>xqOEzn*NO_wUzi~vBx9-@Mu_x@(jv1B4t-;4O8Z~;ezwF?55wve?*VnjS{;` zcT<479CxUJ7G^-}qZx`;Wc6FzOWpPT&;e+f{C(V7)7f!LoN_^M(T;rQ&WEg)jYGHo zgn*Dj&|Kp}lX0wv74u^H$t(_|)YOu_-H6^1@1K`X(WwHxlGWME8oP!`V>S!dGq9m& zSbISq&*pO4Xc;S0>FEJRs+Z$(%mP{ZNWJHJzeB~^V9_x3+SW2^DjvBSSl z{8)}R_1lF{V`YrZUMTK!CB^jOK5Lcb^4+JZe&{r7qML+c=B{z~+i8P4E{@YkX^&e4 z6*WRLE2K2QHAT}wf6yZd`pK#JpJ$AyZYJr(jD#9$Tg6Yy3+be46l1IsrI?0kv6UukiJuQS6#hZE1})ECE(P52>VeLswkGTuB6dU|cyUfcWTtJP=J zz4HPrcA3`k8&i*8M0>D=%|6Fbc5oCUMEzKEX0CKSVY;~Ku}y2O#6o9%KYZhj9i?V=;(MvkXNH>?jglbw)+!h zlU-ML0?ULKS;Add>=X91%mMz#e8D2nmL1l&vai1C(wPepPP9*Y#o~-|H@{0CAN6VC z9OM0jBtq|zeY=_D12;2uP&D{~{e;u{^&+Em6bBu;+~Rxs3E$xUWm$!fW~8)-PYb~3L_^*;Jq5JZ6 zSh=qaDQ>;L?`3nMMh%YjLJRV+6??V{GPG;m=DsG3_7;=~g?rp1ztJvP$u^bygI%1g z_2xBJrcqz;8NO$BQ99g}#kyCoK<(vBcW-FGg36tTx9{ITgrFCd<9KHp!bxbY366hK zoAnp{)pHNIlHOC!++qKIW=$yoZ`(p7|PUpXg6Kf2j$mw8mlcTUY)A6b#_BQZtmondvsC?5jGsE&eC^2l>z~4i3ESCooFCL#HT?% zeSIYvQ-^e}zecpfzS%n*%b{mIOMwYv_bET}kqR|ck~mSa>a|C(RTLI>_N9uETF=dQ zB;av0=$>#hUz1xe0)4l33eT4(s{`n&s*>rD2gsuC<)^0oNoTQrp;XfC>GG}*IV4`! zV5FWSTVFNH$S^Fh`Q4*vrizVg7Ysj@iq2-c0kek0%jM7#oqxNe-COSyHA)O%mfw;L zkkHda9%4`0iw-J)&VMan3b70YhU$DSu?$ERkl6oP^Oqws0!TCzr9yZj2}L-wRh*n| z@K%@D#x(d*zlCZ&^)(WJ?Mey^*NpYr5?jM0fgr#AM|GyUv9*Tx*g7vFh_Dnj@#jwv z!gVC~4te(O3ffjenhfC2o*ZRprnAa5_vJ~Vr=rMdYdGnNm)QLK&YCLJxXRomCDana zeK)~zxJ&jJQzPLy$(Fpg*Z;Gqn9WuDMYzt2ImK0g+m25ZNQl0+v1JqkSJuwhN{j^| zM@UGhg4rUdVy416sD*Va1d@lT+$<;&;tQ$8XB6l_jjIop317HiT}LL#58$~Ynh`wJhWDw66|A8 zLLFxe&QLx_sF-rfHGVU1SZ>5C5!Tmz`<2Rk$BKyWo=ZlBX8X>3-1^j#BqDL?rplY~ z-}dyoH--DN6s9x^`WX~Z-2&9>W>Wi*EdX>8|9S0a`7qErDYgigGGo+vtT* zQCZ3EstKIEKHH{dX0A$d_JOpRXDPzfO$~3@Fx|dAy9rAvCaYeYe{gFqoBcn_xEjSN zwjX-+pH$*!%UUm%R0SII0E59Enetdu)6kPWF<6;7hht!`4b1uR#2=i7`Vn$JH&|dm za7?**Y4FM^(m${REe3P1KOFi#3vHo{0n}n%D}um~&W$gQ7a1!X%y}3?@T%}#pJYMp z`Q=4U-_c$Pe&jdhzkssS@&hsdAPOMEK(mjXXfX*Pe(!p_yXA%bB5sEHs{I3q3QoiWjn)5P3&bH2`vJ|VO@GF1I4>(PJ>1K`QI6@Cpb`S|Jml2 z^X?*2y3!LN$3wbZU=irxAOSmDM)VV3&^mxLpV3=0$DUOE%6B|5Zt&l-Iy0R{23XT# zgo!lxT_lQgm`dxUqP>>3i!Gg3 zMx1V532ua&gjXB}TuIup9AbnlJ!aH6Nsr-Al}nD#lmu}QM)}$q9hB83E2GA zwm%eo%LSJI~K8MpRA$VfOXAQxD4Bd_&d-XIBi4oaQ=)-~*TQ zLxc*~xJ>+s4AMGl_Wg<3)P##WtU2!Qq@amB`z3e`CXgw#Gr0F{56bj8E{NI7qvo21 z$0rf(!VRtCY4)lcx(~~+mG68Geb<(~>I|}=_>vkLd$Z;5rc29F&%QBu-ica~`*;-w z9nDxf2~24^OKGYNmUMaSZZgvp#PIlnK@!X=4cGWB@w2*929l>x-(KVc+OIrIHC*?imZJZcAUeW`gQNg@x1nkDLdwl5DrnZHELW zM#;i1h>zb>VWPasmKpO}BF2a^@Hl5bg*c7OGhk#*qAt%vxTpV2?&Z0m=<|m;TP4At zTDxaVZhsXibquDcbir@<@ETIsu%c4V{F5{By)?tg+K5~1D4i5OLG$_No-i4k6#Y-nv^U2~ijIQ;6;|>*QZmm3@Vk>|BuWy;xAUSM~duP;}6v$Nmzi~+T zUOj^$cO+!wf1zpM< zz_#5w*H;t-aicfsjlM(%u{QAjJs-ZD@-y0u9OZE@(o{FT=!uzE9I4jDFGr1pMg}^@ z@4P-&13=ZZ}r~ff6d&jRNopblXgc zaixWl`!jOH7o#X-q*NN*&wrxv^h;2vAaMZ1LJx2bcsG*6W0Sa2tlQfAEh32?Pm)smAx@}IDVs??0hq}*~t$XLN-aKI4>3CA3d+`@0;|?3pc%Fk#w-| zIz8<6MHsOpiIQ@gb_hMeT1f3+%UU*6b^tGbNvQ=t3)MWVP~7Q}INe$Xrzj&vidjVv zdL@vn7yGbsOVgpv`0Bt)f8Sl0v-majw>h2K|I!4ukCPkbY^(z=#2M4D|J4Fm{uK;0 ze5wgrd-5xifv^|PE@OoUoG!ktLj*b>Cv`Lxe7KOZzBguplls6V?>}IH+x-3g)OQ5K z)iNs*vPBcB(9|Bf|Di1C=Uks0u8|SjG1n5>a;8v~;6j8<9xk!N+LJuG&>KpOBiUhp z$bKb@Jh>+^p$R`5(}eF5EE`|wPU%QKn;dIiY$>xfwP^e(7}l^C&mlKj!lh_bJ|$E; zeHD6nAke+}Fwgx&XvM#oupkn}iAj9JGBwaYuDL-P8^(U&T!zU!+eTM9d9&p|?L+Z1 ze#c;!l?nT7R|?Pk4o>LZ{j{($TeEf3YP=q3?DQJZQW%G6$jQ;3SgX?Bi0&r};K0QR z35omSWj|6~oTM=MI8Z3Iw3e`t6?%I3D%*XoS;0WpywXlx0>*2sDe5aj^3$qI@Zie zHE+cw_3n`b3c!l96`I?*s^BBFu2a{c|4^}^(6NecFMmh^5$?I60BH)M$RCf9WjUG9 z*C6)SA&9U#8?4L3*E_ zQlRwYXF{2s`R6Pjlt%{jm%a<}*h?T)`EQdbku=`AXWq_`({D5)8ARK9C!?k0NavdV zd$8ggW>;3<>QTN5W4C?d^qIN*Rue?3Ynm=iLFNR_ph1Z-BJqsd^Bt1ju<3T>OU1N@ zQXZoi$qSH|biUNig~;7OSwPpT?UX&X41UxfO-Ei?PowvYV=_z(RGm&>fqlMLquL$ZVfeF@|Ry#fUs8-ce?}N1(Fc?bphw);kLiW&xC;fgK(`i>R2}-AR zXIY%ruez!#`yoaW|o*Y3AB8P@#`CyJu4hjmCAO@p7wpD z0bR+FHPJJ6C_DUZ8zxWlCL6hsM8%`Xmfm{U&gL#j>UtUTl<4yr<6aX@bKvF2oHGgzb(AD`(l4nD*Kg+wCe&{il0qQy;t;g{!dbAniqi3H)*jb~>r0{A-9mf& zzgl9u99t?Y+me&6kKeF3rafO5P4d$pe{u%U3<#e{N5ef<_N?nmha z&+lmCuC@Km?+hKI+PV$n4;5=2xe?WJO6=8Y8&!zqSP zXak3bT`#nl8NDcvS{S_5Fs@zMPlPdgpMzd_<_DhtNVe$z4}~(~l~5aDnZEJq?ojd} z>VrQ|>h;kl9b6@7dvTP7F{7i-nCW~g1MG9p032cVG=b*NHsQvtxwL!DY#@9PdW}`? zrJfL|-?G@qwAJ-lSnB&SzDZN{`KSGGml+UhuhwaARcS0RkZ#d7A)Do4cRqEAZo~}* zcB-{B>dglrrCknd%6(DaS-y{yDDC!woW_Gf?OR92l-t#UdF(9O7QXDTgs(uxQr$%1 zOOBCQ^@mBs6;=QUhKa7@T7w^n0wCx|wz;p5m7o(7K$v~DxWJ|F!!J#ZQk^&+r7vGF zi>ai>9OE9(mR&*-2MEBCF&@Y3MgkMV1>5WzQ*VfsO{ z&EE5=-CXTU3cj;Omu5si&u00&2%S6WUs(uwoDgstzLYPo#JuSitY~L>dztSY_%5nS z>`+~~8L!Y!ijkH;4b#Je`aj^<=2~FGxijdS$s=LW2toKR!83A-uwI3F*LDegftY4+X*Ah zgo66Mn3e`Sko*@=%Wm<~o!-u@jUM;>oCH%WLup)(0h5aW`T022eXws&*kc2!^G$pc zPO!*6@C2g#6{Ht2z)N?iyrAhdnCv7z*-u4X> zXJjlO+TIPH&OO%OoMKwKFb&GJ`$dHZmg{djvk%(bO;%5S+auT11+m;($G(h!@`TBE zDlFwmHU-~1|3;<$WOWYahS$|j&9A+OnhLy**y=++yX<+Bk+nHbW zur54y4EYqtFS!{q=;RkKotAgIi?z z;^;FVjwm~s=nq*e8ygzQZL=Q6BNviQtaQus;N1Gz&Ps)SDzeJLp`jjRivVPDZto*l zb3QIVE*pvy_gP5&;;13f7PC>moTMV3qAdJ4bhC}}v|gn7z^byJ9L#&dK~U53!BXr2 zA;GwM`n@~yioLuczgolXu#EsPbE&N)pu4*1!B8`K?}MfLa}Tkc^8V!$fn|-`Prn5R zA5YC`_`8U-5WX@j+br>+0|xHNQDe4;+8;ap3T6wx2~tIZxE^%99li0f$9u_h_=uE2 z{<4Y1rWdYwe+5$KwbaKr8n9ZJPrxT|$k~PNq|Y5df)9R2t+Tl|{%#39*!(?SL6)G2 zb58G<--%^VEiHC^d?d$NqS4@oi%0+B3MFhY{z6O!5|IAK>$NBAPBQDy+JeiPkDOdM znwY0kI7O#D8V?uKPn&mxPv@0RZ~0C~L$cQ7>w;HK4k$l*N0?SFgGbrqav0j&FI;dI z6NvdGd8wX(gcsqS9yVzfic@Gon&D(vF1fVXS%nWf9`CRB!t*Qubb;|Bv%I2fx9gly z$NWd;5`O222LnFp6Nr8G*j9#(XB}K~X1`hmMJeab0~4$2y#pSP^*Mej&uZDa`FJIU zZ6GF#8JAHXb@liP@@sSVnTgAkq6U$i#}5G-v`UObjC&twq=zc|71^AhUf=w4{2?2N zZCLmcIr>jeju|85wRI~$u3?V4$rU-G;L~VAwu91Sh`ed!G4<$3CVFWdQ&T)y=Z!(V zvtzii@%x8@BpE)J)jucs)vv&fj3V^s&k$jpv9pV#wv9MfYw8D3S#-!7#s+HGd`8*3 zhV=qp{)RjZC09^65CZKN@nC8=Exy7F6O&yXp(J0Nz5{}IM(wFAGgvzLm$YZn%$Tw^9X(sND?|R)LF~MK%||MBPIy6O0j(9goc@ z$y*_5FeaTDrB`}J;TdlD(Yx9Uy=!LSo3rRvTlS!oe(TtCNkF?-aW>E)+9FTr>1g0P z4OsWNmoc(ho26?Ni-ByUDCoMQ)*uUgp7S4Wc@>$E0KxmcaMN(-=r>x`x%)xlAj8Dk z;ysGU1wBSX3%?+XAk_#{W#3K+V&{wXlZ6Azws;a`#2gQu*nWv|#2nx@l4jP08;F6V zWg~3bRTVs|5=DPUePQ(|2JBY<8G>kbGTbp7NRR0J(@~MXddr;#HS;}&dp@yr2a~9I zZz{$4hIHCZyA=u~VI#Ahe(l9tY$fq+Q2rVPW|~%pblb8#y*2NJ1N~~7*zd1w??2qN zXsF3mbOJ|Warbn*jjsYuGct-d)q>XLoh=fGh9h?~_^|09X0=d(=g5$~1GSgybiTtX5s6NCYF00X%Yi-<&qD=q~o9r6quEaA7^t}c6;98rfu%SZ`e%cy2tUgBx-*% z&;G|SnrkF#ChJEzKrA%f=@dtjksM9glh%4wCT|J!!xl19A94DU&SySnp+*G^#90aHU|N zSx132S`0gV8#||@4@$X6W|_w?(qdq>_AIEaPNQ=DO8=rocktXZC#U{bj%rg*;L_sg zlSM}e<6mTtI3Rf<*HwShlsmO}apR~{&Z)piHPX~zAiX9ZB>fABpUzX^F!|!Oqgn75 zp;Qy|woqXQ_1*=VNC!6z>$n$_f0FvP~CUqo5rZ@=az6_f;B|$cZ5^ z)BsrM1rXy6N^#HT2tR!093}{?=K_h5g>}=kvzkm*@3pyiUCy`uv7Rk(FHt!JjTi1+ zzM{%p78@t+6r0r&@6E(_uDAf&22|33Jl7*qm$D_;JE0;wePCvBX-RDL&MIPoe4RBV zyAYJUdHABHPCDC}&By3T+h9m=QB9Z%z=p@8NYhb8XMs2~@zWoLT9Mr)8ODnjg#&_h zuPp@6-wbKN2QM5O#qOxTMqUz+K`z~^y6qR;CBE@`Felz1-FzAMXktMF#wT20`pnOtv zwrZBh_P0U+0OQ@lqW46Ef2sCjRW!S6KdUAz$_5}1h?<>6wS@4Xm7&}kzuK3PK@;(5 zr&|QiXTg0cgv?C3Q{=&3q+vUx*wVDBbclOwGo!90R)M9e!mIsK6h z7)1^Q?a^b34OQXh5;ricIyDCkx``o(V8?9g-7X&(F2MU$sBqS-hYu|V2%q(KJPDkC zODV*j%s&;^s!+kQjhYz!juh;e15kuGMLuuvb*04|$qg%Syf4^A;M~~C*e7UL=`j%i zavm0h^RkEwCk*0*zXHe@<=?eRg8bgCQvdN(U)x#g?>}_@GFQ^~bFnu)J)GcITdVl4 zM-w4d_#S?Dz}`#hi#zpd;oxn7fPnTz=11+(WAugb$}{1du!L=sJAafBlL5PdH_x}) zAF>g2a(lyY$*9uqaLEcgTG|WYw8L|llm4|B(k9A?`QIT56_2v0FiJ+Ohpx5lCQBWl z`c}zo^MDVExqzna3yI!TLBs>gZ(+6!Qz z<}krpS#|6c5%b1zC1yXjSr$?xO_(nAlp5}qh_GOlz1jF&lvFUL6nCq|XYb*Ele%RQ z|M#T^mlw*XA^+8&023qk;u{%I#(Mjf8al%?Yz1l|YNx+TQ{JKTCZ4Um>(d6tY^&btB#T!$V^)zFhJ9QrOE@rqQ78I{WhC@EB z5S0Q7x?5URYcaM8Vn30E=myqjs+A9vdqdYmHRC6kzPwj zOIF>b($J7)7yMi?|ptfH$gEpRjxX(Kx5tWWv3Zbgoi|0+C} zCAG+o_^@OSo>~89#C#w+20s4%elyav^TiQu0U0I>%nNOqy@NXgOaT`i+t8GOpU52P z-%=$da&cN%u&>r@v1bc6W4b?HVcq1VZJDno-=F>6Ol9|?BoH*Uu5yA}H{Ji7u8Hse zInv$+%^7pN_qV{n3Dl1ACkD6gXaBrAGuvEnVhiC3H{}E$(;^%*Xm)na=-JO9^-2;< z-~S8#Z$#;t(JT%chHz3e-1T|V$8kT5{k%Z@7w`M8#qzfPg5#xYjW*RpgN`o$wLYxdpdI0!vV^~GP1Jd$r@1=PVp>Isj!0xTIQi37Ee ziwDqq{&w->tA8Ko6$M}{u%7n+9%Wny(z8NN2_;B1zTH{>j{*rYZadOf6GqX?IK;#xlqxX-xKyV0#* zfD-wekak3R-xnc(BqV;ya`=rS4S2mcEGzy5k$qz#@8ek3ylc0@I~NQ138G?loJ;tL zaqDr`@W8gBBC>xR-laMAWWR~*plCa}zcSuv3d2c`p(6I277(Q#h|b#$vU*)n+kem3 zGC?!N)s+sc3lY}RWW8EQPB}LQoium`GITv0@YBJ~uYBM|BrZc&xYcg6O97st+o zcH~!kSF_hyzh8L?jqw=v8Y@KBG5P|A&C`+-tfT zS_WE9v4F7-1pa#2?UvS|K#jUWUE5B)-9r>m{-`iyMz6c@%y{gszLGCDtk?kX*RG_< zu!0toBC%R#%!XXPllj?l7D}cN%Xz364MDKh&9*o=VB^(2E+N3J=t+;L@W$kv>!0Ei zvyx7l)u^-jD3S0vGcGrRy)fkNxaM8p;*+nw?oQZO5Xz#ib6kv6(M&ZM6+L>1vuq=p zEkA_yE>Cfb33%>7N9ib;P}x~%^WE(hP~o0;Pg{Q^XiVk)vtF#z)iH6|#Rnim!&g(Y zi0aY?;fPu}MW+Q0Yah0UWiPX(@FBnn9-F>o<74|kiHH2Pf(oB^-uJpu-QdFK_1;@??q`(bSjV!7v1I+ z0(bI~1Qgj>j|Fk6A%=7;DkHNax`)WO^?I>Ix!B+_5*QT*F~J41Pe%KA_*(3=@SXFU zIo#hkFv{~}+81`V3xAwgQ+f1mW^3kkXm@L4yR+GIf%bTk&Q^iXu zeN1{-5b5KVd3dEwF>_c|SPSXkN&f1N6Nz8&vaqP&tg%J!K9F;d>8(7U|1_>chklrr z&xVPHkD+xeb5urjI4aqmUMCB29v-Z*SD2P9&b9I9s(f=H4pj4EP0gd@KfB}&mtqkH zrOmSkidN`v90hwtVNz&RwZhnR7F8-eqHWUmtHaB&vuRdXac9#l2q&$vS1)$s%#tgF z8`coAdthtw^l-J$xx9rdA3uv5{MnOx!So}M9Vu#mr|#P~q?@#{ZOxMh{^ZJ|%JN2k z-s`ow71pck?7ibnfBxn35h@b=5?qE283``5+etRQk|f%$Kzkl!7_GXhfKNWAN+ij-oo@?92xKr~~D*8i>f{2Gq;pw>@rs8#f;qWO+x zu5>~+A}AxHeY|JA-F6|LK0;C)`^b1)99^FpP6sx${v@91%}qj3Wy+#ibgF%2QToN+ zU>D_%hZTbMKB64Oz@eKg>TIwS5t?_JZ7c8zmy%Xf#{$;=54ReKGVt=O+i@3kb~0^L z?-u={zh9xfZum5~tOGw&OMz))pNpuS(vWYgHe+7Sw061a?E7tsM*m8)W~GcUc}%=X$2=wRbMCBt4qs)qS9y~#iOhZx$Z3n z;SJ&^4C-XiJcTPg&ytF$GOaSF=3MMqSo_da&V4F@B~f4n7P=C#ZhrkMvU{vASl&j8 zDPAhZ=7Q$f@m=o)-s-)QRSvFC^P7T~v0BGQ-eT%obKTd1bB{b>ofx~Ty{Y-t2E<~W z(Ifm%1tLl&;rvcy=?9#>noN70LgJT`cCsZ>aO}MTYaJN~0m|_*W~5 z?4iq_E*IBN%Y#zqDq#_H^QNqJJpcFs*KVKj|D)wASy^_q$54%jh<@H>{}Ya-_({@R zn%<6)A6L2*&2qT#wzqmcPR99nMf-%EQ7ZwYy%pQsJN7ud;u~&;PirIpeC6KRC?D>r zP;$xn^<6r>Jvw`|m%a3^n7e<=j_mp6W0Pv8pNrL5WKTT`d8dV%t;GOLMy(s;U$9SW2X$51yXf|dk&HB!3yW*P@H1}l+pUmnKS_Ch< z>FeGmy+(e!JchYCspE8{F|T^s!#Vu2kfDz zS(JNtz0_FXHhbaAo6_|2yHLEWwN&4|j=nXHNPGxx&#hm5r1i>u-r{c#FLK~Vp@pzQ z0ST^Ayd-6Qh9f<2hy741*sp87q;W$47ILN@>oM?FJQN7xoPH1CY=1xB8H?Uq?2img zZP80kP1tSN4zV~}X`20wd}l>@bL5@QO|RS~6MbtuK}i9(O?^}SgM(OmCr2<#Nas%3 m?#s19?BE>Z;8H>F(b*)#;ju3Zg$ohz_vE3*1H^sHi2nmBSgF|n literal 0 HcmV?d00001 diff --git a/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/htmlsingle/js/highlight/highlight.min.js b/spring-cloud-stream-binder-rabbit/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-rabbit/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-rabbit/3.0.6.RELEASE/reference/htmlsingle/js/highlight/styles/atom-one-light.min.css b/spring-cloud-stream-binder-rabbit/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-rabbit/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-rabbit/3.0.6.RELEASE/reference/htmlsingle/js/highlight/styles/github-gist.css b/spring-cloud-stream-binder-rabbit/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-rabbit/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-rabbit/3.0.6.RELEASE/reference/htmlsingle/js/highlight/styles/github.min.css b/spring-cloud-stream-binder-rabbit/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-rabbit/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-rabbit/3.0.6.RELEASE/reference/htmlsingle/js/highlight/styles/googlecode.css b/spring-cloud-stream-binder-rabbit/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-rabbit/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-rabbit/3.0.6.RELEASE/reference/htmlsingle/js/highlight/styles/solarized-light.min.css b/spring-cloud-stream-binder-rabbit/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-rabbit/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-rabbit/3.0.6.RELEASE/reference/htmlsingle/js/toc.js b/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/htmlsingle/js/toc.js new file mode 100644 index 00000000..0b6fcd65 --- /dev/null +++ b/spring-cloud-stream-binder-rabbit/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 = '

\n' + + '

\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '

\n' + + '
'; + +var header = document.createElement("div"); +header.innerHTML = headerHtml; +document.body.insertBefore(header, document.body.firstChild); diff --git a/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/htmlsingle/js/tocbot/tocbot.css b/spring-cloud-stream-binder-rabbit/3.0.6.RELEASE/reference/htmlsingle/js/tocbot/tocbot.css new file mode 100644 index 00000000..0632de23 --- /dev/null +++ b/spring-cloud-stream-binder-rabbit/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-rabbit/3.0.6.RELEASE/reference/htmlsingle/js/tocbot/tocbot.min.js b/spring-cloud-stream-binder-rabbit/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-rabbit/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