2012-08-06 98 views
1

我試圖實現一個mina服務,其中對最終消息的響應應該基於以前的消息。每個消息(頭部(1),數據(n),結束(1))應該接收到一個響應,但是對「結束」消息的響應應該基於「頭部」以及接收到的任何「數據」消息作爲「結束」消息。目前,我將消息路由到一個聚合器,該聚合器在找到特定相關ID的「標題」和「結束」消息時完成。不幸的是,響應在發送給聚合器之前(或同時?)發送,所以我無法訪問聚合消息(其中包含構建正確響應所需的所有數據)建立迴應。在駱駝聚合幾個請求後對MINA請求作出響應

有沒有辦法做到這一點,而無需手動存儲和訪問累積的數據(即,沒有重新實現駱駝的聚合器)?

編輯:

路線是這樣的:

<camelContext> 
    <route> 
     <from uri="mina:..."/> 
     <process ref="messageProcessor"/> 
     <aggregate> 
      <process ref="completeMessageProcessor"/> 
     </aggregate> 
    </route> 
</camelContext> 

我離開了一些標籤和屬性(correlationExpressioncompletionPredicatestrategyRef等)清晰。

郵件正在被合理地收集,並且在「完成」時(即合計時)正在處理它們。但是,通過mina端點發送回客戶端的響應是由messageProcessor生成的響應,而不是由completeMessageProcessor生成的響應。例如(是的,這是一個頗爲人爲的例子,但忍受着我),假設協議涉及客戶端發送一個頭部消息,其中包括它希望發送的數據消息的總數。然後它發送一些數據消息,這些消息的數量可能與預期發送的數量不同。最後,它發送一個頁腳或結束消息。然後服務器應該回應預期的消息數量和消息的實際數量之間的差異。對於寫入的路由,這是不可能的,因爲消息的數量不被messageProcessor所知,其僅處理單個消息。 completeMessageProcessor,具有彙總的消息(由標題,所有數據和結尾組成)確實知道這個數字,但在那一點產生的響應不會傳回到mina端點。

僅當收到整個撰寫郵件時才更改消息的分析以生成消息,因爲服務器必須響應各個消息,所以不是一種選擇。

+0

發表您的路線...不知道你所說的「迴應的意思被髮送之前(或同時?)郵件發送到聚合器...「 – 2012-08-09 04:12:43

回答

1

關閉,我的猜測是messageProcessor正在設置OUT消息,但completeMessageProcessor正在設置IN消息。消費者響應期望/使用OUT消息。

您可以添加一些logging來驗證這一點。如果是這樣的話,那麼你可能會改變你messageProcessor用身體代替(或使用交流頭),並添加您completeMessageProcessor後,基於變換的身體

<transform> 
    <simple>${in.body}</simple> 
</transform> 

看到這個設置OUT體瞭解更多信息:http://camel.apache.org/using-getin-or-getout-methods-on-exchange.html

更新:經過一番討論,真正的問題是,目前聚合只處理「INONLY」交流

+0

就是這樣。謝謝!如果沒有設置OUT消息,並且由於''處理設置了OUT消息(而不是在傳播IN消息時回落)這一事實,我一直在不知不覺中根據駱駝的IN消息傳播默認值。因此,在聚合器正確設置OUT消息之前,我一直使用的''標籤,這就是爲什麼我在那裏得到響應,但不是在聚合器之後。 – Tonio 2012-08-13 18:48:00

+0

真棒...很高興我可以幫助...我已經完成了那麼多次 – 2012-08-13 19:26:29

+0

Hrm。顯然我錯了,它不起作用。發回的響應仍然是'messageProcessor'中計算的響應,而不是'completeMessageProcessor'中的響應,儘管我明確地在那裏設置了OUT消息體。實際上,如果我沒有在'messageProcessor'中設置OUT消息,則返回的響應是'null'。 – Tonio 2012-08-13 20:53:09