154.d89cac86.js 13.3 KB
Newer Older
茶陵後's avatar
茶陵後 已提交
1
(window.webpackJsonp=window.webpackJsonp||[]).push([[154],{579:function(e,t,o){"use strict";o.r(t);var a=o(56),n=Object(a.a)({},(function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[o("h1",{attrs:{id:"what-s-new"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#what-s-new"}},[e._v("#")]),e._v(" What’s New?")]),e._v(" "),o("h2",{attrs:{id:"what-s-new-in-spring-integration-5-5"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#what-s-new-in-spring-integration-5-5"}},[e._v("#")]),e._v(" What’s New in Spring Integration 5.5?")]),e._v(" "),o("p",[e._v("If you are interested in more details, see the Issue Tracker tickets that were resolved as part of the 5.5 development process.")]),e._v(" "),o("h3",{attrs:{id:"new-components"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#new-components"}},[e._v("#")]),e._v(" New Components")]),e._v(" "),o("h4",{attrs:{id:"file-aggregator"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#file-aggregator"}},[e._v("#")]),e._v(" File Aggregator")]),e._v(" "),o("p",[e._v("A "),o("code",[e._v("FileSplitter.FileMaker")]),e._v("-based implementation of "),o("code",[e._v("CorrelationStrategy")]),e._v(", "),o("code",[e._v("ReleaseStrategy")]),e._v(" and "),o("code",[e._v("MessageGroupProcessor")]),e._v(" as a "),o("code",[e._v("FileAggregator")]),e._v(" component was introduced.\nSee "),o("RouterLink",{attrs:{to:"/en/spring-integration/file.html#file-aggregator"}},[e._v("File Aggregator")]),e._v(" for more information.")],1),e._v(" "),o("h4",{attrs:{id:"mqtt-v5-support"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#mqtt-v5-support"}},[e._v("#")]),e._v(" MQTT v5 Support")]),e._v(" "),o("p",[e._v("The "),o("code",[e._v("Mqttv5PahoMessageDrivenChannelAdapter")]),e._v(" and "),o("code",[e._v("Mqttv5PahoMessageHandler")]),e._v(" (including respective "),o("code",[e._v("MqttHeaderMapper")]),e._v(") were introduced to support MQTT v5 protocol communication.\nSee "),o("RouterLink",{attrs:{to:"/en/spring-integration/mqtt.html#mqtt-v5"}},[e._v("MQTT v5 Support")]),e._v(" for more information.")],1),e._v(" "),o("h3",{attrs:{id:"general-changes"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#general-changes"}},[e._v("#")]),e._v(" General Changes")]),e._v(" "),o("p",[e._v("All the persistent "),o("code",[e._v("MessageGroupStore")]),e._v(" implementation provide a "),o("code",[e._v("streamMessagesForGroup(Object groupId)")]),e._v(" contract based on the target database streaming API.\nSee "),o("RouterLink",{attrs:{to:"/en/spring-integration/message-store.html#message-store"}},[e._v("Message Store")]),e._v(" for more information.")],1),e._v(" "),o("p",[e._v("The "),o("code",[e._v("integrationGlobalProperties")]),e._v(" bean (if declared) must be now an instance of "),o("code",[e._v("org.springframework.integration.context.IntegrationProperties")]),e._v(" instead of "),o("code",[e._v("java.util.Properties")]),e._v(", which support is deprecated for backward compatibility.\nThe "),o("code",[e._v("spring.integration.channels.error.requireSubscribers=true")]),e._v(" global property is added to indicate that the global default "),o("code",[e._v("errorChannel")]),e._v(" must be configured with the "),o("code",[e._v("requireSubscribers")]),e._v(" option (or not).\nThe "),o("code",[e._v("spring.integration.channels.error.ignoreFailures=true")]),e._v(" global property is added to indicate that the global default "),o("code",[e._v("errorChannel")]),e._v(" must ignore (or not) dispatching errors and pass the message to the next handler.\nSee "),o("RouterLink",{attrs:{to:"/en/spring-integration/configuration.html#global-properties"}},[e._v("Global Properties")]),e._v(" for more information.")],1),e._v(" "),o("p",[e._v("An "),o("code",[e._v("AbstractPollingEndpoint")]),e._v(" (source polling channel adapter and polling consumer) treats "),o("code",[e._v("maxMessagesPerPoll == 0")]),e._v(" as to skip calling the source.\nIt can be changed to different value later on, e.g. via a Control Bus.\nSee "),o("RouterLink",{attrs:{to:"/en/spring-integration/endpoint.html#endpoint-pollingconsumer"}},[e._v("Polling Consumer")]),e._v(" for more information.")],1),e._v(" "),o("p",[e._v("The "),o("code",[e._v("ConsumerEndpointFactoryBean")]),e._v(" now accept a "),o("code",[e._v("reactiveCustomizer")]),e._v(" "),o("code",[e._v("Function")]),e._v(" to any input channel as reactive stream source and use a "),o("code",[e._v("ReactiveStreamsConsumer")]),e._v(" underneath.\nThis is covered as a "),o("code",[e._v("ConsumerEndpointSpec.reactive()")]),e._v(" option in Java DSL and as a "),o("code",[e._v("@Reactive")]),e._v(" nested annotation for the messaging annotations.\nSee "),o("RouterLink",{attrs:{to:"/en/spring-integration/reactive-streams.html#reactive-streams"}},[e._v("Reactive Streams Support")]),e._v(" for more information.")],1),e._v(" "),o("p",[e._v("The "),o("code",[e._v("groupTimeoutExpression")]),e._v(" for a correlation message handler (an "),o("code",[e._v("Aggregator")]),e._v(" and "),o("code",[e._v("Resequencer")]),e._v(") can now be evaluated to a "),o("code",[e._v("java.util.Date")]),e._v(" for some fine-grained scheduling use-cases.\nAlso the "),o("code",[e._v("BiFunction groupConditionSupplier")]),e._v(" option is added to the "),o("code",[e._v("AbstractCorrelatingMessageHandler")]),e._v(" to supply a "),o("code",[e._v("MessageGroup")]),e._v(" condition against a message to be added to the group.\nSee "),o("RouterLink",{attrs:{to:"/en/spring-integration/aggregator.html#aggregator"}},[e._v("Aggregator")]),e._v(" for more information.")],1),e._v(" "),o("p",[e._v("The "),o("code",[e._v("MessageGroup")]),e._v(" abstraction can be supplied with a "),o("code",[e._v("condition")]),e._v(" to evaluate later on to make a decision for the group.\nSee "),o("RouterLink",{attrs:{to:"/en/spring-integration/message-store.html#message-group-condition"}},[e._v("Message Group Condition")]),e._v(" for more information.")],1),e._v(" "),o("h4",{attrs:{id:"integration-flows-composition"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#integration-flows-composition"}},[e._v("#")]),e._v(" Integration Flows Composition")]),e._v(" "),o("p",[e._v("The new "),o("code",[e._v("IntegrationFlows.from(IntegrationFlow)")]),e._v(" factory method has been added to allow starting the current "),o("code",[e._v("IntegrationFlow")]),e._v(" from the output of an existing flow.\nIn addition, the "),o("code",[e._v("IntegrationFlowDefinition")]),e._v(" has added a "),o("code",[e._v("to(IntegrationFlow)")]),e._v(" terminal operator to continue the current flow at the input channel of some other flow.\nSee "),o("RouterLink",{attrs:{to:"/en/spring-integration/dsl.html#integration-flows-composition"}},[e._v("Integration Flows Composition")]),e._v(" for more information.")],1),e._v(" "),o("h4",{attrs:{id:"amqp-changes"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#amqp-changes"}},[e._v("#")]),e._v(" AMQP Changes")]),e._v(" "),o("p",[e._v("The "),o("code",[e._v("AmqpInboundChannelAdapter")]),e._v(" and "),o("code",[e._v("AmqpInboundGateway")]),e._v(" (and the respective Java DSL builders) now support an "),o("code",[e._v("org.springframework.amqp.rabbit.retry.MessageRecoverer")]),e._v(" as an AMQP-specific alternative to the general purpose "),o("code",[e._v("RecoveryCallback")]),e._v(".\nSee "),o("RouterLink",{attrs:{to:"/en/spring-integration/amqp.html#amqp"}},[e._v("AMQP Support")]),e._v(" for more information.")],1),e._v(" "),o("h4",{attrs:{id:"redis-changes"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#redis-changes"}},[e._v("#")]),e._v(" Redis Changes")]),e._v(" "),o("p",[e._v("The "),o("code",[e._v("ReactiveRedisStreamMessageProducer")]),e._v(" has now setters for all the "),o("code",[e._v("StreamReceiver.StreamReceiverOptionsBuilder")]),e._v(" options, including an "),o("code",[e._v("onErrorResume")]),e._v(" function.\nSee "),o("RouterLink",{attrs:{to:"/en/spring-integration/redis.html#redis"}},[e._v("Redis Support")]),e._v(" for more information.")],1),e._v(" "),o("h4",{attrs:{id:"http-changes"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#http-changes"}},[e._v("#")]),e._v(" HTTP Changes")]),e._v(" "),o("p",[e._v("The "),o("code",[e._v("HttpRequestExecutingMessageHandler")]),e._v(" doesn’t fallback to the "),o("code",[e._v("application/x-java-serialized-object")]),e._v(" content type any more and lets the "),o("code",[e._v("RestTemplate")]),e._v(" make the final decision for the request body conversion based on the "),o("code",[e._v("HttpMessageConverter")]),e._v(" provided.\nIt also has now an "),o("code",[e._v("extractResponseBody")]),e._v(" flag (which is "),o("code",[e._v("true")]),e._v(" by default) to return just the response body, or to return the whole "),o("code",[e._v("ResponseEntity")]),e._v(" as the reply message payload, independently of the provided "),o("code",[e._v("expectedResponseType")]),e._v(".\nSame option is presented for the "),o("code",[e._v("WebFluxRequestExecutingMessageHandler")]),e._v(", too.\nSee "),o("RouterLink",{attrs:{to:"/en/spring-integration/http.html#http"}},[e._v("HTTP Support")]),e._v(" for more information.")],1),e._v(" "),o("h4",{attrs:{id:"file-ftp-sftp-changes"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#file-ftp-sftp-changes"}},[e._v("#")]),e._v(" File/FTP/SFTP Changes")]),e._v(" "),o("p",[e._v("The persistent file list filters now have a boolean property "),o("code",[e._v("forRecursion")]),e._v(".\nSetting this property to "),o("code",[e._v("true")]),e._v(", also sets "),o("code",[e._v("alwaysAcceptDirectories")]),e._v(", which means that the recursive operation on the outbound gateways ("),o("code",[e._v("ls")]),e._v(" and "),o("code",[e._v("mget")]),e._v(") will now always traverse the full directory tree each time.\nThis is to solve a problem where changes deep in the directory tree were not detected.\nIn addition, "),o("code",[e._v("forRecursion=true")]),e._v(" causes the full path to files to be used as the metadata store keys; this solves a problem where the filter did not work properly if a file with the same name appears multiple times in different directories.\nIMPORTANT: This means that existing keys in a persistent metadata store will not be found for files beneath the top level directory.\nFor this reason, the property is "),o("code",[e._v("false")]),e._v(" by default; this may change in a future release.")]),e._v(" "),o("p",[e._v("The "),o("code",[e._v("FileInboundChannelAdapterSpec")]),e._v(" has now a convenient "),o("code",[e._v("recursive(boolean)")]),e._v(" option instead of requiring an explicit reference to the "),o("code",[e._v("RecursiveDirectoryScanner")]),e._v(".")]),e._v(" "),o("p",[e._v("The "),o("code",[e._v("remoteDirectoryExpression")]),e._v(" can now be used in the "),o("code",[e._v("mv")]),e._v(" command for convenience.")]),e._v(" "),o("h4",{attrs:{id:"mongodb-changes"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#mongodb-changes"}},[e._v("#")]),e._v(" MongoDb Changes")]),e._v(" "),o("p",[e._v("The "),o("code",[e._v("MongoDbMessageSourceSpec")]),e._v(" was added into MongoDd Java DSL.\nAn "),o("code",[e._v("update")]),e._v(" option is now exposed on both the "),o("code",[e._v("MongoDbMessageSource")]),e._v(" and "),o("code",[e._v("ReactiveMongoDbMessageSource")]),e._v(" implementations.")]),e._v(" "),o("p",[e._v("See "),o("RouterLink",{attrs:{to:"/en/spring-integration/mongodb.html#mongodb"}},[e._v("MongoDb Support")]),e._v(" for more information.")],1),e._v(" "),o("h4",{attrs:{id:"websockets-changes"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#websockets-changes"}},[e._v("#")]),e._v(" WebSockets Changes")]),e._v(" "),o("p",[e._v("The WebSocket channel adapters based on "),o("code",[e._v("ServerWebSocketContainer")]),e._v(" can now be registered and removed at runtime.")]),e._v(" "),o("p",[e._v("See "),o("RouterLink",{attrs:{to:"/en/spring-integration/web-sockets.html#web-sockets"}},[e._v("WebSockets Support")]),e._v(" for more information.")],1),e._v(" "),o("h4",{attrs:{id:"jpa-changes"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#jpa-changes"}},[e._v("#")]),e._v(" JPA Changes")]),e._v(" "),o("p",[e._v("The "),o("code",[e._v("JpaOutboundGateway")]),e._v(" now supports an "),o("code",[e._v("Iterable")]),e._v(" message payload for a "),o("code",[e._v("PersistMode.DELETE")]),e._v(".")]),e._v(" "),o("p",[e._v("See "),o("RouterLink",{attrs:{to:"/en/spring-integration/jpa.html#jpa-outbound-channel-adapter"}},[e._v("Outbound Channel Adapter")]),e._v(" for more information.")],1),e._v(" "),o("h4",{attrs:{id:"gateway-changes"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#gateway-changes"}},[e._v("#")]),e._v(" Gateway Changes")]),e._v(" "),o("p",[e._v("Previously, when using XML configuration, "),o("code",[e._v("@Gateway.payloadExpression")]),e._v(" was ignored for no-argument methods.\nThere is one possible breaking change - if the method is annotated with "),o("code",[e._v("@Payload")]),e._v(" as well as "),o("code",[e._v("@Gateway")]),e._v(" (with a different expression) previously, the "),o("code",[e._v("@Payload")]),e._v(" would be applied, now the "),o("code",[e._v("@Gateway.payloadExpression")]),e._v(" is applied.\nSee "),o("RouterLink",{attrs:{to:"/en/spring-integration/gateway.html#gateway-configuration-annotations"}},[e._v("Gateway Configuration with Annotations and XML")]),e._v(" and "),o("RouterLink",{attrs:{to:"/en/spring-integration/gateway.html#gateway-calling-no-argument-methods"}},[e._v("Invoking No-Argument Methods")]),e._v(" for more information.")],1)])}),[],!1,null,null,null);t.default=n.exports}}]);