#multithreading #apache-camel
#многопоточность #apache-camel
Вопрос:
В моем текущем проекте все URI конечных точек camel передаются через org.apache.commons.codec.net.URLCodec.encode()
Первоначальные разработчики больше не работают в компании, и я понятия не имею, почему они это сделали.
Есть ли какая-либо веская причина для этого? Я нигде раньше этого не видел.
Теперь настоящая причина, почему я спрашиваю об этом. У нас есть маршрут, который (после упрощения) выглядит следующим образом:
from("direct:start")
.split(getFilesToProcess()).parallelProcessing().threads(3, 3)
.pollEnrich("file:///data/inbox?fileName=" encode("${body.fileName}") "amp;move=" encode("../.done/${in.header.CamelFileName.substring(0,6)}/${date:now:yyyyMM}/${file:onlyname}"))
.to("direct:processFile");
Этот код ведет себя очень странно при кодировании параметров в URI файла. Когда несколько файлов обрабатываются параллельно: pollEnrich
компонент начинает смешивать файлы, которые передаются через ${body.fileName}
, или даже извлекать один и тот же файл несколько раз.
Когда я удаляю кодировку URL для параметров, я никогда не вижу, чтобы pollEnricher подбирал неправильные файлы. Таким образом, похоже, что комбинация использования pollEnrich()
в parallelProcessing()
блоке с URLCodec.encode()
вызывает какую-то небезопасную проблему с потоками в исходном коде camel.
Мы используем camel версии 2.21.5
Комментарии:
1. Оказывается, проблемы с параллелизмом были вызваны классом URLCodec, который не является потокобезопасным (по крайней мере, не в версии 1.9, которую я использовал). Однако, даже с commons-codec-1.14 (проблема с потоками исправлена в 1.11), у меня все еще возникают неправильные файлы, если я кодирую параметр fileName =${body.fileName}
2.
encode
метод вызывается только один раз на этапе настройки. Он просто создает строку один раз, и Camel использует эту строку, поэтому нет места для небезопасных операций. Я думаю, что ваш коллега каким-то образом нашел с помощью двойного кодирования хакерский способ суперперехода опции безопасностиjailStartingDirectory
🙂 . По умолчанию Apache Camel запрещает перемещение файла за пределы начального каталога. Попробуйте удалить всю двойную кодировку и добавитьjailStartingDirectory=false
Ответ №1:
Смотрите здесь, в документах Camel
При настройке параметров конечной точки с использованием синтаксиса URI, значения по умолчанию кодируются в URI
Когда вы их тоже кодируете, они кодируются дважды. Я думаю, что это может быть проблемой, когда закодированный символ содержит символы, которые кодируются повторно. Я весьма удивлен, что у вас нет никаких проблем из-за этого.
Кодировка Camel по умолчанию также является причиной того, что существует необработанная функция для передачи значений в исходной форме, потому что кодировка уничтожила бы их (например, пароли).
Комментарии:
1. Оказывается, что выражение ${в.header. CamelFileName.substring(0,6)} в опции перемещения не работает без (двойного) кодирования.