2013-04-23 11 views
6

Chcę, aby przepływ gdzie:Mule ESB - dwa pliki jako wejście (czekać na obu)

  1. czeka na dwa pliki: file_name.xdf i file_name.dff: jeśli oba pliki (Chcę przetwarzać dwa pliki w tym samym czasie (oczekiwanie na obu), nazwa pliku z tych plików Powinni być takie same)
  2. proces te pliki przekonwertować do tablicy bajtów
  3. prowadzony Groovy skrypt

Jak mogę sprawić, że pierwszy punkt?

+0

Mam do czynienia z podobną sytuacją. Ciekawe, jak to rozwiązałeś –

Odpowiedz

0

Użycie składnika kwarcowego - uruchom przepływ w żądanym przedziale. Przeczytaj więcej na ten temat: http://www.mulesoft.org/documentation/display/current/Quartz+Transport+Reference

Po uruchomieniu - napisz kod Java, który porównuje dwa katalogi i znajdzie pary plików między tymi dwoma.

Poza tym nie jestem pewien, czy istnieje sposób dynamicznego ustawienia filtra plików przychodzących. W przeciwnym razie - zawsze można obsłużyć cały proces w Javie; przeczytaj pliki, przekonwertuj na tablicę bajtów, na końcu rozprowadź wiadomość na groovy.

0

Możesz mieć dwa przychodzące pliki końcowe, po jednym dla każdego z plików, na które czekasz. Kiedy twój przepływ odczytuje pliki, kopiuje plik do innego katalogu. Jeśli drugi plik został już przetworzony i przeniesiony do katalogu (możesz śledzić to za pomocą zmiennej w składnicy obiektów), zapiszesz nazwę name.ready i przeniesiesz poprzednio przeniesiony plik do name2.ready.

Masz trzeci przepływ z docelowym końcem pliku, który odczytywany jest z tego katalogu przy użyciu * .ready wzoru wieloznacznego. A następnie użyj Requester Module, aby załadować drugi plik do zmiennej.

+0

Wiem, że to nie jest eleganckie rozwiązanie. –

2

Można agregować pliki na podstawie ich "nazwy podstawowej" (tj. Pobrać nazwę pliku bez rozszerzenia), a następnie przetwarzać każdy plik w zestawie zbiorczym.

Agregacja może być wykonywana przy użyciu kolekcji Agregatora lub niestandardowym Agregatora, tu przykład dla każdego z nich:

Korzystanie z kolekcji Agregatora:

<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> 


stosując Custom-Aggregator (wymagana niestandardowa klasa Java):

<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> 

Jest to możliwa implementacja niestandardowego agregatora (może być bardziej elegancka:

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(); 
      } 
     }; 
    } 
}