Spring Integration 2.2 to 3.0 Migration Guide
Clone this wiki locally
This interface is now an inner interface of MessageGroupStore; everything remains the same, just change the import.
Spring Integration no longer falls back to the
ConversionService, however there is still falling back to the creation of
DefaultConversionService where it is appropriate, if there is no registered integrationConversionService bean. If there is really a reason to use
integrationConversionService, simply add the following to the Application Context:
<alias name="conversionService" alias="integrationConversionService"/>
##Aggregator & Resequencer
<aggregator> no longer iterates over message groups in the
AggregatingMessageHandler#setExpireGroupsUponCompletion to remove complete groups. It could lead to an overload on application start up when there wer a large number of messages/groups in the
MessageStore. Similar logic is present on the
AbstractCorrelatingMessageHandler#forceComplete, when expiring message groups.
For expiring groups and removing empty groups, you need to configure a
MessageGroupStoreReaper for the
MessageStore used by the
<aggregator> or the
Empty groups can be retained to detect (and possibly reject) late arriving messages.
With this release, an
empty-group-min-timeout attribute was introduced for the
<aggregator> and the
<resequencer>. If you wish to run empty group deletion on a longer
schedule than expiring partial groups, set this property. Empty groups will then not be removed from the
MessageStore until they have not been modified for at least this number of milliseconds.
In prior versions of Spring Integration the functionality of the XPath Filter was configured using the xpath-selector element. However, in order to provide a more consistent behavior within the Spring Integration Framework, the xpath-selector element has been removed.
Please use the xpath-filter instead. It provides the same set of functionality. In fact it still uses the same MessageSelectors internally.
A new abstraction for JSON conversion has been introduced:
JsonObjectMapper. Implementations for Jackson 1.x and Jackson 2 are currently provided (
resp.), with the version being determined by presence on the classpath. Usage of Jackson 1.x
<json-to-object-transformer> is still supported, but it is deprecated and will be removed in future releases.
JsonOutboundMessageMapper have been changed to use new JSON strategy too.
JsonInboundMessageMapper now requires an implementation of
JsonInboundMessageMapper.JsonMessageParser as one of constructor arguments.
Jackson2JsonMessageParser implementations are provided out of the box.
##Core module packages refactoring
To avoid packages tangle and classes cycling there were introduced new packages:
NamedComponent class and JSON infrustruscture classes (e.g.
JsonObjectMapper abstraction) were moved to new packages respectively.
##FTP, SFTP, and FTPS Session Caching
Sessions are no longer cached by default; the
cache-sessions attribute is no longer available on these endpoints; see the
What's New? section of the reference manual.
##HTTP Header Mapping
if-modified-since header was incorrectly mapped as a String representation of a Date instead of a long; also
if-unmodified-since header (inbound) contained the wrong value (from
If your application uses the
if-modified-since header, please be aware of the format change.
connection header was not mapped to the Response Headers automatically. Now it is one of standard headers, which are transferred as is between
MessageHeaders and HTTP Request and Response. With that now you can say
Connection: close in any place of the HTTP downstream integration flow.
In Spring Integration 2.2 the JDBC Message Store did not correctly execute the queries when using Regions. In order to fix the issue, the REGION column was added to the INT_GROUP_TO_MESSAGE table. Furthermore, the REGION column is now part of the primary key. With Spring Integration 3.0, the queries will now always use the GROUP_KEY and the REGION.
Therefore, please verify that the table structure used for your JDBC Message Store is updated. In the spring-integration-jdbc JAR file you will find updated DDL scripts in the org.springframework.integration.jdbc package. For further information, please see chapter 17.4.3 Initializing the Database of the reference guide.
Stored Procedure Adapters
row-mapper attribute of
<int-jdbc:returning-resultset/> supported only a fully qualified class name. To provide more flexibility and to allow a
RowMapper to be configured as a generic bean, this attribute was converted to bean reference. Note, for backward compatibility, the
row-mapper attribute continues to support class name.
Previously, during retry, any business exception thrown by the handler was wrapped in a
MessagingException. This precluded the use of conditional exception retries because the classifier would look at the
MessagingException not the underlying exception. With this release, the retry now gets the underlying business exception instead. If you currently have a retry advice that is configured for conditional exception retries, you may need to adjust the configuration to reflect this change.
HTTP Request Mapping
The HTTP module now provides powerful Request Mapping support for Inbound Endpoints. Class
UriPathHandlerMapping was replaced by
IntegrationRequestMappingHandlerMapping, which is registered under the bean name integrationRequestMappingHandlerMapping in the application context. Upon parsing of the HTTP Inbound Endpoint, a new
IntegrationRequestMappingHandlerMapping bean is either registered or an existing bean is being reused. To achieve flexible Request Mapping configuration, Spring Integration provides the
<request-mapping/> sub-element for
<http:inbound-gateway/>. Both HTTP Inbound Endpoints are now fully based on the Request Mapping infrastructure that was introduced with Spring MVC 3.1.
AbstractReplyProducingMessageHandler onInit() Method
Previously, this method was declared
protected void onInit() enabling subclasses to override it so they can participate in the endpoint initialization.
However, this does not enforce subclasses to invoke
super.onInit(), which is required to enable features such as the
<request-handler-advice-chain/> on endpoints. At least one Spring Integration Extension project failed to do this. Starting with 3.0, this method is now
final and subclasses cannot override it. To participate in bean initialization, subclasses must implement
doInit() instead, which is invoked by the final
Twitter Inbound Channel Adapter Rate Limiting
Previously, a hard-coded limit within the adapters was used to ensure the polling interval could not be less than 15 seconds. This is no longer the case and the poller configuration is applied directly. For mere information see: https://dev.twitter.com/docs/rate-limiting/1.1
Removed Deprecations from previous versions
Several deprecations from earlier releases have been removed in the 3.0 release:
channel-resolverattribute - in favor of using SpEL via
dispatcherattribute - in favor of using
StoredProcExecutor#setFunction- in favor of using
StoredProcOutboundGateway- which had been moved to
storedProcedureName- in favor of using constructor with parameter
CHAT_THREAD_ID- in favor of using
AbstractXmppConnectionAwareEndpoint#setRequestChannel- in favor of using the