Skip to content

Spring Integration 4.0 to 4.1 Migration Guide

Artem Bilan edited this page Feb 16, 2015 · 19 revisions

##Spring Framework 4.1 base line

Spring Integration 4.1 is based on Spring Framework 4.1 and isn't compatible with previous versions.

Some API has been moved to the Spring Messaging module and deprecated in Spring Integration, considering to be removed in future releases:

  • Payload, Header and Headers annotations from the org.springframework.integration.annotation package to respective annotations in the org.springframework.messaging.handler.annotation package.

##Spring AMQP 1.4

Starting with version 1.4 Spring AMQP Framewrok has been improved to use Spring Messaging abstraction. Some API has been moved frm Spring Integration to Spring AMQP:

  • org.springframework.integration.amqp.AmqpHeaders -> org.springframework.amqp.support.AmqpHeaders. The former is deprecated now and extends the last one for backward compatibility.

##Removal of deprecated API

  • The GatewayProxyFactoryBean no longer provides the #method expression evaluation variable (which contained the Method name) in favor of #gatewayMethod, which provides access to the entire Method object.
  • The spring_reply_correlation and spring_reply_to AMQP header aren't mapped by default any more.

##Inbound Endpoints Lifecycle Phase

The default phase of SourcePollingChannelAdapterFactoryBean, AbstractPollingEndpoint, MessageProducerSupport, JmsMessageDrivenEndpoint has been changed to the Integer.MAX_VALUE / 2 instead of 0 before. The bigger phase value means that component will be started later and stopped earlier, than those who has less value. Previously, the same 0 default value caused an issue when Consumer Endpoint might be stopped on application stop before Inbound Endpoint and the "Dispatcher has no subscribers" exception has been thrown. The similar issue we might have in a case, when Inbound Endpoint has been started before a Consumer Endpoint. Hence we ended up with losing messages issue.

##JMX

  • The <int-jmx:mbean-exporter/> no longer supports a shutdown-executor attribute.

##(S)FTP

  • The SftpPersistentAcceptOnceFileListFilter use getFilename instead of getLongname.

##HTTP

  • The Content-Disposition header is now mapped as standard one using DefaultHttpHeaderMapper. Previously it was mapped as user-defined with provided prefix, X- by default.

  • Before Spring Integration 4.0 the MessageHeaders.CONTENT_TYPE constant had had a value content-type. It was appropriate header name to be mapped to the HTTP header Content-Type. But since migration to Spring Messaging MessageHeaders.CONTENT_TYPE constant has a value contentType. It prevented to map Message header to the HTTP request properly. Now DefaultHttpHeaderMapper has been changed to map HTTP request header Content-Type to/from the MessageHeaders.CONTENT_TYPE, if the default configuration is used. It allows to propagate Message state to the HTTP request automatically:

<int:chain>
     <int:object-to-json-transformer/>
     <int-http:outbound-gateway url="http://service"/>
</int:chain>

##JMS

  • Previously the org.springframework.integration.jms.DefaultJmsHeaderMapper overrode values, which had been able to be populated by the org.springframework.jms.support.converter.MessageConverter in the org.springframework.integration.jms.JmsMessageDrivenEndpoint logic. Since MessageConverter result has a precedence, which is closer to JMS, the DefaultJmsHeaderMapper now skips those custom MessageHeaders which already has been populated by the MessageConverter.

##Feed

The spring-integration-feed module has been upgraded to the com.rometools:rome-fetcher:1.5.0. And now rome classes are under new packages, e.g. com.sun.syndication.feed.synd.SyndEntry -> com.rometools.rome.feed.synd.SyndEntry.

##TCP/IP

Previously, only writes after the first were buffered by Nagle's algorithm. This meant that a serializer (such as stx/etx) could perform multiple IOs when sending data. To avoid this, the TcpNetConnection now wraps the Socket's outputStream in a BufferedOutputStream. Starting with this version, custom org.springframework.core.serializer.Serializer s for the org.springframework.integration.ip.tcp.connection.ConnectionFactory must add objectOutputStream.flush(); at the end of its serialize() method.

integrationConversionService

Previously, the integrationConversionService has been registered in the application context only, when you define some custom Converter for the Spring Integration environment - <int:converter> or @IntegrationConverter. Since version 4.1 the Spring Integration introduces ToStringFriendlyJsonNodeToStringConverter to allow avoid .toString() call for the JsonPropertyAccessor.ToStringFriendlyJsonNode objec within SpEL expression or for the POJO method arguments. Hence the integrationConversionService is registered automatically if Jackson is presented in the classpath. Having that any ConversionService injection must be marked with @Qualifier for appropriate instance in the aplication context. For example:

@Autowired
@Qualifier("mvcConversionService")
private ConfigurableConversionService conversionService;