2015-03-18 2 views
0

Я пытаюсь написать большой файл в конечную точку исходящего файла в муле. Мое требование - прочитать большой файл, преобразовать его с помощью java-трансформатора и записать его в конечную точку исходящего файла. Я не могу использовать datamapper, и моя логика преобразования сложна. Трансформатор работает нормально, но он не кажется потоковым. Пожалуйста suggest.Below мой пример кода:Написание больших файлов в mule

Flow:

<spring:beans> 
      <spring:bean id="responseTransformer" scope="prototype" 
       class="my.streaming.StreamTransformer"> 
      </spring:bean> 
    </spring:beans> 
    <file:connector name="File" autoDelete="false" 
     streaming="true" validateConnections="true" doc:name="File" /> 
    <flow name="mystreamflow"> 
      <file:inbound-endpoint path="C:\mylocation" 
       responseTimeout="10000" doc:name="File" connector-ref="File" 
       pollingFrequency="1000" />  
     <logger message="OUTPUT:#[payload]" level="INFO" doc:name="Logger" /> 
     <file:outbound-endpoint path="C:\output" 
      outputPattern="output.txt" responseTimeout="10000" doc:name="File" 
      transformer-refs="responseTransformer" connector-ref="File" /> 
    </flow> 

Java трансформатор:

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

     InputStream is = (InputStream) message.getPayload(); 
     InputStreamReader isr = new InputStreamReader(is); 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     BufferedWriter bw = null; 
     try { 
      bw = getWriter(bos); 
      while (isr.read() > 0) { 
       //transform and write 
       bw.write("writing something"); 
       bw.flush(); 
       System.out.println("Writing something....."); 

      } 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } finally { 

      try { 
       bos.close(); 
       if (bw != null) { 
        bw.close(); 
       } 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     return bos.toByteArray(); 

    } 

private BufferedWriter getWriter(ByteArrayOutputStream bos) 
      throws IOException { 

     BufferedWriter bw = null; 

     try { 

      BufferedOutputStream bo = new BufferedOutputStream(bos); 
      bw = new BufferedWriter(new OutputStreamWriter(bo, "UTF-8")); 

     } catch (IOException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 

     return bw; 

    } 

ответ

1

Ваш трансформатор возвращает массив байтов, а не в InputStream, таким образом, это а не потоковый трансформатор. Это сгорит память и вызовет проблемы с очень большими файлами.

Вам необходимо переписать свой трансформатор, чтобы он возвращал InputStream.

РЕДАКТИРОВАТЬ - Исследовать либо:

  1. Piped входных/выходных потоков для подключения выхода потокового вашей трансформации к PipedInputStream трансформатора возвращается к Mule. Остерегайтесь потоковой передачи: вам нужно будет выполнить код записи PipedOutputStream в рабочем элементе, переданном менеджеру работы Mule.
  2. Создание собственного InputStream подкласса, который постепенно производит преобразованные результаты, постепенно считывая входящие InputStream.
+0

Thanks David. Можете ли вы поделиться любым примером кода, чтобы сделать это PLZ. – rst

+0

Нет, но я добавил дополнительные подсказки в свой ответ. –

+0

Еще раз спасибо Давиду. – rst

Смежные вопросы