[英]Apache Camel how to add/remove endpoints dynamically from a route
我試圖熟悉EIP和Apache Camel,但我有一個用例,我不確定如何使用Camel來表達或實現。
用例:
想象一下,您已經設計了一個集成解決方案,該解決方案可以從ftp獲取文件,進行一些處理並將其上傳到隊列中。 您選擇了Apache Camel來實現此解決方案,並且您在Java DSL中的路由如下所示:
from("ftp://user@hostname/directoryname")
.process(new Processor() {
public void process(Exchange exchange) throws Exception
{
//my fantastic prosessing goes here
}
}).to("jms:queue:queueName");
路線可能比這復雜得多,但這並不重要。 想象一下,您的解決方案取得了巨大的成功,以至於計划實施一項服務,任何人都可以添加他的ftp服務器並處理文件並將其上傳到隊列中。 所以你想要的是
讓我們忘記#2並關注“靈活性”部分。
所以問題是,我想:
如何動態(在運行時)向Apache Camel路由添加端點或從中刪除端點?
到目前為止,我認為:
首先,我承認我對集成模式不是很熟悉,但是只是掃描目錄,唯一可以滿足要求的就是Content Enricher 。 它可以傳遞消息,然后轉到其他地方然后帶走其他東西。 所以我在想,如果有人添加ftp服務器,則連接詳細信息可以封裝在消息中,然后Content Enricher可以連接到該ftp服務器並獲取文件並通過路由將其進一步推送...。一個能夠連接到多個ftp服務器的Content Enricher 。 首先,我不認為這是該模式背后的意圖,其次,由於Camel中有ftp 組件 ,因此我應該可以在這種情況下使用它
第二種方法是像使用vm組件那樣將路由分成兩部分,如下所示:
from("ftp://user@hostname/directoryname").to("vm:internalQ");
from("vm:internalQ")
.process(new Processor() {
public void process(Exchange exchange) throws Exception
{
//my fantastic prosessing goes here
}
}).to("jms:queue:queueName");
因此,現在,我可以使用寫入到該內部隊列的ftp端點創建許多路由,以便可以將其拾取。 動態地將路由添加到CamelContext似乎是可行的( 在Java運行時添加駱駝路由 )。 那是路要走嗎? 還是我只是想以一種並非旨在使用的方式使用Camel ?
您可以動態地將路由添加到CamelContext
:
MyRouteBuilder trb = new MyRouteBuilder(servletEndpoint, mockEndpoint);
camelContext.addRoutes(trb);
和MyRouteBuilder:
MyRouteBuilder(Endpoint servletEndpointStart, MockEndpoint mockEndpointEnd, String allowedParameters){
this._servletEndpoint = servletEndpointStart;
this._mockEndpoint = mockEndpointEnd;
}
@Override
public void configure() throws Exception {
from(this._servletEndpoint)
.id(TESTING_ROUTE_NAME)
.process(new Processor(){ // some processor })
.to(_mockEndpoint);
}
您也可以修改路由,但是為了使它正常運行,您需要重新啟動它,並在以下位置檢查其完成方式: org.apache.camel.model.RouteDefinition.adviceWith(ModelCamelContext, RouteBuilder)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.