Tomcat 8.5 слишком долго распознает новый контент

У меня следующая проблема, я пишу файл Excel в C:\Tomcat85\webapps\MyWebApp\Excel\myExcel.xls.

Как только мое Java-приложение заканчивает запись файла, оно выполняет загрузку, чтобы пользователь мог с ним работать. Это дает неприятную ошибку 404.

Если я подожду несколько секунд и перезагружу страницу, она будет загружаться нормально (или добавить пятисекундный сон в java, это работает так же).

Итак, я пришел к выводу, что Tomcat требуется 5 секунд, чтобы распознать, что этот новый файл Excel существует, и только тогда он может его обслужить.

Есть ли способ заставить Tomcat выполнять эту задачу быстрее? Возможно, используя некоторую конфигурацию в web.xml, чтобы по-разному обрабатывать эту папку «/Excel/».

Windows 10 64 бит, Tomcat 8.5, Java 7 (можно попробовать java8, но я не думаю, что это будет иметь значение).

Некоторый код:

new ExcelExport(remoteHandle, context).execute( outFileName, outMessage);
// Thread.sleep(5000);
httpContext.wjLoc = formatLink(outFileName);
  • sleep комментируется или раскомментируется в зависимости от теста. Без сна получаю 404, со сном через 5 секунд работает нормально.
  • httpContet.wjLoc просто выполняет загрузку, как ссылку на файл.

Wiriting работает нормально, так как я вижу его готовым и доступным для записи в проводнике, но если я попытаюсь открыть его по URL-адресу, я получу тот же 404.


person Federico Alvarez    schedule 30.06.2017    source источник
comment
Можете ли вы опубликовать пример кода? В вашем коде может быть некоторая утечка, вызывающая задержку   -  person Anupama Boorlagadda    schedule 30.06.2017
comment
Просто добавил немного кода, надеюсь, это поможет! И спасибо за ваш интерес.   -  person Federico Alvarez    schedule 30.06.2017


Ответы (1)


Resources кэшируются по умолчанию. Время в миллисекундах между повторной проверкой записей кэша определяется параметром cacheTtl, ссылка на который содержится в данная документация. По умолчанию его значение равно 5 секундам.

Если вы хотите отключить кеш, просто установите cachingAllowed на false.

person Italo Borssatto    schedule 30.06.2017
comment
Спасибо Итало, я попробовал вашу идею, но она не сработала. Я добавил /META-INF/context.xml, а внутри: ‹Context cacheTTL=1›‹/Context›. Затем удалил рабочую папку и перезапустил tomcat. Результат тот же 404. Также пробовал с cachingAllowed=false, но без изменений. Что заставляет меня думать, так это то, что я не хочу отключать кеш или уменьшать его TTL, я хочу, чтобы он был доступен быстрее. Любые другие мысли? Еще раз спасибо, Федерико. - person Federico Alvarez; 30.06.2017
comment
@FedericoAlvarez Элемент Context не имеет параметров cacheTTL и cachingAllowed. Элемент Resources имеет. Элемент Resources МОЖЕТ быть вложен в компонент Context. Если у вас нет элемента Resources, добавьте его. Как <Context><Resources cachingAllowed="false" /></Context>. - person Italo Borssatto; 30.06.2017
comment
Спасибо Итало! Он работал нормально! При этом: <Context><Resources cacheTtl="1"></Resources></Context>. Теперь я должен спросить: есть ли у этого производительность? Потому что ресурсы не будут кэшироваться (я установил TTL равным 1), верно? Каков ваш опыт? Еще раз спасибо, Федерико. - person Federico Alvarez; 30.06.2017
comment
Это принесет проблемы, если файлы сильно загружены. В этом случае я предлагаю вам использовать это решение только в экстренных ситуациях. Для долгосрочных решений реализуйте Filter, чтобы получить файлы так, как вы хотите. Если к файлам обращаются редко, я бы не стал тратить время на внедрение фильтра. Выбирайте, что лучше в вашем случае. Я всегда предпочитаю простой, прежде чем столкнуться с реальной проблемой. - person Italo Borssatto; 30.06.2017
comment
Хорошо, еще раз спасибо. Я только что прочитал этот Фильтры Tomcat, но не могу понять, какой из них использовать, должно ли это быть что-то связанное с ExpiresFilter? Не могли бы вы указать мне правильное направление? - person Federico Alvarez; 30.06.2017
comment
Как вы думаете, ваши файлы будут загружаться более одного раза каждые пять секунд? Если это документ, подобный файлу Excel, я так не думаю. Я бы не стал тратить на это время, просто если бы это действительно было загружено, как изображения, которые являются частью вашей веб-страницы. Файл, который загружается время от времени, не нуждается в кеше на Tomcat. А поставить кеш перед Tomcat можно с помощью Apache или Ngnx. - person Italo Borssatto; 30.06.2017
comment
Конечно, я вижу, что использование Apache возможно, но в настоящее время мы этого не делаем, и, например, файлы JS и CSS, используемые в приложении Tomcat, обслуживаются через Tomcat. И они не будут кэшироваться. Есть ли возможное решение этого? Где Tomcat кэширует статический контент, но может обслуживать новый контент по запросу (возможно, в определенной папке). - person Federico Alvarez; 30.06.2017
comment
Я никогда этого не делал, но вы можете расширить класс org.apache.catalina.WebResourceRoot и передать его в параметр className элемента Resources. - person Italo Borssatto; 30.06.2017
comment
Большое спасибо Italo за то, что уделили столько времени моей проблеме, но я думаю, что это становится слишком сложным для чего-то, что должно быть действительно простым: служить файлу, если он там. Будет продолжать попытки. Спасибо еще раз! - person Federico Alvarez; 30.06.2017
comment
В итоге я добавил следующую строку в /META-INF/context.xml: «‹Resources antiResourceLocking=false cachingAllowed=false /›». Мне все еще нужно оглянуться на недостатки этого. Большое спасибо Итало. - person Federico Alvarez; 17.04.2018