2015-07-13 207 views
0

我試圖從一個目錄中選擇一個文件,拆分一個文件並將每個拆分的行添加到activemq。在這個過程中,我遇到了異常處理的問題。比方說目錄中的文件是一個二進制文件(可執行文件),然後拆分器會丟棄org.apache.camel.RuntimeCamelException和java.nio.charset.MalformedInputException異常。如果發生這種情況,那麼我需要捕獲這些異常,沒有什麼應該添加到activemq中,並且只有特定的線程應該在記錄異常之後退出。在線提及並編寫了以下代碼,但不知道如何停止添加到activemq並退出特定的線程。異常處理駱駝

<route id="msg_producer"> 
     <from uri="input.file.from" /> 
     <doTry> 
     <split parallelProcessing="true" executorServiceRef="msgProducer" 
      streaming="true"> 
      <tokenize token="\n"></tokenize> 
      <to uri="input.activemq.to" /> 
     </split> 
     <doCatch> 
      <exception>org.apache.camel.RuntimeCamelException</exception> 
      <exception>java.nio.charset.MalformedInputException</exception> 
       <handled> <constant>true</constant></handled> 
       <setBody> 
        <simple>${exception.stacktrace}</simple> 
       </setBody> 
       <setHeader headerName="CamelFileName"> 
        <simple>${file:onlyname.noext}_error.log</simple> 
       </setHeader> 
     </doCatch> 
     </doTry> 
    </route> 
+0

您可以在分離器上使用stopOnException選項 –

+0

儘管更清潔的解決方案可能是過濾文件,而不是嘗試拆分並將其發送到AMQ if它是一個二進制文件。 –

+0

謝謝克勞斯,但過濾文件將太難選擇,因爲目錄可以具有不同擴展名的可執行文件,圖像,腳本等文件。此外,我無法獲得有關區分可打印ascii文件和二進制文件的幫助。 –

回答

1

爲@claus易卜生說過濾文件,讓你挑基礎上的延伸和一些標準的模式是這樣的

<bean id="FileFilter" class="org.apache.camel.component.file.AntPathMatcherGenericFileFilter"> 
    <!--  ? matches one character 
       * matches zero or more characters 
       ** matches zero or more directories in a path --> 
    <property name="includes" value="#{databaseProperties.getProperties().getProperty('file.name.pattern')}"/> 
    <!-- if you wan to exclude specific files say bad in name or .exe files. Use comma to separate multiple excludes --> 
    <!-- <property name="excludes" value="**/*bad*,**/*.exe"/> --> 
    </bean> 

和你file.name只有文件,您可以使用FileFilter屬性.pattern可以是這樣的**/contract.csv