对于最新稳定版本,请使用 Spring Integration 7.0.0spring-doc.cadn.net.cn

使用协议适配器

目前展示的所有示例都展示了 DSL 如何通过使用 Spring Integration 编程模型支持消息传递架构。 然而,我们还没有真正实现任何整合。 这样做需要通过HTTP、JMS、AMQP、TCP、JDBC、FTP、SMTP等访问远程资源,或访问本地文件系统。 Spring Integration 支持所有这些以及更多功能。 理想情况下,DSL应为所有这些软件提供一流的支持,但实现这些并跟上Spring Integration新适配器的加入是一项艰巨的任务。 因此,预计DSL会不断赶上春季集成。spring-doc.cadn.net.cn

因此,我们提供了高级 API,以无缝定义协议特定的消息传递。 我们用工厂和建造者模式以及lambda来实现这一点。 你可以把工厂类看作“命名空间工厂”,因为它们在具体协议专用的 Spring Integration 模块中,扮演着与 XML 命名空间相同的角色。 目前,Spring Integration Java DSL 支持AMQP,饲料,JMS,文件,(S)FTP,http,JPA,MongoDb,TCP/UDP,邮件,网络流脚本命名空间工厂。 以下示例展示了如何使用其中三个(AMQP,JMS邮件):spring-doc.cadn.net.cn

@Bean
public IntegrationFlow amqpFlow() {
    return IntegrationFlow.from(Amqp.inboundGateway(this.rabbitConnectionFactory, queue()))
            .transform("hello "::concat)
            .transform(String.class, String::toUpperCase)
            .get();
}

@Bean
public IntegrationFlow jmsOutboundGatewayFlow() {
    return IntegrationFlow.from("jmsOutboundGatewayChannel")
            .handle(Jms.outboundGateway(this.jmsConnectionFactory)
                        .replyContainer(c ->
                                    c.concurrentConsumers(3)
                                            .sessionTransacted(true))
                        .requestDestination("jmsPipelineTest"))
            .get();
}

@Bean
public IntegrationFlow sendMailFlow() {
    return IntegrationFlow.from("sendMailChannel")
            .handle(Mail.outboundAdapter("localhost")
                            .port(smtpPort)
                            .credentials("user", "pw")
                            .protocol("smtp")
                            .javaMailProperties(p -> p.put("mail.debug", "true")),
                    e -> e.id("sendMailEndpoint"))
            .get();
}

前面的例子展示了如何使用“命名空间工厂”作为内联适配器声明。 不过,你也可以从@Bean定义以实现集成流程方法链更易读。spring-doc.cadn.net.cn

我们正在征求社区对这些命名空间工厂的反馈,再考虑其他工厂。 我们也非常感谢任何关于优先支持哪些适配器和网关的建议。

你可以在本参考手册的各协议章节中找到更多Java DSL示例。spring-doc.cadn.net.cn

所有其他协议通道适配器都可以配置为通用豆,并接线到集成流程,如下示例所示:spring-doc.cadn.net.cn

@Bean
public QueueChannelSpec wrongMessagesChannel() {
    return MessageChannels
            .queue()
            .wireTap("wrongMessagesWireTapChannel");
}

@Bean
public IntegrationFlow xpathFlow(MessageChannel wrongMessagesChannel) {
    return IntegrationFlow.from("inputChannel")
            .filter(new StringValueTestXPathMessageSelector("namespace-uri(/*)", "my:namespace"),
                    e -> e.discardChannel(wrongMessagesChannel))
            .log(LoggingHandler.Level.ERROR, "test.category", m -> m.getHeaders().getId())
            .route(xpathRouter(wrongMessagesChannel))
            .get();
}

@Bean
public AbstractMappingMessageRouter xpathRouter(MessageChannel wrongMessagesChannel) {
    XPathRouter router = new XPathRouter("local-name(/*)");
    router.setEvaluateAsString(true);
    router.setResolutionRequired(false);
    router.setDefaultOutputChannel(wrongMessagesChannel);
    router.setChannelMapping("Tags", "splittingChannel");
    router.setChannelMapping("Tag", "receivedChannel");
    return router;
}