2012-02-17 58 views
1

我想實現以下種類配器與CAMEL:駱駝Apache:我可以使用retryWhile重新發送請求嗎?

  1. 客戶端發送一個HTTP POST請求駱駝
  2. CAMEL發送HTTP POST請求外部端點(服務器)
  3. 外部服務器回覆一個200 OK
  4. CAMEL發送HTTP GET請求到外部端點(服務器)
  5. 外部服務器回覆

在步驟5之後,我想檢查回覆:如果回覆是200 OK並且state = INPROGRESS(該狀態可以從接收到的XML主體中檢索),那麼我想要將HTTP GET重新傳輸到外部端點直到狀態與INPROGRESS不同。

我想使用retryWhile語句,但我不知道如何在路由中構建例程。 例如,爲了檢查答覆是否爲200 OK並且state = INPROGRESS,我可以很容易地引入一個謂詞。所以retryWhile已經變得像:

.retryWhile(Is200OKandINPROGRESS)

,但我應該在哪裏把它的路由,這樣HTTP GET將被重新傳輸?

如:(僅取第4和第5到賬戶)

from("...") 
    // here format the message to be sent out 
    .to("external_server") 
     // what code should I write here ?? 
     // something like: 
     //  .onException(alwaysDo.class) 
     //   .retryWhile(Is200OKandINPROGRESS) 
     //   .delay(2000) 
     //  .end() 
     // or maybe it should not be here ?? 

我也有點糊塗了「alwaysDo.class」應該怎麼樣子? 或...我應該使用完全不同的東西來解決這種編排問題嗎? (我只是想重新發送,只要我得到一個200 OK與INPROGRESS狀態...)

在此先感謝您的幫助。

回答

2

關於CAMEL Nabble,有人回答我的問題。退房:

http://camel.465427.n5.nabble.com/Camel-Apache-can-I-use-a-retryWhile-to-re-send-a-request-td5498382.html

通過使用循環語句,我直到我收到了來自不同INPROGRESS的狀態重新發送HTTP GET請求。狀態檢查需要使用選擇語句放入循環語句中。所以像這樣的事:

.loop(60) 
     .choice() 
     .when(not(Is200OKandINPROGRESS)).stop() // if state is not INPROGRESS, then stop the loop 
    .end() // choice 
     .log("Received an INPROGRESS reply on QueryTransaction ... retrying in 5 seconds") 
     .delay(5000) 
     .to(httpendpoint") 
    .end() //loop 
+0

實際上,當你使用.stop()時,它會停止wh ole路線,這可能是不希望的。成像是這樣的: '從( 「直接:富」)。爲了 ( 「直接:噓」) .process(someProcessor());' '從( 「直接:噓」) .loop( 100) .choice() 。當(stopPredicate())停止() .END() .END() .process(someOtherProcessor());' 的.stop()將導致,即someProcessor()和someOtherProcessor()將不會被調用。這可能是不可取的。 – Slimer 2014-11-12 14:26:48

0

我從來沒有嘗試過你在做什麼,但似乎看起來不正確。 在您顯示的代碼中,只有在引發alwaysDo異常時纔會發生重試。

您引用的alwaysDo.class應該是您期望處理的Java異常類的名稱。有關更多詳細信息,請參閱http://camel.apache.org/exception-clause.html

這個想法應該是打電話並檢查響應內容,然後根據狀態屬性進行CBR。重新調用GET或終止/繼續路由。

+0

嗨奧利弗,已經感謝您的答覆。使用CBR和再次調用GET的問題是,我不知道我需要多少次這樣做......我只是想要這樣做,直到我得到與INPROGRESS不同的響應...一種「do而「其實... – opstalj 2012-02-17 15:29:41

+0

幾乎忘了提及:我目前做了一種'dummy'alwaysDo.class,這樣我總是會得到例外......我可能在那裏也是錯誤的。對不起,我在這裏編程的時候是一個新手... – opstalj 2012-02-17 15:33:20

+0

在我看來,這就是你可以用CBR()做的事情,因爲它允許你根據你的交換內容(或屬性)執行一個動作,你可以檢查state屬性,如果state = INPROGRESS,則再次執行GET;如果狀態爲!= INPROGRESS,則繼續執行。如果服務器不可用(例如避免無限循環),則希望有其他條件退出循環真的看到你在alwaysDo課堂上放了什麼,你能提供嗎? – 2012-02-17 15:37:46

0

您可能應該寫信給the Apache Camel mailing list(或通過Nabble)。委員們正在觀察它,並且非常反應。

+0

好的,發佈在Camel nabble上:http://camel.465427.n5.nabble.com/Camel-Apache-can-I-use -a-retryWhile-to-re-send-a-request-td5498382.html – opstalj 2012-02-20 07:31:49

+0

我想我對OnException的使用也完全錯了......因爲我在這裏沒有真正的例外......(對不起,但我不是一個真正的Java程序員:()...只是想知道是否沒有其他方式來輪詢服務器,直到我得到另一個國家比INPROGRESS ... – opstalj 2012-02-20 13:58:01

+0

這也是我的想法。 do是一個do ... while循環,也許你可以使用循環模式(http://camel.apache.org/loop.html),它允許你重複一個動作直到滿足給定條件(使用非複製模式)。你可以在每次迭代時執行HTTP GET並測試狀態以決定是否需要再次迭代。 – 2012-02-20 21:59:18