|
对于最新稳定版本,请使用 Spring Integration 7.0.0! |
使用协议适配器
目前展示的所有示例都展示了 DSL 如何通过使用 Spring Integration 编程模型支持消息传递架构。 然而,我们还没有真正实现任何整合。 这样做需要通过HTTP、JMS、AMQP、TCP、JDBC、FTP、SMTP等访问远程资源,或访问本地文件系统。 Spring Integration 支持所有这些以及更多功能。 理想情况下,DSL应为所有这些软件提供一流的支持,但实现这些并跟上Spring Integration新适配器的加入是一项艰巨的任务。 因此,预计DSL会不断赶上春季集成。
因此,我们提供了高级 API,以无缝定义协议特定的消息传递。
我们用工厂和建造者模式以及lambda来实现这一点。
你可以把工厂类看作“命名空间工厂”,因为它们在具体协议专用的 Spring Integration 模块中,扮演着与 XML 命名空间相同的角色。
目前,Spring Integration Java DSL 支持AMQP,饲料,JMS,文件,(S)FTP,http,JPA,MongoDb,TCP/UDP,邮件,网络流和脚本命名空间工厂。
以下示例展示了如何使用其中三个(AMQP,JMS和邮件):
@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定义以实现集成流程方法链更易读。
| 我们正在征求社区对这些命名空间工厂的反馈,再考虑其他工厂。 我们也非常感谢任何关于优先支持哪些适配器和网关的建议。 |
你可以在本参考手册的各协议章节中找到更多Java DSL示例。
所有其他协议通道适配器都可以配置为通用豆,并接线到集成流程,如下示例所示:
@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;
}