diff --git a/build.gradle b/build.gradle index 493e7f5e2b..47161ac8ef 100644 --- a/build.gradle +++ b/build.gradle @@ -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') { diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 29953ea141..87b738cbd0 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e0b3fb8d70..44e7c4d1d7 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -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 diff --git a/gradlew b/gradlew index cccdd3d517..af6708ff22 100755 --- a/gradlew +++ b/gradlew @@ -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" diff --git a/gradlew.bat b/gradlew.bat index e95643d6a2..6d57edc706 100755 --- a/gradlew.bat +++ b/gradlew.bat @@ -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 diff --git a/spring-integration-jpa/src/test/java/org/springframework/integration/jpa/core/EclipseLinkJpaOperationsTests-context.xml b/spring-integration-jpa/src/test/java/org/springframework/integration/jpa/core/EclipseLinkJpaOperationsTests-context.xml deleted file mode 100644 index 2d16167444..0000000000 --- a/spring-integration-jpa/src/test/java/org/springframework/integration/jpa/core/EclipseLinkJpaOperationsTests-context.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - diff --git a/spring-integration-jpa/src/test/java/org/springframework/integration/jpa/core/EclipseLinkJpaOperationsTests.java b/spring-integration-jpa/src/test/java/org/springframework/integration/jpa/core/EclipseLinkJpaOperationsTests.java deleted file mode 100644 index 0bc028130f..0000000000 --- a/spring-integration-jpa/src/test/java/org/springframework/integration/jpa/core/EclipseLinkJpaOperationsTests.java +++ /dev/null @@ -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 javaagent: - * - *
- * {@code
- * -javaagent:/home//.m2/repository/org/springframework/spring-instrument/3.1.1.RELEASE/spring-instrument-3.1.1
- * .RELEASE.jar
- * }
- * 
- * - * @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(); - } - -} diff --git a/src/reference/asciidoc/changes-5.0-5.1.adoc b/src/reference/asciidoc/changes-5.0-5.1.adoc new file mode 100644 index 0000000000..66d7d8c459 --- /dev/null +++ b/src/reference/asciidoc/changes-5.0-5.1.adoc @@ -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]] +==== `AmqpDedicatedChannelAdvice` + +See <>. + +[[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 <>. + +[[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 <>. + +[[x5.1-general]] +=== General Changes + +The following changes have been made in version 5.1: + +* <> +* <> +* <> +* <> +* <> +* <> +* <> +* <> +* <> +* <> + +[[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 <> 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 <> 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 <> 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 `` child element on ``. +Also the `proxy-target-class` and `order` attributes have been added for tuning the `ProxyFactory` configuration. + +See <> 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 <> 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 <> for more information. + +The `contentType` header is now correctly mapped as an entry in the general headers map. +See <> 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 <> 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 <> 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 <> and <> 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>` to `Comparator`. +See <> and <> 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 <> and <> for more information. + +The outbound gateway MPUT command now supports a message payload with a collection of files or strings. +See <> and <> 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 <> 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 <> 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 <> and <> 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 <> for more information. + +[[x51.-integration-graph]] +=== Integration Graph Customization + +It is now possible to add additional properties to the `IntegrationNode` s via `Function> additionalPropertiesCallback` on the `IntegrationGraphServer`. +See <> 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 <> for more information. + +[[x51.-poller-annotation]] +=== The `receiveTimeout` for `@Poller` + +The `@Poller` annotation now provides a `receiveTimeout` option for convenience. +See <> for more information. diff --git a/src/reference/asciidoc/docinfo.html b/src/reference/asciidoc/docinfo.html new file mode 100644 index 0000000000..19e2462b2c --- /dev/null +++ b/src/reference/asciidoc/docinfo.html @@ -0,0 +1,5 @@ + diff --git a/src/reference/asciidoc/history.adoc b/src/reference/asciidoc/history.adoc index 6b3c06d80f..3fe71f7bc1 100644 --- a/src/reference/asciidoc/history.adoc +++ b/src/reference/asciidoc/history.adoc @@ -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[] diff --git a/src/reference/asciidoc/index.adoc b/src/reference/asciidoc/index.adoc index f88d8d6c9e..42500493ae 100644 --- a/src/reference/asciidoc/index.adoc +++ b/src/reference/asciidoc/index.adoc @@ -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 <>. diff --git a/src/reference/asciidoc/overview.adoc b/src/reference/asciidoc/overview.adoc index 89e2f165db..0c02360806 100644 --- a/src/reference/asciidoc/overview.adoc +++ b/src/reference/asciidoc/overview.adoc @@ -432,7 +432,7 @@ The `@IntegrationConverter` annotation marks `Converter`, `GenericConverter`, or This annotation is an analogue of the `` XML element (see <>). You can place `@IntegrationConverter` annotations at the class level (with a `@Component` stereotype annotation) or on `@Bean` methods within `@Configuration` classes. -See <> for more information about messaging mnnotations. +See <> for more information about messaging annotations. [[programming-considerations]] === Programming Considerations diff --git a/src/reference/asciidoc/preface.adoc b/src/reference/asciidoc/preface.adoc index 29a353d52a..4c1b003538 100644 --- a/src/reference/asciidoc/preface.adoc +++ b/src/reference/asciidoc/preface.adoc @@ -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 diff --git a/src/reference/asciidoc/whats-new.adoc b/src/reference/asciidoc/whats-new.adoc index a8fd06d0a5..1ed996667e 100644 --- a/src/reference/asciidoc/whats-new.adoc +++ b/src/reference/asciidoc/whats-new.adoc @@ -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]] -==== `AmqpDedicatedChannelAdvice` - -See <>. - -[[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 <>. - -[[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 <>. - -[[x5.1-general]] +[[x5.2-general]] === General Changes -The following changes have been made in version 5.1: -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> - -[[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 <> 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 <> 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 <> 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 `` child element on ``. -Also the `proxy-target-class` and `order` attributes have been added for tuning the `ProxyFactory` configuration. - -See <> 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 <> 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 <> for more information. - -The `contentType` header is now correctly mapped as an entry in the general headers map. -See <> 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 <> 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 <> 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 <> and <> 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>` to `Comparator`. -See <> and <> 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 <> and <> for more information. - -The outbound gateway MPUT command now supports a message payload with a collection of files or strings. -See <> and <> 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 <> 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 <> 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 <> and <> 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 <> for more information. - -[[x51.-integration-graph]] -=== Integration Graph Customization - -It is now possible to add additional properties to the `IntegrationNode` s via `Function> additionalPropertiesCallback` on the `IntegrationGraphServer`. -See <> 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 <> for more information. - -[[x51.-poller-annotation]] -=== The `receiveTimeout` for `@Poller` - -The `@Poller` annotation now provides a `receiveTimeout` option for convenience. -See <> for more information.