领先一步
VMware 提供培训和认证,以加速您的进步。
了解更多我们很高兴地宣布 Spring Integration 1.0 里程碑版本 3 的 Java DSL 已发布。请使用 Maven 或 Gradle 的 里程碑版本仓库,下载 发行版归档文件,或查看项目的 主页 以获取更多信息。
自上次 里程碑版本 2 以来,此里程碑版本中包含了一些新功能和进一步改进,以及许多错误修复,GA 版本预计将于 10 月底发布。
首先感谢所有对 Spring Integration 扩展感兴趣的人,提供反馈,分享他们的想法,甚至做出贡献。
以下是主要更改的摘要
Spring Integration 4.1
当前里程碑版本与 Spring Integration 4.1 以及 Spring Framework 4.1 兼容。
更改包括
通道名称延迟解析
,这允许 DSL IntegrationFlow
定义仅基于通道名称,并避免需要从一个流到另一个流使用@DependsOn
的解决方法;
(以及它的 DSL) 基于 Spring Messaging 模块时;
.io/spring/docs/current/spring-framework-reference/html/expressions.html#expressions-spel-compilation)。这对 Spring Integration 非常有用,Spring Integration 在运行时广泛使用 SpEL。您可以使用spring.expression.compiler.mode
系统属性(值为IMMEDIATE
或MIXED
)启用 SpEL 编译器。
当然,仍然保持与 Spring Integration 4.0 的兼容性。
IntegrationFlow Lambda
IntegrationFlow
Bean 定义现在也可以表示为Lambda
,以简化 DSL 的使用
@Bean
public IntegrationFlow lambdaFlow() {
return f -> f.filter("World"::equals)
.transform("Hello "::concat)
.handle(System.out::println);
}
实际上,我们只是将IntegrationFlow
变成一个带有单个方法define(IntegrationFlowDefinition<?> flow)
的函数式接口,并且IntegrationFlowBeanPostProcessor
只是将该“伪”Bean 转换为基于隐式IntegrationFlowBuilder
的真实StandardIntegrationFlow
。唯一的限制是,这种定义基于一个具有lambdaFlow.input
Bean 名称的隐式DirectChannel
。
协议特定适配器
在此里程碑版本中,引入了几个新的协议特定的命名空间工厂
:Files
、(S)Ftp
和Mail
。一些关于它们用法的简单示例
@Autowired
private DefaultFtpSessionFactory ftpSessionFactory;
@Bean
public IntegrationFlow ftpInboundFlow() {
return IntegrationFlows
.from(Ftp.inboundAdapter(this.ftpSessionFactory)
.preserveTimestamp(true)
.remoteDirectory("ftpSource")
.regexFilter(".*\\.txt$")
.localFilenameGeneratorExpression("#this.toUpperCase() + '.a'")
.localDirectory(new File("tmp")),
e -> e.id("ftpInboundAdapter"))
.channel(MessageChannels.queue("ftpInboundResultChannel"))
.get();
}
@Bean
public IntegrationFlow tailFlow() {
return IntegrationFlows
.from(Files.tailAdapter(new File(tmpDir, "TailTest"))
.delay(500)
.end(false))
.channel(MessageChannels.queue("tailChannel"))
.get();
}
@Bean
public IntegrationFlow imapIdleFlow() throws AddressException {
return IntegrationFlows
.from(Mail.imapIdleAdapter("imap://user:[email protected]:993/INBOX")
.searchTermStrategy((f, l) ->
new AndTerm(new FromTerm(new InternetAddress("bar@baz")),
new FlagTerm(new Flags(Flags.Flag.SEEN), false)))
.javaMailProperties(p -> p
.put("mail.debug", "true")
.put("mail.imap.connectionpoolsize", "5"))
.shouldReconnectAutomatically(true))
.enrichHeaders(s -> s.headerExpressions(h -> h
.put(MailHeaders.SUBJECT, "payload.subject")
.put(MailHeaders.FROM, "payload.from[0].toString()")))
.channel(MessageChannels.queue("imapIdleChannel"))
.get();
}
支持添加
正如您在最后一个IMAP
示例中注意到的,.javaMailProperties()
和.enrichHeaders()
具有流畅的语法,可以将Properties
和Map<String, String>
指定为内联对象。不幸的是,Java 没有为这些简单类提供Builder
API,因此我们为您做到这一点,并提供函数式接口以从 Lambda 构建Properties
和Map
。例如,Mail.headers()
提供了一个MailHeadersBuilder
- MapBuilder
的扩展,它也可以在.enrichHeaders()
中使用
@Bean
public IntegrationFlow sendMailFlow() {
return f -> f.enrichHeaders(Mail.headers().subject("foo").from("foo@bar").to("bar@baz"))
.handle(Mail.outboundAdapter("smtp.gmail.com")
.credentials("user", "pw")
.protocol("smtp")));
}
当然,这等同于 XML 配置中的<int-mail:header-enricher>
。
总结
您可以从它们的 源代码 获取有关这些类和现有类的更多信息。
我们期待您尽快提供您的意见和反馈(StackOverflow(spring-integration
标签)、Spring JIRA、GitHub),并在我们发布 GA 版本之前报告您发现的问题(大约几个月后)。
SpringOne 2GX 2014
明天将在 SpringOne 上介绍其中一些主题。请参加 [Gary Russell 的会议] (https://2014.event.springone2gx.com/schedule/sessions/spring_integration_java_configuration_and_more.html),以了解有关这些主题以及过去 12 个月添加的其他 Spring Integration 改进的更多信息。