Spring 集成提供了一个 API 和配置,用于与在同一应用程序上下文中声明的 Apache Camel 端点进行通信。
您需要将此依赖项包含在项目中:
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-camel</artifactId>
<version>6.0.0</version>
</dependency>
Spring Integration 和 Apache Camel 实现了企业集成模式,并提供了一种方便的方法来编写它们,但这些项目使用不同的方法来实现它们的 API 和抽象。 Spring 集成完全依赖于 Spring Core 的依赖注入容器。 它使用许多其他Spring项目(Spring Data,Spring AMQP,Spring for Apache Kafka等)来实现其通道适配器。 它还将抽象用作开发人员在编写集成流时需要注意的一等公民。 另一方面,Apache Camel不提供消息通道的一等公民抽象,而是建议通过内部交换来编写其路由,隐藏在API中。 此外,它需要一些额外的依赖项和配置才能在 Spring 应用程序中使用。MessageChannel
即使对于最终的企业集成解决方案来说,如何实现其部分并不重要,开发人员的经验和高生产力也会被考虑在内。 因此,开发人员可能会出于多种原因选择一个框架而不是另一个框架,或者如果某些目标系统支持存在差距,则两者兼而有之。 Spring Integration 和 Apache Camel 应用程序可以通过许多外部协议相互交互,它们为其实现了通道适配器。 例如,Spring 集成流可以将一条记录发布到 Apache Kafka 主题,该主题由消费者端的 Apache Camel 端点使用。 或者,Apache Camel路由可能会将数据写入SFTP文件的目录中,该文件由Spring Integration的SFTP入站通道适配器轮询。 或者,在同一个 Spring 应用程序上下文中,它们可以通过抽象进行通信。ApplicationEvent
为了使开发过程更容易,并避免不必要的网络跃点,Apache Camel提供了一个模块,通过消息通道与Spring Integration进行通信。 所需要的只是从应用程序上下文中引用 来发送或使用消息。 当 Apache Camel 路由是消息流的发起者并且 Spring 集成仅作为解决方案的一部分发挥支持作用时,这非常有效。MessageChannel
为了获得类似的开发人员体验,Spring Integration 现在提供了一个通道适配器来调用 Apache Camel 端点,并可以选择等待回复。 没有入站通道适配器,因为从 Spring 集成 API 和抽象的角度来看,订阅 a 以使用 Apache Camel 消息就足够了。MessageChannel
Apache Camel 的出站通道适配器
这是一个实现,可以在单向(默认)和请求-答复模式下工作。 它使用 a 发送(或发送和接收)到 . 交互模式可以通过该选项进行控制(可以在运行时通过 SpEL 表达式根据请求消息进行评估)。 目标 Apache Camel 端点可以显式配置,也可以配置为要在运行时评估的 SpEL 表达式。 否则,它将回退到 . 可以提供一个内联的显式组件,而不是指定端点,例如调用 Spring 集成中不支持通道适配器的 Apache Camel 组件。CamelMessageHandler
AbstractReplyProducingMessageHandler
org.apache.camel.ProducerTemplate
org.apache.camel.Endpoint
ExchangePattern
defaultEndpoint
ProducerTemplate
LambdaRouteBuilder
此外,可以提供(默认实现),以确定在 Spring 集成和 Apache Camel 消息之间映射哪些标头。 默认情况下,将映射所有标头。HeaderMapper<org.apache.camel.Message>
CamelHeaderMapper
支持模式调用和生成用于回复处理(如果有)的模式。CamelMessageHandler
async
ProducerTemplate.asyncSend()
CompletableFuture
可以通过 SpEL 表达式进行自定义,该表达式的计算结果必须为 .exchangeProperties
Map
如果未提供 ,则通过从应用程序上下文解析的 Bean 创建该 bean。ProducerTemplate
CamelContext
@Bean
@ServiceActivator(inputChannel = "sendToCamel")
CamelMessageHandler camelService(ProducerTemplate producerTemplate) {
CamelHeaderMapper headerMapper = new CamelHeaderMapper();
headerMapper.setOutboundHeaderNames("");
headerMapper.setInboundHeaderNames("testHeader");
CamelMessageHandler camelMessageHandler = new CamelMessageHandler(producerTemplate);
camelMessageHandler.setEndpointUri("direct:simple");
camelMessageHandler.setExchangePatternExpression(spelExpressionParser.parseExpression("headers.exchangePattern"));
camelMessageHandler.setHeaderMapper(headerMapper);
return camelMessageHandler;
}
对于 Java DSL 流定义,可以使用工厂提供的一些变体配置此通道适配器:Camel
@Bean标签:集成,Camel,Spring,Support,Apache,适配器,通道 From: https://blog.51cto.com/u_15326439/5920838
IntegrationFlow camelFlow() {
return f -> f
.handle(Camel.gateway().endpointUri("direct:simple"))
.handle(Camel.route(this::camelRoute))
.handle(Camel.handler().endpointUri("log:com.mycompany.order?level=WARN"));
}
private void camelRoute(RouteBuilder routeBuilder) {
routeBuilder.from("direct:inbound").transform(routeBuilder.simple("${body.toUpperCase()}"));
}