Apache Camel 支援
Spring Integration 提供 API 和設定,以與在相同應用程式環境定義中宣告的 Apache Camel 端點進行通訊。
您需要將此依賴項包含到您的專案中
-
Maven
-
Gradle
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-camel</artifactId>
<version>6.3.5</version>
</dependency>
compile "org.springframework.integration:spring-integration-camel:6.3.5"
Spring Integration 和 Apache Camel 實作企業整合模式,並提供一種方便的方式來組合它們,但這些專案在其 API 和抽象實作中使用了不同的方法。Spring Integration 完全依賴 Spring Core 的依賴注入容器。它使用許多其他 Spring 專案(Spring Data、Spring AMQP、Spring for Apache Kafka 等)作為其通道適配器實作。它還使用 MessageChannel
抽象作為一級公民,開發人員在組合其整合流程時需要注意這一點。另一方面,Apache Camel 不提供訊息通道的一級公民抽象,而是建議透過隱藏在 API 後面的內部交換來組合其路由。此外,它還需要一些額外的 依賴項和設定,才能在 Spring 應用程式中使用它。
即使最終企業整合解決方案的各個部分如何實作並不重要,但開發人員體驗和高生產力仍然被考慮在內。因此,開發人員可能會因為許多原因選擇一個框架而不是另一個框架,或者如果某些目標系統支援存在差距,則可能會同時選擇兩者。Spring Integration 和 Apache Camel 應用程式可以透過許多外部協定相互交互,它們為這些協定實作了通道適配器。例如,Spring Integration 流程可能會將記錄發布到 Apache Kafka 主題,該主題由消費者端的 Apache Camel 端點使用。或者,Apache Camel 路由可能會將資料寫入 SFTP 檔案目錄,該目錄由 Spring Integration 的 SFTP 輸入通道適配器輪詢。或者,在同一個 Spring 應用程式環境定義中,它們可以透過 ApplicationEvent
抽象 進行通訊。
為了簡化開發流程並避免不必要的網路跳躍,Apache Camel 提供了一個 模組,以透過訊息通道與 Spring Integration 進行通訊。所需的只是一個對應用程式環境定義中 MessageChannel
的參考,以發送或使用訊息。當 Apache Camel 路由是訊息流程的啟動者,而 Spring Integration 僅作為解決方案的一部分發揮支援作用時,這非常有效。
為了獲得類似的開發人員體驗,Spring Integration 現在提供了一個通道適配器來呼叫 Apache Camel 端點,並可選擇等待回覆。沒有輸入通道適配器,因為從 Spring Integration API 和抽象的角度來看,訂閱 MessageChannel
以使用 Apache Camel 訊息就足夠了。
Apache Camel 的輸出通道適配器
CamelMessageHandler
是一個 AbstractReplyProducingMessageHandler
實作,可以在單向(預設)和請求-回覆模式下工作。它使用 org.apache.camel.ProducerTemplate
將訊息發送(或發送和接收)到 org.apache.camel.Endpoint
。交互模式可以由 ExchangePattern
選項控制(可以在執行階段針對請求訊息透過 SpEL 運算式進行評估)。目標 Apache Camel 端點可以顯式設定,也可以作為 SpEL 運算式在執行階段評估。否則,它會回退到 ProducerTemplate
上提供的 defaultEndpoint
。除了指定端點之外,還可以提供內聯的顯式 LambdaRouteBuilder
,例如,為了呼叫 Spring Integration 中沒有通道適配器支援的 Apache Camel 元件。
此外,可以提供 HeaderMapper<org.apache.camel.Message>
(CamelHeaderMapper
是預設實作),以確定要在 Spring Integration 和 Apache Camel 訊息之間對應哪些標頭。預設情況下,所有標頭都會被對應。
CamelMessageHandler
支援 async
模式,呼叫 ProducerTemplate.asyncSend()
並產生用於回覆處理的 CompletableFuture
(如果有的話)。
exchangeProperties
可以透過 SpEL 運算式自訂,該運算式必須評估為 Map
。
如果未提供 ProducerTemplate
,則會透過從應用程式環境定義中解析的 CamelContext
bean 建立它。
@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
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()}"));
}