Spring Integration Java DSL 1.0 Milestone 3 已发布

发布 | Artem Bilan | 2014年9月7日 | ...

我们很高兴地宣布 Spring Integration Java DSL 1.0 Milestone 3 已发布。请使用 Milestone Repository(Maven 或 Gradle)、下载 发行包,或访问项目 主页 获取更多信息。

自上次 Milestone 2 发布以来,此 Milestone 版本包含了一些新功能和进一步的改进,以及大量的 bug 修复。GA 版本预计在十月底左右发布。

首先,感谢所有对 Spring Integration 扩展感兴趣的社区成员,感谢你们提供反馈、分享想法,甚至贡献代码。

以下是主要变更的摘要:

Spring Integration 4.1

当前 Milestone 版本与 Spring Integration 4.1Spring Framework 4.1 兼容。

变更包括:

  • Spring Integration 4.1 提供了 Channel 名称的延迟解析

这使得 DSL IntegrationFlow 的定义可以仅基于通道名称,避免了先前需要通过 @DependsOn 来处理一个流到另一个流的依赖关系;

  • Spring Framework 4.1 在消息传递方面进行了一些性能改进,当 Spring Integration

(以及其 DSL)基于 Spring Messaging 模块时;

.io/spring/docs/current/spring-framework-reference/html/expressions.html#expressions-spel-compilation)。这对于在运行时广泛使用 SpEL 的 Spring Integration 非常有用。您可以通过设置系统属性 spring.expression.compiler.modeIMMEDIATEMIXED 来启用 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 会根据隐式的 IntegrationFlowBuilder 将这个“伪” Bean 转换为真正的 StandardIntegrationFlow。这种定义的唯一限制是,它基于一个名为 lambdaFlow.input 的隐式 DirectChannel

特定协议适配器

在此 Milestone 版本中,引入了几个新的特定协议的 命名空间工厂Files(S)FtpMail。以下是一些简单的使用示例。

@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() 提供了流畅的语法,可以作为内联对象指定 PropertiesMap<String, String>。不幸的是,Java 没有为这些简单类提供 Builder API,因此我们为您完成了这项工作,并提供了函数式接口,通过 Lambda 来构建 PropertiesMap。例如,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>

总结

您可以从其 源代码 中获取有关这些类和现有类的更多信息。

我们期待尽快收到您的评论和反馈(StackOverflowspring-integration 标签)、Spring JIRAGitHub),并在 GA 发布前报告您发现的问题。

SpringOne 2GX 2014

其中一些提到的主题将在明天的 SpringOne 上进行讨论。请参加 [Gary Russell 的演讲] (https://2014.event.springone2gx.com/schedule/sessions/spring_integration_java_configuration_and_more.html),了解更多关于这些以及过去 12 个月内添加的其他 Spring Integration 改进。

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速进步。

了解更多

获得支持

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,只需一份简单的订阅。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看所有