2. What’s new in Spring Integration 4.3?

This chapter provides an overview of the new features and improvements that have been introduced with Spring Integration 4.3. If you are interested in more details, please see the Issue Tracker tickets that were resolved as part of the 4.3 development process.

2.1 New Components

2.1.1 AMQP Async Outbound Gateway

See the section called “CompletableFuture”.

2.1.2 MessageGroupFactory

The new MessageGroupFactory strategy has been introduced to allow a control over MessageGroup instances in MessageGroupStore logic. The SimpleMessageGroupFactory is provided for the SimpleMessageGroup with the GroupType.HASH_SET as the default factory for the standard MessageGroupStore implementations. See the section called “CompletableFuture” for more information.

2.1.3 PersistentMessageGroup

The PersistentMessageGroup, - lazy-load proxy, - implementation is provided for persistent MessageGroupStore s, which return this instance for the getMessageGroup() when their lazyLoadMessageGroups is true (defaults). See the section called “CompletableFuture” for more information.

2.1.4 FTP/SFTP Streaming Inbound Channel Adapters

New inbound channel adapters are provided that return an InputStream for each file allowing you to retrieve remote files without writing them to the local file system See the section called “CompletableFuture” and the section called “CompletableFuture” for more information.

2.1.5 Stream Transformer

A new StreamTransformer is provided to transform an InputStream payload to either a byte[] or String. See the section called “Stream Transformer” for more information.

2.1.6 Integration Graph

A new IntegrationGraphServer together with the IntegrationGraphController REST service are provided to expose the runtime model of a Spring Integration application as a graph. See the section called “CompletableFuture” for more information.

2.1.7 JDBC Lock Registry

A new JdbcLockRegistry is provided for distributed locks shared through the data base table. See the section called “CompletableFuture” for more information.

2.1.8 Leader Initiator for Lock Registry

A new LeaderInitiator implementation is provided based on the LockRegistry strategy. See Section 8.3, “Leadership Event Handling” for more information.

2.2 General Changes

2.2.1 Core Changes

Outbound Gateway within Chain

Previously, it was possible to specify a reply-channel on an outbound gateway within a chain. It was completely ignored; the gateway’s reply goes to the next chain element, or to the chain’s output channel if the gateway is the last element. This condition is now detected and disallowed. If you have such configuration, simply remove the reply-channel.

Async Service Activator

An option to make the Service Asynchronous has been added. See the section called “CompletableFuture” for more information.

Messaging Annotation Support changes

The Messaging Annotation Support doesn’t require any more @MessageEndpoint (or any other @Component) annotation declaration on the class level. To restore the previous behaviour specify the spring.integration.messagingAnnotations.require.componentAnnotation of spring.integration.properties as true. See the section called “CompletableFuture” and the section called “CompletableFuture” for more information.

Lifecycle Role Controller

The SmartLifecycleRoleController now provides methods to obtain status of endpoints in roles. See Section 8.2, “Endpoint Roles” for more information.

2.2.2 Mail Changes

Customizable User Flag

The customizable userFlag added in 4.2.2 to provide customization of the flag used to denote that the mail has been seen is now available using the XML namespace. See the section called “CompletableFuture” for more information.

Mail Message Mapping

There is now an option to map inbound mail messages with the MessageHeaders containing the mail headers and the payload containing the email content. Previously, the payload was always the raw MimeMessage. See the section called “CompletableFuture” for more information.

2.2.3 JMS Changes

Header Mapper

The DefaultJmsHeaderMapper now maps the standard correlationId header as a message property by invoking its toString() method. See the section called “CompletableFuture” for more information.

Async Gateway

The JMS Outbound gateway now has an async property. See the section called “CompletableFuture” for more information.

2.2.4 Aggregator Changes

There is a change in behavior when a POJO aggregator releases a collection of Message<?> objects; this is rare but if your application does that, you will need to make a small change to your POJO. See this Important note for more information.

2.2.5 TCP/UDP Changes

Events

A new TcpConnectionServerListeningEvent is emitted when a server connection factory is started. See the section called “CompletableFuture” for more information.

The destination-expression and socket-expression are now available for the <int-ip:udp-outbound-channel-adapter>. See the section called “CompletableFuture” for more information.

Stream Deserializers

The various deserializers that can’t allocate the final buffer until the whole message has been assembled now support pooling of the raw buffer into which the data is received, rather than creating and discarding a buffer for each message. See the section called “CompletableFuture” for more information.

TCP Message Mapper

The message mapper now, optionally, sets a configured content type header. See IP Message Headers for more information.

2.2.6 File Changes

Destination Directory Creation

The generated file name for the FileWritingMessageHandler can represent sub-path to save the desired directory structure for file in the target directory. See the section called “CompletableFuture” for more information.

The FileReadingMessageSource now hides the WatchService directory scanning logic in the inner class. The use-watch-service and watch-events options are provided to enable such a behaviour. The top level WatchServiceDirectoryScanner has been deprecated because of inconsistency around API. See the section called “CompletableFuture” for more information.

Buffer Size

When writing files, you can now specify the buffer size to use.

Appending and Flushing

You can now avoid flushing files when appending and use a number of strategies to flush the data during idle periods. See the section called “CompletableFuture” for more information.

Preserving Timestamps

The outbound channel adapter can now be configured to set the destination file’s lastmodified timestamp. See the section called “CompletableFuture” for more information.

Splitter Changes

The FileSplitter will now automatically close an (S)FTP session when the file is completely read. This applies when the outbound gateway returns an InputStream or the new (S)FTP streaming channel adapters are being used. Also a new markers-json options has been introduced to convert FileSplitter.FileMarker to JSON String for relaxed downstream network interaction. See the section called “CompletableFuture” for more information.

File Filters

A new ChainFileListFilter is provided as an alternative to CompositeFileListFilter. See the section called “CompletableFuture” for more information.

2.2.7 AMQP Changes

Content Type Message Converter

The outbound endpoints now support a RabbitTemplate configured with a ContentTypeDelegatingMessageConverter such that the converter can be chosen based on the message content type. See the section called “CompletableFuture” for more information.

Headers for Delayed Message Handling

Spring AMQP 1.6 adds support for Delayed Message Exchanges. Header mapping now supports the headers (amqp_delay and amqp_receivedDelay) used by this feature.

AMQP-Backed Channels

AMQP-backed channels now support message mapping. See the section called “CompletableFuture” for more information.

2.2.8 Redis Changes

List Push/Pop Direction

Previously, the queue channel adapters always used the Redis List in a fixed direction, pushing to the left end and reading from the right end. It is now possible to configure the reading and writing direction using rightPop and leftPush options for the RedisQueueMessageDrivenEndpoint and RedisQueueOutboundChannelAdapter respectively. See the section called “CompletableFuture” and the section called “CompletableFuture” for more information.

Queue Inbound Gateway Default Serializer

The default serializer in the inbound gateway has been changed to a JdkSerializationRedisSerializer for compatibility with the outbound gateway. See the section called “CompletableFuture” for more information.

2.2.9 HTTP Changes

Previously, with requests that had a body (such as POST) that had no content-type header, the body was ignored. With this release, the content type of such requests is considered to be application/octet-stream as recommended by RFC 2616. See the section called “CompletableFuture” for more information.

2.2.10 SFTP Changes

Factory Bean

A new factory bean is provided to simplify the configuration of Jsch proxies for SFTP. See the section called “CompletableFuture” for more information.

Inbound Channel Adapter

The inbound channel adapter is now configured with a FileSystemPersistentAcceptOnceFileListFilter in the local-filter by default. See the section called “CompletableFuture” for more information.

chmod

The SFTP outbound gateway (for put and mput commands) and the SFTP outbound channel adapter now support the chmod attribute to change the remote file permissions after uploading. See the section called “CompletableFuture” and the section called “CompletableFuture” for more information.

2.2.11 FTP Changes

Session Changes

The FtpSession now supports null for the list() and listNames() method, since it is possible by the underlying FTP Client. With that the FtpOutboundGateway can now be configured without remoteDirectory expression. And the <int-ftp:inbound-channel-adapter> can be configured without remote-directory/remote-directory-expression. See the section called “CompletableFuture” for more information.

Inbound Channel Adapter

The inbound channel adapter is now configured with a FileSystemPersistentAcceptOnceFileListFilter in the local-filter by default. See the section called “CompletableFuture” for more information.

2.2.12 Router Changes

The ErrorMessageExceptionTypeRouter supports now the Exception superclass mappings to avoid duplication for the same channel in case of several inheritors. For this purpose the ErrorMessageExceptionTypeRouter loads mapping classes during initialization to fail-fast for a ClassNotFoundException.

See Section 6.1, “Routers” for more information.

2.2.13 Header Mapping

General

AMQP, WS and XMPP header mappings (e.g. request-header-mapping, reply-header-mapping) now support negated patterns. See the section called “CompletableFuture”, the section called “CompletableFuture”, and the section called “CompletableFuture” for more information.

AMQP Header Mapping

Previously, only standard AMQP headers were mapped by default; users had to explicitly enable mapping of user-defined headers. With this release all headers are mapped by default. In addition, the inbound amqp_deliveryMode header is no longer mapped by default. See the section called “CompletableFuture” for more information.

2.2.14 Groovy Scripts

Groovy scripts can now be configured with the compile-static hint or any other CompilerConfiguration options. See the section called “CompletableFuture” for more information.

2.2.15 @InboundChannelAdapter

The @InboundChannelAdapter has now an alias channel attribute for regular value. In addition the target SourcePollingChannelAdapter components can now resolve the target outputChannel bean from its provided name (outputChannelName options) in late-binding manner. See the section called “CompletableFuture” for more information.

2.2.16 XMPP changes

The XMPP Extensions (XEP) are now supported by the XMPP channel adapters. See the section called “CompletableFuture” for more information.

2.2.17 WireTap Late Binding

The WireTap ChannelInterceptor now can accept a channelName which is resolved to the target MessageChannel later, during the first active interceptor operation. See the section called “Wire Tap” for more information.

2.2.18 ChannelMessageStoreQueryProvider

The ChannelMessageStoreQueryProvider now supports H2 database. See the section called “CompletableFuture” for more information.

2.2.19 WebSocket Changes

The ServerWebSocketContainer now exposes allowedOrigins option and SockJsServiceOptions a suppressCors option. See the section called “CompletableFuture” for more information.

2.2.20 Barrier Changes

The BarrierMessageHandler now supports a discard channel to which late-arriving trigger messages are sent. See Section 6.8, “Thread Barrier” for more information.

2.2.21 AMQP Changes

The AMQP outbound endpoints now support setting a delay expression for when using the RabbitMQ Delayed Message Exchange plugin. See the section called “CompletableFuture” for more information.