抢占先机
VMware 提供培训和认证,以加速您的进度。
了解更多我们很高兴地宣布 Spring Integration 1.0 Milestone 3 的 Java DSL 已经发布。 请使用 Maven 或 Gradle 的 Milestone 仓库,下载分发包,或查看项目主页以获取更多信息。
自上次Milestone 2以来,此 Milestone 包含了一些新特性和进一步的改进,以及一些错误修复,GA 版本预计在 10 月底发布。
首先感谢所有对 Spring Integration Extension 感兴趣,提供反馈,分享想法甚至做出贡献的人。
以下是主要变更的摘要
Spring Integration 4.1
当前 Milestone 提供了与 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。 您可以使用值为 IMMEDIATE
或 MIXED
的 spring.expression.compiler.mode
系统属性来启用 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
。
特定协议的适配器
在这个里程碑中,引入了几个新的特定协议的 Namespace factories
: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,因此我们为您完成了这项工作,并提供了函数式接口来从 Lambdas 构建 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 改进的信息。