2017-12-06 5 views
0

ファイルで始まるフローがあります:inbound-endpointはzipファイルを正常に解凍します。 XMLファイルの1つまたは複数が、解凍変換の結果として生成されます(コンポーネントが書きました)。その後、ZIPファイルは削除されます。もう1つのフローは、というファイルから開始されました。インバウンドエンドポイントはXMLファイルの読み取りを開始し、読み取ったファイルをロックします。現在のファイルの処理が完了すると、ファイルはのautoDelete = trueでも削除されません。以下は、構成と対応するJavaクラスです。 RedHat LinuxにはESB ESB 3.3.2があります。 プロセスはWindowsマシンで正常に動作し、xmlファイルは処理されると削除されますZuleファイルから抽出されたファイルは、Muleファイルインバウンドによって削除されません

ラバ構成スニペット以下である:

<file:connector name="zipInput" readFromDirectory="/some/directory/input" streaming="false" workFileNamePattern="xyz-*.zip" autoDelete="true" pollingFrequency="30000"/> 

<file:connector name="inputXML" readFromDirectory="some/directory/output" streaming="false" workFileNamePattern="*.xml" autoDelete="true" pollingFrequency="30000"/> 

<flow name="unzipFlow" processingStrategy="synchronous"> 
    <file:inbound-endpoint connector-ref="zipInput" path="/some/directory/input"> 
    </file:inbound-endpoint> 

    <transformer ref="unzipfileTransformer"/>  
</flow> 

<flow name="process_xml_files" processingStrategy="synchronous">            
    <file:inbound-endpoint connector-ref="inputXML" path="/some/directory/output"/> 

    <file:file-to-string-transformer/> 
    <transformer ref="MyFileToSomeObjectTransformer"/> 

    <vm:outbound-endpoint path="some.service" exchange-pattern="request-response"/> 
    <exception-strategy ref="CatchExceptionStrategy" doc:name="Reference Exception Strategy" /> 
</flow> 

public class UnzipTransformer extends AbstractMessageTransformer { 

    private String inboundDirectory; 
    private String outboundDirectory; 


    @Override 
    public Object transformMessage(MuleMessage message, String outputEncoding) 
      throws TransformerException { 

     byte[] buffer = new byte[2048]; 
     Object payload = message.getPayload(); 

     InputStream is = null; 

     if (payload instanceof InputStream) { 
      is = (InputStream) payload; 

     } else if (payload instanceof byte[]) { 
      is = new ByteArrayInputStream((byte[]) payload); 
     } else { 
      throw new RuntimeException("Unknown payload type: " + payload.getClass().getName()); 
     } 

     ZipInputStream zipInput = new ZipInputStream(is); 
     ZipEntry entry = null; 
     InputStream result = null; 
     try { 
      while ((entry = zipInput.getNextEntry()) != null) { 
       String fileNname = entry.getName(); 

       if (fileNname.endsWith(".txt")) continue; 
       File file = new File(outboundDirectory + File.separator + fileNname); 

         FileOutputStream fOutput = new FileOutputStream(file); 
         int count = 0; 
         while ((count = zipInput.read(buffer)) > 0) { 
          // write to the file output stream 
          fOutput.write(buffer, 0, count); 
         } 

         fOutput.flush(); 
         fOutput.close(); 
      } 
      zipInput.closeEntry(); 
      entry = zipInput.getNextEntry(); 
      zipInput.close(); 

     } catch (IOException e) { 

      e.printStackTrace(); 
     } finally { 
     } 
     return result; 
    } 
} 

任意の助けを大幅に高く評価されるだろう。

+0

ポーリングを60000に増やして確認してください。 – star

+0

'私はMule ESB 3.3.2を持っています。あなたのMuleバージョンはひどく古くなっています。最近のバージョンに更新する必要があります。 –

+0

デバッグログを有効にし、MuleがあなたのXMLファイルをポーリングして(そしてここにログを投稿する)なぜそれらが削除されていないかによって、追加の詳細が表示されることがあります。他のプロセスがまだそれを使用している可能性があります。 –

答えて

0

なぜ起こっているのかわからない場合は、linuxファイルの権限で問題が発生する可能性があります。中間ファイルの場所を最初にzipのソースを使用してから中間のフォルダを使用して、解凍したファイルを読み込んでダンプして、自動修正するように設定できますか?これは、あなたには、より多くの明確な振る舞いを提供します。 可能であれば、最新バージョンのmuleでフローを確認してください。また、Anypointのunzippトランスフォーマーを使用してフローを簡素化するなどの別の方法を使用することもできます。次に、通常のファイルコネクタを使用して、ファイルを自動削除で読み取ってから、ファイルを処理します。これにより、明快さも提供されます。 圧縮圧縮解除フローのスナップショットを添付して試してみよう compressed/uncompressed flow

関連する問題