2014-02-13 4 views
0

들어오는 바이너리 메시지를 받고 VFS를 사용하여 디스크에 저장하려면 WSO2 ESB 4.8.1을 빌드하고 있습니다. Send mediator를 사용하여 메시지를 파일에 저장할 수 있지만 비 차단 메디 에이터이므로 나머지 시퀀스는 동시에 계속됩니다. 이로 인해 파일 저장에 더 많은 시간이 소요되는 큰 파일에 문제가 발생합니다.WSO2 ESB vfs 차단이 가능합니까?

질문 : VFS에 파일을 완전히 저장 한 후 ESB가 시퀀스 처리를 계속할 수 있도록 콜 아웃 조정자 또는 다른 차단 메커니즘을 사용하여 파일을 저장할 수 있습니까? 콜 아웃 조정자를 사용해 보았지만 vfs 엔드 포인트 URL을 지원하지 않습니다. 예 : "vfs : file : /// tmp"

모든 정보 주셔서 감사합니다.

답변

1

데이터를 가져 와서 파일로 스트리밍하는 사용자 지정 클래스 조정자를 만들어 해결했습니다. 수업 중재자가 직업을 마친 후에도 서열은 계속 될 것입니다. 여기

클래스 중재자 코드 :

public class FileSaveMediator extends AbstractMediator { 

    boolean traceOn = false; 
    boolean traceOrDebugOn = false; 


    public boolean mediate(MessageContext context) { 

     traceOn = isTraceOn(context); 
     traceOrDebugOn = isTraceOrDebugOn(traceOn); 

     traceOrDebug(traceOn, "Start : FileSaveMediator"); 

     // Get property "fileuri" from synapse context 
     String fileuri = (String)context.getProperty("fileuri"); 

     SOAPBody body = context.getEnvelope().getBody(); 

      OMText binaryNode = (OMText) (body.getFirstElement()).getFirstOMChild(); 
      DataHandler actualDH; 
      actualDH = (DataHandler) binaryNode.getDataHandler(); 

      FileOutputStream fos = null; 
      try { 
       fos = new FileOutputStream(fileuri); 
       actualDH.writeTo(fos);   

      } catch (Exception e) 
      { 
       e.printStackTrace(); 
      } 

      // Clear Body after saving file by setting dummy tags. 

      try { 
      body.setFirstChild(AXIOMUtil.stringToOM("<p></p>")); 
     } catch (XMLStreamException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } finally { 

      // Finally make sure that fileoutstream is closed 
      if (fos!=null) 
       try { 
        fos.close(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
     } 

     traceOrDebug(traceOn, "End : FileSaveMediator"); 

     return true; 

    }