Я использую Список получателей для инициализации 30+ файлов с заголовком, прежде чем записывать данные в эти файлы на последующих шагах.( edit ) Я разбил файл примерно на 30 файлов по заданному полю, эти новые файлы должны иметь тот же заголовок, что и исходный файл.Заголовки и разделение по типу являются требованиями приложения, которое будет использовать файлы.
Наличие более 30 разделенных запятыми полных путей к файлам в одной строке приводит к ошибке StackOverflow при попытке верблюдаразобрать строку.Я решил это (на данный момент), увеличив размер стека.
Но должно быть более надежное решение, может быть, я могу как-то использовать относительные пути к файлам?
( edit ) Код:
@Component
public class SplitterRoutesBuilder extends SpringRouteBuilder {
@Autowired
private ApplicationConfig configuration;
@Autowired
private MyFileFormat fileFormat;
@Override
public void configure() throws Exception {
from(configuration.getFrom())
.to("bean:splitFileByProductType?method=initialize(*)")
// split file
.split(body().tokenize(fileFormat.getLineEnd())).streaming().to("bean:splitFileByProductType?method=processLine(*)")
.recipientList(header(SplitFileByProductType.WRITE_FILENAME_HEADER))
.end();
}
}
Затем в SplitFileByProductType:
public void processLine(Exchange exchange) throws EmptyLineException {
String line = exchange.getIn().getBody(String.class);
String originalFileName = (String) exchange.getIn().getHeader(ORIGINAL_FILENAME_HEADER);
// various checks and errorhandling omitted for clariry
setoutputFileExchangeHeader(exchange, values[index].trim(), originalFileName, leftOversFileName);
exchange.getIn().setBody(line + fileFormat.getLineEnd());
}
Фактическая работа выполняется здесь:
private void setoutputFileExchangeHeader(Exchange exchange, String product, String originalFileName, String leftOversFileName) {
if (isProductType(product)) {
// a regular line, write to appropriate file
exchange.getIn().setHeader(WRITE_FILENAME_HEADER,
fileNameFormatter.getProductFileDestination(originalFileName, product));
} else if (PRODUCT_COLUMN_NAME.equals(product)) {
// this is the header line, write the header to all files
exchange.getIn().setHeader(WRITE_FILENAME_HEADER, getAllFileNames(originalFileName, leftOversFileName));
} else {
// product not regognized, line goes to 'rest'
exchange.getIn().setHeader(WRITE_FILENAME_HEADER, leftOversFileName);
}
}