Upgrades and doc fixes

* Upgrade to Gradle 5.2.1, SonarQube 2.7, asciidoctor 1.5.10,
Apache Sshd 2.2.0, AsertJ 3.12.0, Curator Framework 4.1.0, room Tool 1.12.0,
Checkstyle 8.17
* remove Eclipse Link support in JPA tests since it is not compatible
with Java 11
* Move 5.1 changes to the `changes-5.0-5.1.adoc`; start new "What's New"
This commit is contained in:
Artem Bilan
2019-02-15 15:54:18 -05:00
parent 520ebbbd2c
commit 9e238f5d69
14 changed files with 350 additions and 540 deletions

View File

@@ -11,8 +11,8 @@ buildscript {
}
plugins {
id 'org.sonarqube' version '2.6.2'
id 'org.asciidoctor.convert' version '1.5.9.2'
id 'org.sonarqube' version '2.7'
id 'org.asciidoctor.convert' version '1.5.10'
id 'org.ajoberstar.grgit' version '3.0.0'
}
@@ -88,17 +88,16 @@ subprojects { subproject ->
ext {
activeMqVersion = '5.15.8'
apacheSshdVersion = '2.1.0'
apacheSshdVersion = '2.2.0'
aspectjVersion = '1.9.2'
assertjVersion = '3.11.1'
assertjVersion = '3.12.0'
assertkVersion = '0.13'
boonVersion = '0.34'
commonsDbcp2Version = '2.5.0'
commonsIoVersion = '2.6'
commonsNetVersion = '3.6'
curatorVersion = '4.0.1'
curatorVersion = '4.1.0'
derbyVersion = '10.14.2.0'
eclipseLinkVersion = '2.7.3'
ftpServerVersion = '1.1.1'
googleJsr305Version = '3.0.2'
groovyVersion = '2.5.6'
@@ -131,7 +130,7 @@ subprojects { subproject ->
postgresVersion = '42.2.5'
reactorNettyVersion = '0.8.5.RELEASE'
reactorVersion = '3.2.6.RELEASE'
romeToolsVersion = '1.9.0'
romeToolsVersion = '1.12.0'
servletApiVersion = '4.0.1'
smackVersion = '4.3.1'
springAmqpVersion = project.hasProperty('springAmqpVersion') ? project.springAmqpVersion : '2.2.0.BUILD-SNAPSHOT'
@@ -295,7 +294,7 @@ subprojects { subproject ->
checkstyle {
configFile = file("$rootDir/src/checkstyle/checkstyle.xml")
toolVersion = "8.9"
toolVersion = "8.17"
}
artifacts {
@@ -535,16 +534,7 @@ project('spring-integration-jpa') {
testCompile "org.hibernate:hibernate-entitymanager:$hibernateVersion"
testRuntime "org.hibernate.javax.persistence:hibernate-jpa-2.1-api:$jpa21ApiVersion"
testRuntime "org.eclipse.persistence:org.eclipse.persistence.jpa:$eclipseLinkVersion"
testRuntime "org.springframework:spring-instrument:$springVersion"
}
tasks.withType(Test).matching {it.name ==~ /(test)|(testAll)/}.all {
jvmArgs classpath.files.findAll {
it.name ==~ /(spring-instrument.+)/}.collect{"-javaagent:$it"
}
}
}
project('spring-integration-mail') {

Binary file not shown.

View File

@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-5.2.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

2
gradlew vendored
View File

@@ -28,7 +28,7 @@ APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
DEFAULT_JVM_OPTS='"-Xmx64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"

168
gradlew.bat vendored
View File

@@ -1,84 +1,84 @@
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource="classpath:/commonJpa-context.xml" />
<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect"/>
<bean id="vendorAdaptor" class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter"
parent="abstractVendorAdaptor">
<property name="database" value="H2" />
</bean>
</beans>

View File

@@ -1,182 +0,0 @@
/*
* Copyright 2002-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.integration.jpa.core;
import static org.junit.Assert.fail;
import java.text.ParseException;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* Tests the functionality of {@link JpaOperations} and {@link DefaultJpaOperations}
* using the EclipseLink persistence provider.
*
* If you want to run these tests from your IDE, please ensure that you execute
* the tests using a <i>javaagent</i>:
*
* <pre>
* {@code
* -javaagent:/home/<user>/.m2/repository/org/springframework/spring-instrument/3.1.1.RELEASE/spring-instrument-3.1.1
* .RELEASE.jar
* }
* </pre>
*
* @author Gunnar Hillert
* @author Artem Bilan
*
* @since 2.2
*
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class EclipseLinkJpaOperationsTests extends AbstractJpaOperationsTests {
@Test
@Override
public void testExecuteUpdateWithNativeQuery() {
try {
super.testExecuteUpdateWithNativeQuery();
}
catch (Exception e) {
return;
}
fail("Was expecting an Exception as OpenJPA does not support Native SQL Queries with Named Parameters.");
}
@Test
@Override
public void testExecuteUpdateWithNativeNamedQuery() {
try {
super.testExecuteUpdateWithNativeNamedQuery();
}
catch (Exception e) {
return;
}
fail("Was expecting an Exception as OpenJPA does not support Native SQL Queries with Named Parameters.");
}
@Test
@Override
public void testExecuteUpdate() {
super.testExecuteUpdate();
}
@Test
@Override
public void testExecuteUpdateWithNamedQuery() {
super.testExecuteUpdateWithNamedQuery();
}
@Test
@Override
public void testExecuteSelectWithNativeQueryReturningEntityClass()
throws ParseException {
super.testExecuteSelectWithNativeQueryReturningEntityClass();
}
@Test
@Override
public void testExecuteSelectWithNativeQuery() throws ParseException {
super.testExecuteSelectWithNativeQuery();
}
@Test
@Override
public void testMerge() {
super.testMerge();
}
@Test
@Override
public void testMergeCollection() {
super.testMergeCollection();
}
@Test
@Override
public void testMergeNullCollection() {
super.testMergeNullCollection();
}
@Test
@Override
public void testMergeCollectionWithNullElement() {
super.testMergeCollectionWithNullElement();
}
@Test
@Override
public void testPersist() {
super.testPersist();
}
@Test
@Override
public void testPersistCollection() {
super.testPersistCollection();
}
@Test
@Override
public void testPersistNullCollection() {
super.testPersistNullCollection();
}
@Test
@Override
public void testPersistCollectionWithNullElement() {
super.testPersistCollectionWithNullElement();
}
@Test
@Override
public void testGetAllStudents() {
super.testGetAllStudents();
}
@Test
@Override
public void testGetAllStudentsWithMaxResults() {
super.testGetAllStudentsWithMaxResults();
}
@Test
@Override
public void testDeleteInBatch() {
super.testDeleteInBatch();
}
@Test
@Override
public void testDelete() {
super.testDelete();
}
@Test
@Override
public void testDeleteInBatchWithEmptyCollection() {
super.testDeleteInBatchWithEmptyCollection();
}
}

View File

@@ -0,0 +1,240 @@
[[migration-5.0-5.1]]
=== Changes between 5.1 and 5.1
[[x5.1-new-components]]
=== New Components
The following components are new in 5.1:
* <<x5.1-AmqpDedicatedChannelAdvice>>
[[x5.1-AmqpDedicatedChannelAdvice]]
==== `AmqpDedicatedChannelAdvice`
See <<amqp-strict-ordering>>.
[[x5.1-Functions]]
==== Improved Function Support
The `java.util.function` interfaces now have improved integration support in the Framework components.
Also Kotlin lambdas now can be used for handler and source methods.
See <<functions-support>>.
[[x5.1-LongRunningTest]]
==== `@LongRunningTest`
A JUnit 5 `@LongRunningTest` conditional annotation is provided to check the environment or system properties for the `RUN_LONG_INTEGRATION_TESTS` entry with the value of `true` to determine if test should be run or skipped.
See <<test-junit-rules>>.
[[x5.1-general]]
=== General Changes
The following changes have been made in version 5.1:
* <<x5.1-java-dsl>>
* <<x5.1-dispatcher-exceptions>>
* <<x5.1-global-channel-interceptors>>
* <<x5.1-object-to-json-transformer>>
* <<x5.1-integration-flows-generated-bean-names>>
* <<x5.1-aggregator>>
* <<x5.1-publisher>>
* <<x51.-integration-graph>>
* <<x51.-global-properties>>
* <<x51.-poller-annotation>>
[[x5.1-java-dsl]]
==== Java DSL
The `IntegrationFlowContext` is now an interface and `IntegrationFlowRegistration` is an inner interface of `IntegrationFlowContext`.
A new `logAndReply()` operator has been introduced for convenience when you wish to log at the end of a flow for request-reply configurations.
This avoid confusion with `log()` which is treated as a one-way end flow component.
A generated bean name for any `NamedComponent` within an integration flow is now based on the component type for better readability from visual tools, logs analyzers and metrics collectors.
The `GenericHandler.handle()` now excepts a `MessageHeaders` type for the second argument.
[[x5.1-dispatcher-exceptions]]
==== Dispatcher Exceptions
Exceptions caught and re-thrown by `AbstractDispatcher` are now more consistent:
* A `MessagingException` of any kind that has a `failedMessage` property is re-thrown unchanged.
* All other exceptions are wrapped in a `MessageDeliveryException` with the `failedMessage` property set.
Previously:
* A `MessagingException` of any kind that has a `failedMessage` property was re-thrown unchanged
* A `MessagingException` that had no `failedMessage` property was wrapped in a `MessagingException` with the `failedMessage` property set.
* Other `RuntimeException` instances were re-thrown unchanged.
* Checked exceptions were wrapped in a `MessageDeliveryException` with the `failedMessage` property set.
[[x5.1-global-channel-interceptors]]
==== Global Channel Interceptors
Global channel interceptors now apply to dynamically registered channels, such as through the `IntegrationFlowContext` when using the Java DSL or beans that are initialized using `beanFactory.initializeBean()`.
Previously, when beans were created after the application context was refreshed, interceptors were not applied.
[[x5.1-channel-interceptors]]
==== Channel Interceptors
`ChannelInterceptor.postReceive()` is no longer called when no message is received; it is no longer necessary to check for a `null` `Message<?>`.
Previously, the method was called.
If you have an interceptor that relies on the previous behavior, implement `afterReceiveCompleted()` instead, since that method is invoked, regardless of whether a message is received or not.
Furthermore, the `PolledAmqpChannel` and `PolledJmsChannel` previously did not invoke `afterReceiveCompleted()` with `null`; they now do.
[[x5.1-object-to-json-transformer]]
==== `ObjectToJsonTransformer`
A new `ResultType.BYTES` mode is introduced for the `ObjectToJsonTransformer`.
See <<json-transformers>> for more information.
[[x5.1-integration-flows-generated-bean-names]]
==== Integration Flows: Generated Bean Names
Starting with version 5.0.5, generated bean names for the components in an `IntegrationFlow` include the flow bean name, followed by a dot, as a prefix.
For example, if a flow bean were named `flowBean`, a generated bean might be named `flowBean.generatedBean`.
See <<java-dsl-flows>> for more information.
[[x5.1-aggregator]]
==== Aggregator Changes
If the `groupTimeout` is evaluated to a negative value, an aggregator now expires the group immediately.
Only `null` is considered as a signal to do nothing for the current message.
A new `popSequence` property has been introduced to allow (by default) to call a `MessageBuilder.popSequenceDetails()` for the output message.
Also an `AbstractAggregatingMessageGroupProcessor` returns now an `AbstractIntegrationMessageBuilder` instead of the whole `Message` for optimization.
See <<aggregator>> for more information.
[[x5.1-publisher]]
==== @Publisher annotation changes
Starting with version 5.1, you must explicitly turn on the `@Publisher` AOP functionality by using `@EnablePublisher` or by using the `<int:enable-publisher>` child element on `<int:annotation-config>`.
Also the `proxy-target-class` and `order` attributes have been added for tuning the `ProxyFactory` configuration.
See <<publisher-annotation>> for more information.
[[x5.1-files]]
=== Files Changes
If you are using `FileExistsMode.APPEND` or `FileExistsMode.APPEND_NO_FLUSH` you can provide a `newFileCallback` that will be called when creating a new file.
This callback receives the newly created file and the message that triggered the callback.
This could be used to write a CSV header, for an example.
The `FileReadingMessageSource` now doesn't check and create a directory until its `start()` is called.
So, if an Inbound Channel Adapter for the `FileReadingMessageSource` has `autoStartup = false`, there are no failures against the file system during application start up.
See <<files>> for more information.
[[x5.1-amqp]]
=== AMQP Changes
We have made `ID` and `Timestamp` header mapping changes in the `DefaultAmqpHeaderMapper`.
See the note near the bottom of <<amqp-message-headers>> for more information.
The `contentType` header is now correctly mapped as an entry in the general headers map.
See <<amqp-content-type>> for more information.
Starting with version 5.1.3, if a message conversion exception occurs when using manual acknowledgments, and an error channel is defined, the payload is a `ManualAckListenerExecutionFailedException` with additional `channel` and `deliveryTag` properties.
This enables the error flow to ack/nack the original message.
See <<amqp-conversion-inbound>> for more information.
[[x5.1-jdbc]]
=== JDBC Changes
A confusing `max-rows-per-poll` property on the JDBC Inbound Channel Adapter and JDBC Outbound Gateway has been deprecated in favor of the newly introduced `max-rows` property.
The `JdbcMessageHandler` supports now a `batchUpdate` functionality when the payload of the request message is an instance of an `Iterable` type.
The indexes for the `INT_CHANNEL_MESSAGE` table (for the `JdbcChannelMessageStore`) have been optimized.
If you have large message groups in such a store, you may wish to alter the indexes.
See <<jdbc>> for more information.
[[x5.1-ftp-sftp]]
=== FTP and SFTP Changes
A `RotatingServerAdvice` is now available to poll multiple servers and directories with the inbound channel adapters.
See <<ftp-rotating-server-advice>> and <<sftp-rotating-server-advice>> for more information.
Also, inbound adapter `localFilenameExpression` instances can contain the `#remoteDirectory` variable, which contains the remote directory being polled.
The generic type of the comparators (used to sort the fetched file list for the streaming adapters) has changed from `Comparator<AbstractFileInfo<F>>` to `Comparator<F>`.
See <<ftp-streaming>> and <<sftp-streaming>> for more information.
In addition, the synchronizers for inbound channel adapters can now be provided with a `Comparator`.
This is useful when using `maxFetchSize` to limit the files retrieved.
The `CachingSessionFactory` has a new property `testSession` which, when true, causes the factory to perform a `test()` operation on the `Session` when checking out an existing session from the cache.
See <<sftp-session-caching>> and <<ftp-session-caching>> for more information.
The outbound gateway MPUT command now supports a message payload with a collection of files or strings.
See <<sftp-outbound-gateway>> and <<ftp-outbound-gateway>> for more information.
[[x51.-tcp]]
=== TCP Support
When using SSL, host verification is now enabled, by default, to prevent man-in-the-middle attacks with a trusted certificate.
See <<tcp-ssl-host-verification>> for more information.
In addition the key and trust store types can now be configured on the `DefaultTcpSSLContextSupport`.
[[x5.1-twitter]]
=== Twitter Support
Since the Spring Social project has moved to https://spring.io/blog/2018/07/03/spring-social-end-of-life-announcement[end of life status], Twitter support in Spring Integration has been moved to the Extensions project.
See https://github.com/spring-projects/spring-integration-extensions/tree/master/spring-integration-social-twitter[Spring Integration Social Twitter] for more information.
[[x51.-jms]]
=== JMS Support
The `JmsSendingMessageHandler` now provides `deliveryModeExpression` and `timeToLiveExpression` options to determine respective QoS options for JMS message to send at runtime.
The `DefaultJmsHeaderMapper` now allows to map inbound `JMSDeliveryMode` and `JMSExpiration` properties via setting to `true` respective `setMapInboundDeliveryMode()` and `setMapInboundExpiration()` options.
When a `JmsMessageDrivenEndpoint` or `JmsInboundGateway` is stopped, the associated listener container is now shut down; this closes its shared connection and any consumers.
You can configure the endpoints to revert to the previous behavior.
See <<jms>> for more information.
[[x51.-http]]
=== HTTP/WebFlux Support
The `statusCodeExpression` (and `Function`) is now supplied with the `RequestEntity<?>` as a root object for evaluation context, so request headers, method, URI and body are available for target status code calculation.
See <<http>> and <<webflux>> for more information.
[[x51.-jmx]]
=== JMX Changes
Object name key values are now quoted if they contain any characters other than those allowed in a Java identifier (or period `.`).
For example `org.springframework.integration:type=MessageChannel,` `name="input:foo.myGroup.errors"`.
This has the side effect that previously "allowed" names, with such characters, will now be quoted.
For example `org.springframework.integration:type=MessageChannel,` `name="input#foo.myGroup.errors"`.
[[x51.-micrometer]]
=== Micrometer Support Changes
It is now simpler to customize the standard Micrometer meters created by the framework.
See <<micrometer-integration>> for more information.
[[x51.-integration-graph]]
=== Integration Graph Customization
It is now possible to add additional properties to the `IntegrationNode` s via `Function<NamedComponent, Map<String, Object>> additionalPropertiesCallback` on the `IntegrationGraphServer`.
See <<integration-graph>> for more information.
[[x51.-global-properties]]
=== Integration Global Properties
The Integration global properties (including defaults) can now be printed in the logs, when a `DEBUG` logic level is turned on for the `org.springframework.integration` category.
See <<global-properties>> for more information.
[[x51.-poller-annotation]]
=== The `receiveTimeout` for `@Poller`
The `@Poller` annotation now provides a `receiveTimeout` option for convenience.
See <<configuration-using-poller-annotation>> for more information.

View File

@@ -0,0 +1,5 @@
<style>
#header #revnumber {
display: none
}
</style>

View File

@@ -2,6 +2,8 @@
== Change History
// BE SURE TO PRECEDE ALL include:: with a blank line - see https://github.com/asciidoctor/asciidoctor/issues/1297
include::./changes-5.0-5.1.adoc[]
include::./changes-4.3-5.0.adoc[]
include::./changes-4.2-4.3.adoc[]

View File

@@ -7,7 +7,9 @@
:hide-uri-scheme:
Mark Fisher; Marius Bogoevici; Iwein Fuld; Jonas Partner; Oleg Zhurakousky; Gary Russell; Dave Syer; Josh Long; David Turanski; Gunnar Hillert; Artem Bilan; Amol Nayak; Jay Bryant
ifdef::backend-html5[]
*{project-version}*
endif::[]
(C) 2009 - 2019 Pivotal Software, Inc.
All rights reserved.
@@ -20,7 +22,7 @@ include::./preface.adoc[]
= What's New?
[[spring-integration-intro-new]]
For those who are already familiar with Spring Integration, this chapter provides a brief overview of the new features of version 5.1.
For those who are already familiar with Spring Integration, this chapter provides a brief overview of the new features of version 5.2.
If you are interested in the changes and features that were introduced in earlier versions, see the <<history>>.

View File

@@ -432,7 +432,7 @@ The `@IntegrationConverter` annotation marks `Converter`, `GenericConverter`, or
This annotation is an analogue of the `<int:converter>` XML element (see <<payload-type-conversion>>).
You can place `@IntegrationConverter` annotations at the class level (with a `@Component` stereotype annotation) or on `@Bean` methods within `@Configuration` classes.
See <<annotations>> for more information about messaging mnnotations.
See <<annotations>> for more information about messaging annotations.
[[programming-considerations]]
=== Programming Considerations

View File

@@ -15,13 +15,13 @@ This section details the compatible http://www.oracle.com/technetwork/java/javas
[[supported-java-versions]]
=== Compatible Java Versions
For Spring Integration 5.1.x, the minimum compatible Java version is Java SE 8.
For Spring Integration 5.2.x, the minimum compatible Java version is Java SE 8.
Older versions of Java are not supported.
[[supported-spring-versions]]
=== Compatible Versions of the Spring Framework
Spring Integration 5.1.x requires Spring Framework 5.1 or later.
Spring Integration 5.2.x requires Spring Framework 5.2 or later.
[[code-conventions]]
== Code Conventions

View File

@@ -1,245 +1,13 @@
[[whats-new]]
== What's New in Spring Integration 5.1?
== What's New in Spring Integration 5.2?
This chapter provides an overview of the new features and improvements that have been introduced with Spring
Integration `5.1`.
If you are interested in more details, see the Issue Tracker tickets that were resolved as part of the 5.1 development process.
If you are interested in more details, see the Issue Tracker tickets that were resolved as part of the 5.2 development process.
[[x5.1-new-components]]
[[x5.2-new-components]]
=== New Components
The following components are new in 5.1:
* <<x5.1-AmqpDedicatedChannelAdvice>>
[[x5.1-AmqpDedicatedChannelAdvice]]
==== `AmqpDedicatedChannelAdvice`
See <<amqp-strict-ordering>>.
[[x5.1-Functions]]
==== Improved Function Support
The `java.util.function` interfaces now have improved integration support in the Framework components.
Also Kotlin lambdas now can be used for handler and source methods.
See <<functions-support>>.
[[x5.1-LongRunningTest]]
==== `@LongRunningTest`
A JUnit 5 `@LongRunningTest` conditional annotation is provided to check the environment or system properties for the `RUN_LONG_INTEGRATION_TESTS` entry with the value of `true` to determine if test should be run or skipped.
See <<test-junit-rules>>.
[[x5.1-general]]
[[x5.2-general]]
=== General Changes
The following changes have been made in version 5.1:
* <<x5.1-java-dsl>>
* <<x5.1-dispatcher-exceptions>>
* <<x5.1-global-channel-interceptors>>
* <<x5.1-object-to-json-transformer>>
* <<x5.1-integration-flows-generated-bean-names>>
* <<x5.1-aggregator>>
* <<x5.1-publisher>>
* <<x51.-integration-graph>>
* <<x51.-global-properties>>
* <<x51.-poller-annotation>>
[[x5.1-java-dsl]]
==== Java DSL
The `IntegrationFlowContext` is now an interface and `IntegrationFlowRegistration` is an inner interface of `IntegrationFlowContext`.
A new `logAndReply()` operator has been introduced for convenience when you wish to log at the end of a flow for request-reply configurations.
This avoid confusion with `log()` which is treated as a one-way end flow component.
A generated bean name for any `NamedComponent` within an integration flow is now based on the component type for better readability from visual tools, logs analyzers and metrics collectors.
The `GenericHandler.handle()` now excepts a `MessageHeaders` type for the second argument.
[[x5.1-dispatcher-exceptions]]
==== Dispatcher Exceptions
Exceptions caught and re-thrown by `AbstractDispatcher` are now more consistent:
* A `MessagingException` of any kind that has a `failedMessage` property is re-thrown unchanged.
* All other exceptions are wrapped in a `MessageDeliveryException` with the `failedMessage` property set.
Previously:
* A `MessagingException` of any kind that has a `failedMessage` property was re-thrown unchanged
* A `MessagingException` that had no `failedMessage` property was wrapped in a `MessagingException` with the `failedMessage` property set.
* Other `RuntimeException` instances were re-thrown unchanged.
* Checked exceptions were wrapped in a `MessageDeliveryException` with the `failedMessage` property set.
[[x5.1-global-channel-interceptors]]
==== Global Channel Interceptors
Global channel interceptors now apply to dynamically registered channels, such as through the `IntegrationFlowContext` when using the Java DSL or beans that are initialized using `beanFactory.initializeBean()`.
Previously, when beans were created after the application context was refreshed, interceptors were not applied.
[[x5.1-channel-interceptors]]
==== Channel Interceptors
`ChannelInterceptor.postReceive()` is no longer called when no message is received; it is no longer necessary to check for a `null` `Message<?>`.
Previously, the method was called.
If you have an interceptor that relies on the previous behavior, implement `afterReceiveCompleted()` instead, since that method is invoked, regardless of whether a message is received or not.
Furthermore, the `PolledAmqpChannel` and `PolledJmsChannel` previously did not invoke `afterReceiveCompleted()` with `null`; they now do.
[[x5.1-object-to-json-transformer]]
==== `ObjectToJsonTransformer`
A new `ResultType.BYTES` mode is introduced for the `ObjectToJsonTransformer`.
See <<json-transformers>> for more information.
[[x5.1-integration-flows-generated-bean-names]]
==== Integration Flows: Generated Bean Names
Starting with version 5.0.5, generated bean names for the components in an `IntegrationFlow` include the flow bean name, followed by a dot, as a prefix.
For example, if a flow bean were named `flowBean`, a generated bean might be named `flowBean.generatedBean`.
See <<java-dsl-flows>> for more information.
[[x5.1-aggregator]]
==== Aggregator Changes
If the `groupTimeout` is evaluated to a negative value, an aggregator now expires the group immediately.
Only `null` is considered as a signal to do nothing for the current message.
A new `popSequence` property has been introduced to allow (by default) to call a `MessageBuilder.popSequenceDetails()` for the output message.
Also an `AbstractAggregatingMessageGroupProcessor` returns now an `AbstractIntegrationMessageBuilder` instead of the whole `Message` for optimization.
See <<aggregator>> for more information.
[[x5.1-publisher]]
==== @Publisher annotation changes
Starting with version 5.1, you must explicitly turn on the `@Publisher` AOP functionality by using `@EnablePublisher` or by using the `<int:enable-publisher>` child element on `<int:annotation-config>`.
Also the `proxy-target-class` and `order` attributes have been added for tuning the `ProxyFactory` configuration.
See <<publisher-annotation>> for more information.
[[x5.1-files]]
=== Files Changes
If you are using `FileExistsMode.APPEND` or `FileExistsMode.APPEND_NO_FLUSH` you can provide a `newFileCallback` that will be called when creating a new file.
This callback receives the newly created file and the message that triggered the callback.
This could be used to write a CSV header, for an example.
The `FileReadingMessageSource` now doesn't check and create a directory until its `start()` is called.
So, if an Inbound Channel Adapter for the `FileReadingMessageSource` has `autoStartup = false`, there are no failures against the file system during application start up.
See <<files>> for more information.
[[x5.1-amqp]]
=== AMQP Changes
We have made `ID` and `Timestamp` header mapping changes in the `DefaultAmqpHeaderMapper`.
See the note near the bottom of <<amqp-message-headers>> for more information.
The `contentType` header is now correctly mapped as an entry in the general headers map.
See <<amqp-content-type>> for more information.
Starting with version 5.1.3, if a message conversion exception occurs when using manual acknowledgments, and an error channel is defined, the payload is a `ManualAckListenerExecutionFailedException` with additional `channel` and `deliveryTag` properties.
This enables the error flow to ack/nack the original message.
See <<amqp-conversion-inbound>> for more information.
[[x5.1-jdbc]]
=== JDBC Changes
A confusing `max-rows-per-poll` property on the JDBC Inbound Channel Adapter and JDBC Outbound Gateway has been deprecated in favor of the newly introduced `max-rows` property.
The `JdbcMessageHandler` supports now a `batchUpdate` functionality when the payload of the request message is an instance of an `Iterable` type.
The indexes for the `INT_CHANNEL_MESSAGE` table (for the `JdbcChannelMessageStore`) have been optimized.
If you have large message groups in such a store, you may wish to alter the indexes.
See <<jdbc>> for more information.
[[x5.1-ftp-sftp]]
=== FTP and SFTP Changes
A `RotatingServerAdvice` is now available to poll multiple servers and directories with the inbound channel adapters.
See <<ftp-rotating-server-advice>> and <<sftp-rotating-server-advice>> for more information.
Also, inbound adapter `localFilenameExpression` instances can contain the `#remoteDirectory` variable, which contains the remote directory being polled.
The generic type of the comparators (used to sort the fetched file list for the streaming adapters) has changed from `Comparator<AbstractFileInfo<F>>` to `Comparator<F>`.
See <<ftp-streaming>> and <<sftp-streaming>> for more information.
In addition, the synchronizers for inbound channel adapters can now be provided with a `Comparator`.
This is useful when using `maxFetchSize` to limit the files retrieved.
The `CachingSessionFactory` has a new property `testSession` which, when true, causes the factory to perform a `test()` operation on the `Session` when checking out an existing session from the cache.
See <<sftp-session-caching>> and <<ftp-session-caching>> for more information.
The outbound gateway MPUT command now supports a message payload with a collection of files or strings.
See <<sftp-outbound-gateway>> and <<ftp-outbound-gateway>> for more information.
[[x51.-tcp]]
=== TCP Support
When using SSL, host verification is now enabled, by default, to prevent man-in-the-middle attacks with a trusted certificate.
See <<tcp-ssl-host-verification>> for more information.
In addition the key and trust store types can now be configured on the `DefaultTcpSSLContextSupport`.
[[x5.1-twitter]]
=== Twitter Support
Since the Spring Social project has moved to https://spring.io/blog/2018/07/03/spring-social-end-of-life-announcement[end of life status], Twitter support in Spring Integration has been moved to the Extensions project.
See https://github.com/spring-projects/spring-integration-extensions/tree/master/spring-integration-social-twitter[Spring Integration Social Twitter] for more information.
[[x51.-jms]]
=== JMS Support
The `JmsSendingMessageHandler` now provides `deliveryModeExpression` and `timeToLiveExpression` options to determine respective QoS options for JMS message to send at runtime.
The `DefaultJmsHeaderMapper` now allows to map inbound `JMSDeliveryMode` and `JMSExpiration` properties via setting to `true` respective `setMapInboundDeliveryMode()` and `setMapInboundExpiration()` options.
When a `JmsMessageDrivenEndpoint` or `JmsInboundGateway` is stopped, the associated listener container is now shut down; this closes its shared connection and any consumers.
You can configure the endpoints to revert to the previous behavior.
See <<jms>> for more information.
[[x51.-http]]
=== HTTP/WebFlux Support
The `statusCodeExpression` (and `Function`) is now supplied with the `RequestEntity<?>` as a root object for evaluation context, so request headers, method, URI and body are available for target status code calculation.
See <<http>> and <<webflux>> for more information.
[[x51.-jmx]]
=== JMX Changes
Object name key values are now quoted if they contain any characters other than those allowed in a Java identifier (or period `.`).
For example `org.springframework.integration:type=MessageChannel,` `name="input:foo.myGroup.errors"`.
This has the side effect that previously "allowed" names, with such characters, will now be quoted.
For example `org.springframework.integration:type=MessageChannel,` `name="input#foo.myGroup.errors"`.
[[x51.-micrometer]]
=== Micrometer Support Changes
It is now simpler to customize the standard Micrometer meters created by the framework.
See <<micrometer-integration>> for more information.
[[x51.-integration-graph]]
=== Integration Graph Customization
It is now possible to add additional properties to the `IntegrationNode` s via `Function<NamedComponent, Map<String, Object>> additionalPropertiesCallback` on the `IntegrationGraphServer`.
See <<integration-graph>> for more information.
[[x51.-global-properties]]
=== Integration Global Properties
The Integration global properties (including defaults) can now be printed in the logs, when a `DEBUG` logic level is turned on for the `org.springframework.integration` category.
See <<global-properties>> for more information.
[[x51.-poller-annotation]]
=== The `receiveTimeout` for `@Poller`
The `@Poller` annotation now provides a `receiveTimeout` option for convenience.
See <<configuration-using-poller-annotation>> for more information.