You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Removed the backticks that were making links not render. Fixed a few typoes, too.
Integrating feedback from Artem
Artem caught some errors that I had made (and that my editor, Atom, had made - grrr). I fixed them.
Thanks, Artem. :)
Removing duplicate content
I caught that duplicate content somehow got added to preface.adoc. I removed one set of it to make that content not be duplicated.
* Fix `jdbc.adoc` typos
Copy file name to clipboardExpand all lines: src/reference/asciidoc/aggregator.adoc
+14-14Lines changed: 14 additions & 14 deletions
Original file line number
Diff line number
Diff line change
@@ -97,7 +97,7 @@ However, there are better solutions, less coupled to the API, for implementing t
97
97
In general, any POJO can implement the aggregation algorithm if it provides a method that accepts a single `java.util.List` as an argument (parameterized lists are supported as well).
98
98
This method is invoked for aggregating messages as follows:
99
99
100
-
* If the argument is a `java.util.Collection<T>`, and the parameter type T is assignable to `Message`, the whole list of messages accumulated for aggregation is sent to the aggregator.
100
+
* If the argument is a `java.util.Collection<T>` and the parameter type T is assignable to `Message`, the whole list of messages accumulated for aggregation is sent to the aggregator.
101
101
* If the argument is a non-parameterized `java.util.Collection` or the parameter type is not assignable to `Message`, the method receives the payloads of the accumulated messages.
102
102
* If the return type is not assignable to `Message`, it is treated as the payload for a `Message` that is automatically created by the framework.
103
103
@@ -142,7 +142,7 @@ public interface ReleaseStrategy {
142
142
In general, any POJO can implement the completion decision logic if it provides a method that accepts a single `java.util.List` as an argument (parameterized lists are supported as well) and returns a boolean value.
143
143
This method is invoked after the arrival of each new message, to decide whether the group is complete or not, as follows:
144
144
145
-
* If the argument is a `java.util.List<T>`, and the parameter type `T` is assignable to `Message`, the whole list of messages accumulated in the group is sent to the method.
145
+
* If the argument is a `java.util.List<T>` and the parameter type `T` is assignable to `Message`, the whole list of messages accumulated in the group is sent to the method.
146
146
* If the argument is a non-parametrized `java.util.List` or the parameter type is not assignable to `Message`, the method receives the payloads of the accumulated messages.
147
147
* The method must return `true` if the message group is ready for aggregation or false otherwise.
148
148
@@ -197,7 +197,7 @@ IMPORTANT: To facilitate discarding of late-arriving messages, the aggregator mu
197
197
This can eventually cause out-of-memory conditions.
198
198
To avoid such situations, you should consider configuring a `MessageGroupStoreReaper` to remove the group metadata.
199
199
The expiry parameters should be set to expire groups once a point has been reach after after which late messages are not expected to arrive.
200
-
For information about configuring a reaper, see "`<<reaper>>`".
200
+
For information about configuring a reaper, see <<reaper>>.
201
201
202
202
Spring Integration provides an implementation for `ReleaseStrategy`: `SimpleSequenceSizeReleaseStrategy`.
203
203
This implementation consults the `SEQUENCE_NUMBER` and `SEQUENCE_SIZE` headers of each arriving message to decide when a message group is complete and ready to be aggregated.
@@ -215,7 +215,7 @@ The 4.3 release changed the default `Collection` for messages in a `SimpleMessag
215
215
This was expensive when removing individual messages from large groups (an O(n) linear scan was required).
216
216
Although the hash set is generally much faster to remove, it can be expensive for large messages, because the hash has to be calculated on both inserts and removes.
217
217
If you have messages that are expensive to hash, consider using some other collection type.
218
-
As discussed in "`<<message-group-factory>>`", a `SimpleMessageGroupFactory` is provided so that you can select the `Collection` that best suits your needs.
218
+
As discussed in <<message-group-factory>>, a `SimpleMessageGroupFactory` is provided so that you can select the `Collection` that best suits your needs.
219
219
You can also provide your own factory implementation to create some other `Collection<Message<?>>`.
220
220
221
221
The following example shows how to configure an aggregator with the previous implementation and a `SimpleSequenceSizeReleaseStrategy`:
@@ -269,12 +269,12 @@ If you have a custom header name you would like to use for correlation, you can
269
269
Changes to groups are thread safe.
270
270
A `LockRegistry` is used to obtain a lock for the resolved correlation ID.
271
271
A `DefaultLockRegistry` is used by default (in-memory).
272
-
For synchronizing updates across servers, where a shared `MessageGroupStore` is being used, you must configure a shared lock registry.
272
+
For synchronizing updates across servers where a shared `MessageGroupStore` is being used, you must configure a shared lock registry.
273
273
274
274
[[aggregator-java-dsl]]
275
275
==== Configuring an Aggregator in Java DSL
276
276
277
-
See "`<<java-dsl-aggregators>>`" for how to configure an aggregator in Java DSL.
277
+
See <<java-dsl-aggregators>> for how to configure an aggregator in Java DSL.
278
278
279
279
[[aggregator-xml]]
280
280
===== Configuring an Aggregator with XML
@@ -349,7 +349,7 @@ Optional.
349
349
<6> A reference to a `MessageGroupStore` used to store groups of messages under their correlation key until they are complete.
350
350
Optional.
351
351
By default, it is a volatile in-memory store.
352
-
See "`<<message-store>>`" for more information.
352
+
See <<message-store>> for more information.
353
353
<7> The order of this aggregator when more than one handle is subscribed to the same `DirectChannel` (use for load-balancing purposes).
354
354
Optional.
355
355
<8> Indicates that expired messages should be aggregated and sent to the 'output-channel' or 'replyChannel' once their containing `MessageGroup` is expired (see https://docs.spring.io/spring-integration/api/org/springframework/integration/store/MessageGroupStore.html#expireMessageGroups-long[`MessageGroupStore.expireMessageGroups(long)`]).
@@ -407,7 +407,7 @@ Note that the actual time to expire an empty group is also affected by the reape
407
407
It used to obtain a `Lock` based on the `groupId` for concurrent operations on the `MessageGroup`.
408
408
By default, an internal `DefaultLockRegistry` is used.
409
409
Use of a distributed `LockRegistry`, such as the `ZookeeperLockRegistry`, ensures only one instance of the aggregator can operate on a group concurrently.
410
-
See "`<<redis-lock-registry>>`", "`<<gemfire-lock-registry>>`", and "`<<zk-lock-registry>>`" for more information.
410
+
See <<redis-lock-registry>>, <<gemfire-lock-registry>>, and <<zk-lock-registry>> for more information.
411
411
<21> A timeout (in milliseconds) to force the `MessageGroup` complete when the `ReleaseStrategy` does not release the group when the current message arrives.
412
412
This attribute provides a built-in time-based release strategy for the aggregator when there is a need to emit a partial result (or discard the group) if a new message does not arrive for the `MessageGroup` within the timeout.
413
413
When a new message arrives at the aggregator, any existing `ScheduledFuture<?>` for its `MessageGroup` is canceled.
@@ -417,7 +417,7 @@ Doing so effectively disables the aggregator, because every message group is imm
417
417
You can, however, conditionally set it to zero (or a negative value) by using an expression.
418
418
See `group-timeout-expression` for information.
419
419
The action taken during the completion depends on the `ReleaseStrategy` and the `send-partial-group-on-expiry` attribute.
420
-
See "`<<agg-and-group-to>>`" for more information.
420
+
See <<agg-and-group-to>> for more information.
421
421
It is mutually exclusive with 'group-timeout-expression' attribute.
422
422
<22> The SpEL expression that evaluates to a `groupTimeout` with the `MessageGroup` as the `#root` evaluation context object.
423
423
Used for scheduling the `MessageGroup` to be forced complete.
@@ -610,7 +610,7 @@ In the preceding example, the root object of the SpEL evaluation context is the
610
610
====== Aggregator and Group Timeout
611
611
612
612
Starting with version 4.0, two new mutually exclusive attributes have been introduced: `group-timeout` and `group-timeout-expression` (see the earlier description).
613
-
See "`<<aggregator-xml>>`".
613
+
See <<aggregator-xml>>.
614
614
In some cases, you may need to emit the aggregator result (or discard the group) after a timeout if the `ReleaseStrategy` does not release when the current message arrives.
615
615
For this purpose, the `groupTimeout` option lets scheduling the `MessageGroup` be forced to complete, as the following example shows:
616
616
@@ -634,7 +634,7 @@ If the release strategy still does not release the group, it is expired.
634
634
If `send-partial-result-on-expiry` is `true`, existing messages in the (partial) `MessageGroup` are released as a normal aggregator reply message to the `output-channel`.
635
635
Otherwise, it is discarded.
636
636
637
-
There is a difference between `groupTimeout` behavior and `MessageGroupStoreReaper` (see "`<<aggregator-xml>>`").
637
+
There is a difference between `groupTimeout` behavior and `MessageGroupStoreReaper` (see <<aggregator-xml>>).
638
638
The reaper initiates forced completion for all `MessageGroup` s in the `MessageGroupStore` periodically.
639
639
The `groupTimeout` does it for each `MessageGroup` individually if a new message does not arrive during the `groupTimeout`.
640
640
Also, the reaper can be used to remove empty groups (empty groups are retained in order to discard late messages if `expire-groups-upon-completion` is false).
@@ -699,7 +699,7 @@ public MessageHandler aggregator(MessageGroupStore jdbcMessageGroupStore) {
699
699
----
700
700
====
701
701
702
-
See "`<<aggregator-api>>`" and "`<<annotations_on_beans>>`" for more information.
702
+
See <<aggregator-api>> and <<annotations_on_beans>> for more information.
703
703
704
704
NOTE: Starting with version 4.2, the `AggregatorFactoryBean` is available to simplify Java configuration for the `AggregatingMessageHandler`.
705
705
@@ -761,7 +761,7 @@ public interface MessageGroupCallback {
761
761
The callback has direct access to the store and the message group so that it can manage the persistent state (for example, by entirely removing the group from the store).
762
762
763
763
The `MessageGroupStore` maintains a list of these callbacks, which it applies, on demand, to all messages whose timestamps are earlier than a time supplied as a parameter (see the `registerMessageGroupExpiryCallback(..)` and `expireMessageGroups(..)` methods, described earlier).
764
-
For more detail, see "`<<reaper>>`".
764
+
For more detail, see <<reaper>>.
765
765
766
766
You can call the `expireMessageGroups` method with a timeout value.
767
767
Any message older than the current time minus this value is expired and has the callbacks applied.
@@ -805,5 +805,5 @@ Messages with the same correlation key are stored in the same message group.
805
805
Some `MessageStore` implementations allow using the same physical resources, by partitioning the data.
806
806
For example, the `JdbcMessageStore` has a `region` property, and the `MongoDbMessageStore` has a `collectionName` property.
807
807
808
-
For more information about the `MessageStore` interface and its implementations, see "`<<message-store>>`".
808
+
For more information about the `MessageStore` interface and its implementations, see <<message-store>>.
Copy file name to clipboardExpand all lines: src/reference/asciidoc/amqp.adoc
+7-7Lines changed: 7 additions & 7 deletions
Original file line number
Diff line number
Diff line change
@@ -71,7 +71,7 @@ The user application is responsible for acknowledgement.
71
71
`NONE` means no acknowledgements (`autoAck`).
72
72
`AUTO` means the adapter's container acknowledges when the downstream flow completes.
73
73
Optional (defaults to AUTO).
74
-
See "`<<amqp-inbound-ack>>`".
74
+
See <<amqp-inbound-ack>>.
75
75
<5> Extra AOP Advices to handle cross-cutting behavior associated with this inbound channel adapter.
76
76
Optional.
77
77
<6> Flag to indicate that channels created by this component are transactional.
@@ -260,7 +260,7 @@ public class AmqpJavaApplication {
260
260
=== Polled Inbound Channel Adapter
261
261
262
262
Version 5.0.1 introduced a polled channel adapter, letting you fetch individual messages on demand -- for example, with a `MessageSourcePollingTemplate` or a poller.
263
-
See "`<<deferred-acks-message-source>>`" for more information.
263
+
See <<deferred-acks-message-source>> for more information.
264
264
265
265
It does not currently support XML configuration.
266
266
@@ -347,7 +347,7 @@ If this option is not specified and an external `amqp-template` is provided, no
347
347
You must either specify this option or configure a default `exchange` and `routingKey` on that template,
348
348
if you anticipate cases when no `replyTo` property exists in the request message.
349
349
350
-
See the note in "`<<amqp-inbound-channel-adapter>>`" about configuring the `listener-container` attribute.
350
+
See the note in <<amqp-inbound-channel-adapter>> about configuring the `listener-container` attribute.
351
351
352
352
==== Configuring with Java Configuration
353
353
@@ -974,7 +974,7 @@ When `true` (the default), the connection is established (if it does not already
974
974
it) when the first message is sent.
975
975
====
976
976
977
-
See also "`<<async-service-activator>>`" for more information.
977
+
See also <<async-service-activator>> for more information.
978
978
979
979
[IMPORTANT]
980
980
.RabbitTemplate
@@ -1194,7 +1194,7 @@ The entire message was converted (serialized) and sent to RabbitMQ.
1194
1194
Now, you can set the `extract-payload` attribute (or `setExtractPayload()` when using Java configuration) to `true`.
1195
1195
When this flag is `true`, the message payload is converted and the headers are mapped, in a manner similar to when you use channel adapters.
1196
1196
This arrangement lets AMQP-backed channels be used with non-serializable payloads (perhaps with another message converter, such as the `Jackson2JsonMessageConverter`).
1197
-
See "`<<amqp-message-headers>>`" for more about the default mapped headers.
1197
+
See <<amqp-message-headers>> for more about the default mapped headers.
1198
1198
You can modify the mapping by providing custom mappers that use the `outbound-header-mapper` and `inbound-header-mapper` attributes.
1199
1199
You can now also specify a `default-delivery-mode`, which is used to set the delivery mode when there is no `amqp_deliveryMode` header.
1200
1200
By default, Spring AMQP `MessageProperties` uses `PERSISTENT` delivery mode.
@@ -1314,7 +1314,7 @@ The `org.springframework.amqp.support.AmqpHeaders` class identifies the default
1314
1314
* `amqp_clusterId`
1315
1315
* `amqp_contentEncoding`
1316
1316
* `amqp_contentLength`
1317
-
* `content-type` (see "`<<amqp-content-type>>`")
1317
+
* `content-type` (see <<amqp-content-type>>)
1318
1318
* `amqp_correlationId`
1319
1319
* `amqp_delay`
1320
1320
* `amqp_deliveryMode`
@@ -1418,7 +1418,7 @@ This is because the template "`borrows`" a channel from the cache for each send
1418
1418
One solution is to start a transaction before the splitter, but transactions are expensive in RabbitMQ and can reduce performance several hundred fold.
1419
1419
1420
1420
To solve this problem in a more efficient manner, starting with version 5.1, Spring Integration provides the `BoundRabbitChannelAdvice` which is a `HandleMessageAdvice`.
1421
-
See "`<<handle-message-advice>>`".
1421
+
See <<handle-message-advice>>.
1422
1422
When applied before the splitter, it ensures that all downstream operations are performed on the same channel and, optionally, can wait until publisher confirmations for all sent messages are received (if the connection factory is configured for confirmations).
1423
1423
The following example shows how to use `BoundRabbitChannelAdvice`:
0 commit comments