È 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();
}
};
}
}
Sono di fronte a una situazione simile. Curioso come l'hai risolto? –