2013-04-23 11 views
6

Voglio fare un flusso in cui:Mule ESB - due file come input (aspettare per entrambi)

  1. attesa di due file: file_name.xdf e file_name.dff: se entrambi i file (voglio processare due file nello stesso tempo (in attesa di entrambi), il nome del file di questi file shoud essere lo stesso)
  2. processo quei file convertire in array di byte
  3. esecuzione dello script Groovy

Come posso fare la primo punto?

+0

Sono di fronte a una situazione simile. Curioso come l'hai risolto? –

risposta

0

Utilizzo di un componente al quarzo - attiva il flusso all'intervallo desiderato. Per ulteriori informazioni, consultare: http://www.mulesoft.org/documentation/display/current/Quartz+Transport+Reference

All'attivazione, scrivere codice Java che confronta le due directory e trova coppie di file tra i due.

In cima alla mia testa, non sono sicuro se c'è un modo per impostare dinamicamente un filtro di file in entrata. Altrimenti, si potrebbe sempre gestire l'intero processo in Java; leggere i file, convertire in array di byte, infine propagare il messaggio sullo script groovy.

0

È possibile avere due endpoint di file in entrata, uno per ciascuno dei file che si aspettano. Quando il flusso legge i file, copia il file in un'altra directory. Se l'altro file è già stato elaborato e spostato nella directory (è possibile tracciare questo utilizzando una variabile in un archivio oggetti) si salva con name.ready e si sposta il file precedentemente spostato in name2.ready.

Si dispone di un terzo flusso con un endpoint di file in entrata che legge da tale directory utilizzando il modello jolly * .ready. Quindi utilizzare Requester Module per caricare l'altro file in una variabile.

+0

So che non è una soluzione elegante. –

2

È possibile aggregare i file in base al loro "nome di base" (ad esempio, prendere il nome del file senza l'estensione) e quindi elaborare ciascun file nel set aggregato.

cumulo potrebbe essere eseguita utilizzando un insieme aggregatore o personalizzata aggregatore, qui un esempio per ciascuno:

Utilizzando una collezione aggregatore:

<flow name="two-files-per-process-with-collection-aggregator"> 
    <file:inbound-endpoint path="/file-in" moveToDirectory="/file-in-process" responseTimeout="10000" doc:name="Read files" > 
     <file:filename-regex-filter pattern=".*\.aaa|.*\.bbb" caseSensitive="true"/> 
    </file:inbound-endpoint> 
    <set-property propertyName="MULE_CORRELATION_ID" value="#[message.inboundProperties.originalFilename.substring(0,message.inboundProperties.originalFilename.lastIndexOf('.'))]" doc:name="Set Correlation-Id"/> 
    <set-property propertyName="MULE_CORRELATION_GROUP_SIZE" value="2" doc:name="Set Correlation-Group-Size"/> 
    <collection-aggregator failOnTimeout="true" doc:name="Collection Aggregator"/> 
    <foreach doc:name="For Each"> 
     <logger message="#[message.inboundProperties.originalFilename]" level="INFO" doc:name="Some process"/> 
    </foreach> 
</flow> 


Utilizzando una Custom-Aggregator (è necessaria una classe java personalizzata):

<flow name="two-files-per-process-with-custom-aggregator"> 
    <file:inbound-endpoint path="/file-in" moveToDirectory="/file-in-process" responseTimeout="10000" doc:name="Read files"> 
     <file:filename-regex-filter pattern=".*\.aaa|.*\.bbb" caseSensitive="true"/> 
    </file:inbound-endpoint> 
    <custom-aggregator failOnTimeout="true" class="org.mnc.MatchFileNames" doc:name="Custom Aggregator"/> 
    <foreach doc:name="For Each"> 
     <logger message="#[message.inboundProperties.originalFilename]" level="INFO" doc:name="Some process"/> 
    </foreach> 
</flow> 

E questa è una possibile implementazione per l'aggregatore personalizzato (potrebbe essere più elegante:

package org.mnc; 

import org.mule.api.MuleContext; 
import org.mule.api.MuleEvent; 
import org.mule.api.routing.RoutingException; 
import org.mule.routing.AbstractAggregator; 
import org.mule.routing.EventGroup; 
import org.mule.routing.correlation.EventCorrelatorCallback; 

public class MatchFileNames extends AbstractAggregator { 

    @Override 
    protected EventCorrelatorCallback getCorrelatorCallback(final MuleContext muleContext) { 
     return new EventCorrelatorCallback() { 

      @Override 
      public boolean shouldAggregateEvents(EventGroup events) { 
       return events.size()==2; 
      } 

      @Override 
      public EventGroup createEventGroup(MuleEvent event, Object id) { 
       String filename = event.getMessage().getInboundProperty("originalFilename"); 
       String commonFilename = filename.substring(0, filename.lastIndexOf('.')); 
       System.out.println(filename + " -> " + commonFilename); 
       return new EventGroup(commonFilename, muleContext, 2, true, storePrefix); 
      } 

      @Override 
      public MuleEvent aggregateEvents(EventGroup events) throws RoutingException { 
       return events.getMessageCollectionEvent(); 
      } 
     }; 
    } 
} 
Problemi correlati