2014-10-02 67 views
1

我試圖找到一種方法來配置一個駱駝端點,它使用一個spring bean,它在駱駝上下文中從路由中的端點聲明引用,但它不起作用。替代長URI來配置Spring Bean的駱駝端點?

例如,有時使用多個參數定義端點URI非常可怕(!!),那麼使用bean及其屬性配置端點會更容易。 (或者甚至更好的是,當用XML配置端點時,或者元素應該有像常規bean那樣的子元素,我們可以在其中配置端點的參數)。

下面的第一種方法運作良好,非常標準,非常簡單。第二種方法是我想要使用的方法,但它不起作用。我嘗試了許多變化,但沒有成功!事實上,下面的第三種選擇對駱駝開發者來說只是一個有趣的提議,但它也說明了我的觀點。

在我下面的示例中,我只爲文件端點配置了3個參數,但想象一下帶有10個參數的URI!我的問題是如何讓我的第二種方法正常工作,我確定有一個簡單的解決方案!?我也試過使用一個工廠bean和一個工廠方法,但它沒有工作。

1)配置XML駱駝端點(春豆)標準方式:

... 
<camel:camelContext id="camelContext" > 

    <camel:route id="deviceDataLogsPoller" > 
     <camel:from uri="file://long/path/to/input?preMove=../inprogress&amp;move=../done&amp;moveFailed=../error" /> 

     <camel:log message="Input device data file read from file in input folder {{im.filePoller.folder.input}}." loggingLevel="INFO" /> 

    </camel:route> 
</camel:camelContext> 

2)的替代方案,我預計會的Valide但不工作(對我來說):

<bean id="filePoller" class="org.apache.camel.component.file.FileEndpoint" > 

    <property name="camelContext" ref="camelContext" /> 
    <property name="localWorkDirectory" value="/long/path/to/input" /> 
    <property name="preMove" value="../inprogress" /> 
    <property name="move"  value="../done" /> 
    <property name="moveFailed" value="../error" /> 
    ... 
</bean> 

... 
<camel:camelContext id="camelContext" > 

    <camel:route id="deviceDataLogsPoller" > 
     <camel:from ref="filePoller" /> 

     <camel:log message="Input device data file read from file in input folder {{im.filePoller.folder.input}}." loggingLevel="INFO" /> 

    </camel:route> 
</camel:camelContext> 

3)替代,這將是在未來的有趣上述兩個備選方案)之間(混合:

...

<camel:route id="deviceDataLogsPoller" > 
     <camel:from uri="file://long/path/to/input" > 
      <property name="preMove" value="../inprogress" /> 
      <property name="move"  value="../done" /> 
      <property name="moveFailed" value="../error" /> 
      ... 
     </camel:from> 

     <camel:log message="Input device data file read from file in input folder {{im.filePoller.folder.input}}." loggingLevel="INFO" /> 

    </camel:route> 
</camel:camelContext> 

回答

1

究竟有什麼不適合你?

下面的設置做了工作按預期:

<bean id="filePoller" class="org.apache.camel.component.file.FileEndpoint"> 
    <property name="file" value="src/data/bean-ref" /> 
    <property name="move" ref="moveExpression"/> 
</bean> 

<bean id="moveExpression" class="org.apache.camel.model.language.SimpleExpression"> 
    <constructor-arg value="${file:parent}/.done/${file:onlyname}" /> 
</bean> 

<camelContext xmlns="http://camel.apache.org/schema/spring" id="camelContext"> 
    <route> 
     <from ref="filePoller" /> 
     <log message="${body}" /> 
    </route> 
</camelContext> 

注:

  • 酒店file是強制性
  • 性能movemoveFailedpreMovejava.lang.String類型但鍵入org.apache.camel.Expression並且必須相應地進行初始化。
  • 屬性moveExpression需要一個完整的文件表達式。如果僅使用.done而不是${file:parent}/.done/${file:onlyname},則該文件將重命名爲.done,而不會移至名爲.done的目錄。
+0

是的,這是行得通的,但是此刻您添加了一些屬性來設置參數,它們並不總是以正確的方式工作,或者如同它們被指定爲URI參數一樣。例如,如果我使用'move'屬性和一個SimpleExpression類型的bean作爲值(而不是字符串)來指定'move'參數,那麼一切都會啓動,但輸入文件夾中的文件不能移動到'移動'文件夾,因爲它期待一個文件而不是一個文件夾(顯然,根據異常消息)。 – The4Summers 2014-10-03 15:55:13

+0

@ The4Summers你是對的,它不以同樣的方式工作。我添加了一個'moveExpression'示例來展示如何正確處理這個問題。 – 2014-10-03 18:33:08

+0

是的,我可以使它工作,但這種方法終究比簡單地使用URI更加複雜和繁重!有一種方法來配置端點會更有趣,就像我在上面第三種替代方法中提出的那樣。也許如果我有時間,我會嘗試創建我自己的「from」和「to」標籤,它們將通過從params元素構造完整的URI來包裝現有的標籤...!我也可以向駱駝開發者提出這個建議。謝謝。 – The4Summers 2014-10-03 18:40:40

0

正如我上一條評論所述,我能夠爲端點工作制作bean配置(請參閱上面的註釋),但這種方法終究比簡單地使用URI更加複雜和繁重!

有一種配置端點的方式會更有趣,就像我在上面第三種替代方法中提出的那樣。也許如果我有時間的話,我會嘗試創建我自己的和標籤,通過從params元素構造完整的URI來包裝現有的標籤...!我也可以向駱駝開發者提出這個建議。

請參見下面的怎麼可能是有趣的,在未來配置的端點的例子(或與XML包裝我想代碼):

<camel:route id="deviceDataLogsPoller"> 

    <camel:from uri="file://long/path/to/input" > 

     <param name="preMove" value="../inprogress" /> 
     <param name="move"  value="../done" /> 
     <param name="moveFailed" value="../error" /> 
     ... 
    </camel:from> 

    ... 

</camel:route> 

不幸的是,如上所示的端點配置暫時不可能,但我認爲這將是一件好事!目前,唯一的方法是將所有參數指定爲非常長的URI中的參數,或者將端點配置爲常規bean,並且具有它所隱含的所有複雜性(請參閱上面的註釋以獲取詳細信息)。