JIRA: https://jira.spring.io/browse/INT-3473
A simple fix to prevent `Selector closed` error loging message on `TcpNioServerConnectionFactory#stop()`
Polishing
JIRA: https://jira.spring.io/browse/INT-3470
* Apply the last `ChannelInterceptor` changes - just `extends ChannelInterceptorAdapter`
* Change some tests to check content according to the new changes to the `GenericMessage#toString()`
**Cherry-pick to 4.0.x**
JIRA: https://jira.spring.io/browse/INT-3469
Previously, the callback was set immediately after
subscribing which caused a small possibility of
message loss.
Set the callback before subscribing.
JIRA: https://jira.spring.io/browse/INT-3448
INT-3448: Addressing PR comments
Late Resolution of @Publisher.defaultChannel
Early resolution of the publisher default channel caused
`@ Configuration` factory beans to be instantiated before
Spring Integration bean post processors had been registered.
Use the channel name instead of channel reference and resolve
it when processing the first publish.
Merge branch 'INT-3448' of https://github.com/garyrussell/spring-integration into INT-3448
Conflicts:
spring-integration-core/src/test/java/org/springframework/integration/configuration/EnableIntegrationTests.java
INT-3448: Polishing
JIRA: https://jira.spring.io/browse/INT-3461
To test it: `gradlew :spring-integration-http:testAll -PspringVersion=4.1.0.BUILD-SNAPSHOT`
INT-3461: Add CP condition for `rometools` into the `HttpRequestHandlingEndpointSupport`
INT-3461: Add CLASSPATH check for `RequestEntity` to determine the SF 4.1
Conflicts:
build.gradle
Resolved.
JIRA: https://jira.spring.io/browse/INT-3458
* Change Spring AMQP to `1.3.5.RELEASE`
* `HttpRequestHandlingEndpointSupport`: remove `MappingJacksonHttpMessageConverter` registration
* `IntegrationRequestMappingHandlerMapping`: add 'fake' `name()` attribute to the inline `RequestMapping` annotation
* `StoredProcJmxManagedBeanTests`: remove `context.stop();` code, Since `MBeanExporter` deregister MBeans on `stop()` now
* `StoredProcPollingChannelAdapterParserTests`: change deprecated `ParameterizedSingleColumnRowMapper` to the `SingleColumnRowMapper`
* `Jms`: comment out the reflection code to check the value for the `recoveryInterval`, because it is removed already in favor of `backOff`
* `NotificationListeningMessageProducer`: move the start-up listener registration to the `onApplicationEvent`,
because `MBeanExporter` moved `registerBeans()` to the `start()` now.
The same `phase` might cause the issue, that MBeans aren't registered yet for `NotificationListeningMessageProducer`
* `JpaOutboundGatewayTests`: change `@TransactionConfiguration` to the `@Transactional`. Don't know why the first doesn't work now.
**Cherry-pick to 4.0.x**
INT-3458: Addressing PR comments
`NotificationListeningMessageProducer`: defer listener registration until `onApplicationEvent()`
Conflicts:
build.gradle
Resolved.
Fixed hung assembler described in INT-3453.
Used CountDownLatch instead of sleep()
INT-3453 Add Test Case
Currently failing for me - assembler thread stuck on CDL.
Remove redundant `if (TcpNioConnection.this.writingLatch != null)` from `ChannelInputStream#write`
JIRA: https://jira.spring.io/browse/INT-3433`
If a read fails due to insufficient threads, delay the read
for (default 100ms) - do not re-enable OP_READ until that
time has elapsed. Avoids spinning the CPU.
INT-3433 More Polishing
If the assembler couldn't execute a new assembler after assembling
the current message (when it detected there is more data), in the
finally block it would "continue" only if the socket was still
open.
The test case closes the socket after sending 4 messages so when
this condition occurred, the assembler failed to continue and
data was left in the buffer.
Remove the `isOpen()` check in the finally block and always continue
if there's not another assembler running and there's data available.
INT-3433 More Polishing
We can still get starvation if the selector is in a long
wait (in select()) when a read is delayed.
Whenever a read is delayed, wake the selector so its next
select will use the readDelay timeout.
INT-3433 Reference Docs
Also remove Thread.yield().
Revert redundant boolean return from `TcpNioConnection#checkForAssembler()`
JIRA: https://jira.spring.io/browse/INT-3442
Previously `RedisQueueMessageDrivenEndpoint.stop()` returned immediately.
It caused an issue when one more `message` might be read and processed to stopped app.
* Introduce `AbstractEndpoint#lifecycleCondition` and wait on it from `RedisQueueMessageDrivenEndpoint.doStop()`
and `signal()` it from `ListenerTask`.
* Since everything is done around `lifecycleLock` the `RedisQueueMessageDrivenEndpoint.stop()` waits for the proper
'last' message process.
* Add tiny `Thread.sleep(1)` to the `popMessageAndSend` cycle to free `lifecycleLock` for other Threads, e.g. `stop()`
INT-3442: Get rid of `lock` from listener cycle
* Introduce `stopTimeout` to minimize the `stop` thread blocking
* If the message is returned after that timeout it moved back to Redis List using `RPUSH`
INT-3442: Addressing PR comments
JIRA: https://jira.spring.io/browse/INT-3423
Consider a message containing "one one" and a splitter
with expression "payload.split(' ')", only one message
is emitted.
The default Collection created by SpEL is a HashSet.
Change the ExpressionEvaluatingSplitter to expect a
List instead of a Collection.
JIRA: https://jira.spring.io/browse/INT-3403
* Upgrade to Gradle 1.12
* Make `schemaZip` Windows compatible
INT-3403: Fix the `replaceAll` logic
INT-3403: Apply SS & SWS releases
JIRA: https://jira.spring.io/browse/INT-3413
Add MessageGroupExpiredEvent with group metadata
such as message count, last modified, whether
the group was discarded or not.
Conflicts:
spring-integration-core/src/test/java/org/springframework/integration/aggregator/AggregatorTests.java
Polishing
JIRA: https://jira.spring.io/browse/INT-3386
Eliminate unnecessary group copy during retrieval in the
aggregator. This is expensive with large groups.
Ensure that the reaper uses a snapshot of the group at the
time it is considered for reaping.
AggregatorTests.testAggPerf() - before:
AggregatorTests [main] : Sent 0 in 0.0 (10k in 0ms)
AggregatorTests [main] : Sent 10000 in 4.872 (10k in 4872ms)
AggregatorTests [main] : Sent 20000 in 16.86 (10k in 11988ms)
AggregatorTests [main] : Sent 30000 in 36.809 (10k in 19949ms)
AggregatorTests [main] : Sent 40000 in 65.045 (10k in 28236ms)
AggregatorTests [main] : Sent 50000 in 100.329 (10k in 35284ms)
AggregatorTests [main] : Received 60000
AggregatorTests [main] : Sent 60000 in 143.106 (10k in 42777ms)
AggregatorTests [main] : Sent 70000 in 147.027 (10k in 3921ms)
AggregatorTests [main] : Sent 80000 in 158.664 (10k in 11637ms)
AggregatorTests [main] : Sent 90000 in 177.956 (10k in 19292ms)
AggregatorTests [main] : Sent 100000 in 205.045 (10k in 27089ms)
AggregatorTests [main] : Sent 110000 in 240.005 (10k in 34960ms)
AggregatorTests [main] : Received 60000
AggregatorTests [main] : Sent 120000 in 282.566 (10k in 42561ms)
After:
AggregatorTests [main] : Sent 0 in 0.0 (10k in 0ms)
AggregatorTests [main] : Sent 10000 in 0.612 (10k in 612ms)
AggregatorTests [main] : Sent 20000 in 0.925 (10k in 313ms)
AggregatorTests [main] : Sent 30000 in 1.131 (10k in 206ms)
AggregatorTests [main] : Sent 40000 in 1.288 (10k in 157ms)
AggregatorTests [main] : Sent 50000 in 1.361 (10k in 73ms)
AggregatorTests [main] : Received 60000
AggregatorTests [main] : Sent 60000 in 1.522 (10k in 161ms)
AggregatorTests [main] : Sent 70000 in 1.619 (10k in 97ms)
AggregatorTests [main] : Sent 80000 in 1.696 (10k in 77ms)
AggregatorTests [main] : Sent 90000 in 1.75 (10k in 54ms)
AggregatorTests [main] : Sent 100000 in 1.81 (10k in 60ms)
AggregatorTests [main] : Sent 110000 in 1.851 (10k in 41ms)
AggregatorTests [main] : Received 60000
AggregatorTests [main] : Sent 120000 in 1.918 (10k in 67ms)
JIRA: https://jira.spring.io/browse/INT-3408
* Add `TransactionSynchronizationFactoryBean`
* Introduce `IntegrationResourceHolderSynchronization`
to get deal with `IntegrationResourceHolder` for custom `TransactionSynchronization`
* Encapsulate `IntegrationResourceHolder` in the `DefaultTransactionSynchronizationFactory`
* Get deal with `IntegrationResourceHolder` and bind it to the `TransactionSynchronizationManager`
only if `TransactionSynchronization` from `transactionSynchronizationFactory`
is `synchronization instanceof IntegrationResourceHolderSynchronization`
INT-3408: Encapsulate binding in the `DefTxSyncF`
JIRA: https://jira.spring.io/browse/INT-3410
When running a fixed thread pool with a bound queue,
and CALLER_RUNS execution rejection policy, it
was possible to deadlock the IO selector thread.
Add a `CompositeExecutor` to use different threads for
IO to those used for message assembly.
Add a `CallerBlocksPolicy` to block the invoking thread
(for a specified time) if the pool is exhausted.
Add documentation.
Polishing
INT-3396: Polishing
JIRA: https://jira.spring.io/browse/INT-3396
Updates for latest snapshots of the Spring IO plugin
Update the configuration to use the renamed plugin. Add a dependency in
the springIoVersions configuration that points to the versions published
by Spring IO.
Upgrade to 0.0.3.RELEASE
Upgrade the plugin version to 0.0.3.RELEASE. Only apply the plugin if
the platformVersion property has been set.
Polishing following upgrade to 0.0.3.RELEASE
- Remove reference to snapshot plugins repository
- Remove unnessary use of the springIoVersions configuration
Improve configuration of snapshot repository
Upgrade to latest SD to be consistent with IO
Reference docs in preface mention Spring Integration compatibility with
Java 8, once it's released. Since Java 8 is released, the extra note is
no longer relevant and should be removed.
This patch removes no longer relevant note of pending Java 8 release.
JIRA: https://jira.spring.io/browse/INT-3400
JIRA: https://jira.spring.io/browse/INT-3381
* Add support to mark `@Bean` methods with `Messaging Annotations`
* Addition attributes for `Messaging Annotations`
* Some refactoring and fixing
* Fix `AbstractMappingMessageRouter#onInit()` propagation
* Fix `GemfireGroupStoreTests` (https://build.spring.io/browse/INT-MASTERSPRING40-JOB1-246/test/case/135235772)
There is still some side effect: we need define `MessageChannel` beans explicitly. Since methods are processed within `BPP`,
not all beans with `Messaging Annotations` might be processed.
INT-3381: PR comments and other fixes
INT-3381 Polishing
INT-3381: Revert `RouterFB` & `SplitterFB`
JIRA: https://jira.spring.io/browse/INT-1956
Emit an application event when a decoding exception
occurs, allowing the user to examine the buffer
at the time the exception occurred.
INT-1956: Polishing
Polishing
Use `OP_READ` instead of `readyOps()` when removing interest.
Polishing - Fix ConnectionTimeoutTests
Test publisher was casting all events to TcpConnectionEvent.