我在與Apache的駱駝的問題,我無法理解的時候。我已經與JBoss 6.3.0保險絲,捆綁了Apache的駱駝2.17.0.redhat-630224這個問題。不同的行爲,並部署在JBoss中保險絲
我有一個簡單的路由:它從FTP服務器下載文件,將它們轉換爲POJO(這部分工作),然後將它們聚合成單個POJO,然後將其整理並保存到文件中。
在JBoss中開發工作室,我做「爲...>本地駱駝上下文中運行」進行測試。在幕後,這只是運行mvn clean package org.apache.camel:camel-maven-plugin:run
。無論是從IDE執行還是在終端中手動執行,路由都可以正常工作。但是,當我構建一個OSGi包(使用mvn clean install
),然後將它部署到JBoss Fuse(Apache Karaf)中時,應用程序成功部署,下載/轉換部分正常工作,但聚合失敗。
聚集由實現org.apache.camel.processor.aggregate.AggregationStrategy
的自定義類處理(記錄here)。我的問題是,newExchange
參數我收到總有一個空的身體。現在,oldExchange
被空第一次的預期,但newExchange
的身體? (編輯:相關表達式是一個簡單的常量,因爲所有的POJO都聚合在一起)
即使更加冤枉:如果我修改路由來封送聚合器之前的POJO,我收到一個帶有預期數據的String。這證明(我認爲!)這種轉變如預期的那樣發揮作用。此外,Fuse的日誌顯示沒有錯誤信息(無論是在部署時還是在運行時)。這看起來很像配置或依賴性問題,但在我的生活中,我無法在任何地方找到任何類似的問題。
有沒有人見過類似的東西?或者至少,你有什麼技巧可以解決問題的根源嗎?
編輯:這裏的路徑的相關部分:
<choice>
// one <when> per file which produces a POJO
<when id="_when_some_xml">
<simple>${file:onlyname} == 'something.xml'</simple>
<to id="_to2" uri="ref:transform_something_xml"/>
</when>
</choice>
// if I add a marshalling here, I receive non-null exchanges in the aggregator... but they're strings and not the POJOs I want.
<aggregate completionSize="12" id="_aggregate_things"
strategyMethodAllowNull="true" strategyRef="MyAggregator">
<correlationExpression>
<constant trim="false">true</constant>
</correlationExpression>
<log id="_log_things_aggregated" message="Data aggregated."/>
<convertBodyTo id="_convertBodyTo_anotherClass" type="net.j11e.mypackage.MyClass"/>
// [...] next: marshal and save to file
注:我試着用strategyMethodAllowNull =「假」,並沒有改變任何事情。
而這裏的聚合:
public class EpgAggregator implements AggregationStrategy {
@Override
public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
// first message being aggregated: no oldExchange, simply keep the message
if (oldExchange == null) {
System.out.println("Old exchange is null");
return newExchange;
}
if (newExchange.getIn().getBody(MyClass.class) == null) {
System.out.println("newExchange body is null");
}
// ...
第二if
觸發每一次,即使是第一次聚集,如果我在第一if
刪除return
。
編輯 好的,所以感謝noMad17n的評論下面,我有一個突破:問題與類加載有關。
當我拿到newExchanges
的身體沒有指定一個類(Object newBody = newExchange.getIn().getBody();
),結果還是不爲空,但我不能強制轉換爲MyClass
:我得到了java.lang.ClassCastException: net.j11e.MyClass cannot be cast to net.j11e.MyClass
。
閱讀關於OSGi如何導致多個類加載器加載同一個班級,我改名MyClass
到MyOtherClass
和重啓(??)後,一切正常。但是,卸載我的軟件包並重新安裝後,問題又回來了。
osgi:find-class MyClass
返回兩個包:mine和dozer-osgi,這是(我猜)邏輯,因爲MyClass實例是由一個推土機轉換產生的。
好的,也許我不應該經常卸載並重新安裝捆綁包,而是使用osgi:update
,osgi:refresh
或其他什麼。但是,仍然應該有一種方法來完成這項工作?除了卸載我的軟件包,刷新/更新推土機,停止/重新啓動Fuse,並重新安裝我的軟件包,希望上述操作之一以某種方式使得正確的類被加載之外還有其他的東西嗎?
的cusom類是正在部署我相信同捆的一部分?你如何進行部署? –
@SoucianceEqdamRashti是的,自定義聚合器在捆綁中。我可以檢查通過檢查行家所產生的神器 - 也因爲爲System.out.println我把在集合方法的調用出現在我登錄時的應用程序運行;) – j11e
是您在您的熔斷器安裝駱駝出現不到2.16 ? –