领先一步
VMware提供培训和认证,以加快您的进步。
了解更多亲爱的Spring社区:
我们高兴地宣布Spring Integration 4.1发行候选版本现已推出。请使用Maven或Gradle的里程碑仓库,或下载发行版归档文件进行体验。
此版本包含许多新功能和改进,以及许多错误修复。GA版本计划于11月初发布。
首先,感谢所有为4.1里程碑1提供反馈并提交报告(错误或新功能)的人。特别感谢那些通过Pull Requests提供贡献的人。以下是自里程碑版本以来主要更改的摘要:
WebSockets支持
此功能在4.1里程碑1中引入,但已解决几个问题,我们现在提供了一些示例来更好地理解如何在Spring Integration应用程序中使用WebSockets:基本示例和STOMP聊天示例。
JDK8 Optional<?>一致处理
如果您使用Java 8,则可以对服务方法参数使用Optional<?>
容器。例如:
public void optionals(@Payload("@myConvert.conv(payload)") Optional<Bar> payload,
@Header(value="foo") Optional<String> header)
在这种情况下,如果@myConvert.conv(payload)
返回null
,则payload
变量将包含Optional.empty()
。header
变量也一样——如果请求Message<?>
中没有foo
头。
路由单模式
现在支持路由单模式。我们没有使用简单的通道名称静态列表
,而是引入了RoutingSlipRouteStrategy
,它根据请求Message<?>
和回复对象
提供动态运行时路由。也支持SpEL。
<header-enricher input-channel="input" output-channel="process">
<routing-slip value="channel1; request.headers[myRoutingSlipChannel];
routingSlipRoutingStrategy;"/>
</header-enricher>
此模式在复杂、动态的情况下非常有用,在这种情况下,配置多个路由器以确定消息流可能会变得很困难。通过此增强功能,当消息到达没有output-channel
的端点时,将查阅路由单以确定将消息发送到的下一个通道。当路由单用尽时,正常的replyChannel
处理将恢复。
幂等接收器模式
在此版本中,我们已将幂等接收器实现为一等公民特性。以前,用户必须通过例如在<filter/>
中使用自定义MessageSelector
来实现此模式。框架现在支持此功能作为一个可以应用于任何消费端点的Advice
组件。
<idempotent-receiver endpoint="endpoint1, foo*"
metadata-store="store"
discard-channel="duplicates"
key-expression="payload.invoiceNumber"/>
这将创建一个AOP IdempotentReceiverInterceptor
,该拦截器应用于MessageHandler#handleMessage
,其中端点的id
与提供的endpoint
模式之一匹配。
如果省略discard-channel
,重复消息仍将发送到消息处理程序,但它将包含一个duplicateMessage
头,允许用户代码采取进一步的操作。
对于JavaConfig,提供了@IdempotentReceiver
注解,但是也必须配置IdempotentReceiverInterceptor
@Bean
。
@Bean
public IdempotentReceiverInterceptor idempotentReceiverInterceptor() {
return new IdempotentReceiverInterceptor(new MetadataStoreSelector(m ->
m.getPayload().toString()));
}
@Bean
@ServiceActivator(inputChannel = "input", outputChannel = "output")
@IdempotentReceiver("idempotentReceiverInterceptor")
public MessageHandler myService() {
....
}
有关更多信息,请阅读IdempotentReceiverInterceptor
的JavaDoc。
分散-收集模式
现在提供了分散-收集企业集成模式。
<!--Auction scenario-->
<scatter-gather input-channel="inputAuction" output-channel="output"
scatter-channel="auctionChannel">
<gatherer release-strategy-expression="^[payload gt 5] != null or size() == 3"/>
</scatter-gather>
<!--Distribution scenario-->
<scatter-gather input-channel="inputDistribution" output-channel="output"
gather-channel="gatherChannel">
<scatterer apply-sequence="true">
<recipient channel="distribution1Channel"/>
<recipient channel="distribution2Channel"/>
<recipient channel="distribution3Channel"/>
</scatterer>
<gatherer release-strategy-expression="^[payload gt 5] != null or size() == 3"/>
</scatter-gather>
这是一个复合端点,它结合了发布-订阅
逻辑和一个聚合
函数。当然,它以前可以作为集成流实现,使用现有的publish-subscribe-channel
或recipient-list-router
以及一个aggregator
组件,但是这个新功能为诸如最佳报价
之类的场景提供了更简洁的实现。
Redis队列网关
基于Redis列表
的一对请求-回复
(入站和出站)网关组件已添加到Redis
模块。
<int-redis:queue-outbound-gateway request-channel="sendChannel" queue="foo"/>
<int-redis:queue-inbound-gateway request-channel="requestChannel" queue="foo"/>
Reactor的持久队列
QueueChannel
已更改为允许注入任何Queue<?>
实现。这样做是为了允许在[Reactor] (http://reactor.github.io/reactor/)项目中使用Chronicle-Queue实现。
@Bean QueueChannel queueChannel() {
return new QueueChannel(new PersistentQueueSpec<Message<?>>()
.codec(new JavaSerializationCodec<>())
.basePath("/usr/queuePath")
.get());
}
跳过轮询
使用轮询端点时,有时需要“跳过”轮询,可能是因为某些下游条件可能会导致失败,或者任务执行程序池没有可用的线程。此版本添加了PollSkipAdvice
,可以将其插入轮询程序的advice链中,跳过逻辑基于用户提供的代码。
备注
结论
请参阅此版本的发行说明和项目页面以获取更多信息。有关4.1版本中“新增功能”的完整列表,请参阅参考文档。从早期版本升级的用户应查阅各种迁移指南。
与往常一样,我们非常欢迎贡献。