LINUX.ORG.RU

tomcat7 bigbluebutton javax.xml.parsers.SAXParserFactory

 , ,


0

1

Есть работающий bigbluebutton сервер. API реализовано на tomcat7

В ходе разборок с одной проблемой выяснилось, что один запрос API дает кучу запросов к несуществующим файлам

grep ENOENT | sort | uniq -c

    125 stat("/META-INF/services/javax.xml.parsers.SAXParserFactory", 0x7f55024e1000) = -1 ENOENT (No such file or directory)
      8 stat("/META-INF/services/javax.xml.parsers.SAXParserFactory", 0x7f55024e1530) = -1 ENOENT (No such file or directory)
    125 stat("/usr/share/bbb-web/META-INF/services/javax.xml.parsers.SAXParserFactory", 0x7f55024e1000) = -1 ENOENT (No such file or directory)
      8 stat("/usr/share/bbb-web/META-INF/services/javax.xml.parsers.SAXParserFactory", 0x7f55024e1530) = -1 ENOENT (No such file or directory)
    125 stat("/usr/share/bbb-web/WEB-INF/classes/META-INF/services/javax.xml.parsers.SAXParserFactory", 0x7f55024e1000) = -1 ENOENT (No such file or directory)
    125 stat("/usr/share/bbb-web/WEB-INF/classes/META-INF/services/javax.xml.parsers.SAXParserFactory", 0x7f55024e1030) = -1 ENOENT (No such file or directory)
      8 stat("/usr/share/bbb-web/WEB-INF/classes/META-INF/services/javax.xml.parsers.SAXParserFactory", 0x7f55024e1530) = -1 ENOENT (No such file or directory)
      8 stat("/usr/share/bbb-web/WEB-INF/classes/META-INF/services/javax.xml.parsers.SAXParserFactory", 0x7f55024e1560) = -1 ENOENT (No such file or directory)
    125 stat("/usr/share/bbb-web/WEB-INF/META-INF/services/javax.xml.parsers.SAXParserFactory", 0x7f55024e1000) = -1 ENOENT (No such file or directory)
      8 stat("/usr/share/bbb-web/WEB-INF/META-INF/services/javax.xml.parsers.SAXParserFactory", 0x7f55024e1530) = -1 ENOENT (No such file or directory)

Можно ли это как-то исправить?

★★★★★

Ответ на: комментарий от jtad

Как это сделать? Я с разработкой приложений на жабе не знаком вообще.

И где его взять? findjar.com дает слишком много ссылок

Максимум, что приходилось делать - подпихивать .jar файл для поддержки постргреса в либеоффисе

vel ★★★★★
() автор топика
Последнее исправление: vel (всего исправлений: 1)
Ответ на: комментарий от vel

ну можно например CLASSPATH показать, можно попробовать просто в уже развернутом progect_name/WEB-INF/lib подкинуть jaxp-api.jar и попробовать перезапустить приложение на томкате или вообще весь томкат. Суть в том что эта большая синяя кнопка не видит нужного кода из нужной jar, вот и все.

anonymous
()
Ответ на: комментарий от vel

https://docs.oracle.com/javase/tutorial/essential/environment/paths.html https://www.mulesoft.com/tcat/tomcat-classpath http://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html

Еще вот это стоит почитать, тогда все станет куда проще.

Ну и по тому как деплоятся приложения на томкат тоже стоит почитать в той же документации по томкату.

anonymous
()
Ответ на: комментарий от anonymous

Осталось найти .jar с эти классом.

Странно, если оно при этом работает, то нафига ему этот класс...

в коде есть только упоминания «SAXParserFactory spf = SAXParserFactory.newInstance();»

Интересно jaxp-api-1.4.5.jar подойдет для этих целей?

vel ★★★★★
() автор топика
Ответ на: комментарий от vel

Ну раз требует зачем-то значит нужен, вообще это jar для разбора xml и работы с ним. Что-то где-то парсит. Я не рассматривал эту синюю кнопку, если исходные тексты есть и это открытое решение можете утянуть проект и посмотреть по исходникам сами где эта фактори потом используется.

anonymous
()

Не вижу проблемы. Простые попытки java.util.ServiceLoader найти реализацию SAX парсера. Там же рядом должен быть успешный stat() для данного файла или поиск в JAR того же (в rt.jar в частности); наверное в районе базовых JAR JDK/JRE.

sanwashere ★★
()
Последнее исправление: sanwashere (всего исправлений: 5)
Ответ на: комментарий от vel

зависит от того как собирается проект. Если через maven то его средствами, если просто из ide, то там в свойствах проекта добавляются dependencies

jtad
()
Ответ на: комментарий от Legioner

Если это можно просто исправить, то лучше исправить, т.к. это лишние запросы к ФС.

Да, при наличии кеша, это небольшая лишняя нагрузка, но если от нее можно избавиться, то лучше избавиться.

vel ★★★★★
() автор топика
Ответ на: комментарий от vel

Вообще это должно идти только первый раз, странно, что оно каждый раз идёт (если я правильно тебя понял). Если оно реально один раз идёт, то ты ерундой страдаешь. Если при каждом запросе - стоит посмотреть в код приложения, возможно там что-то не кешируется, что стоит кешировать.

Legioner ★★★★★
()

Какая версия java? Для старых версий это решалось тем, что в jre/lib/endorsed закидывались jar-ки.

ma1uta ★★★
()

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

FactoryFinder перебирает classpath в поисках дескриптора сервиса, каждый вызов.

Так как, хз какая джава, и какой classpath, и если правда сильно хочется избавиться от этих запросов к ФС (хотя как писали выше, вероятность того что от них проседает производительность стремиться к нулю, это XML тормозит, а не сервис локатор):

  1. Нужно узнать какой реализацией пользуется приложение. Для этого его нужно запустить с system property -Djaxp.debug=true

После этого в stderr будет вываливаться отладочная инфа по jaxp, включая следующе (в моём частном случае):

JAXP: find factoryId =javax.xml.parsers.SAXParserFactory
JAXP: loaded from fallback value: com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl
JAXP: created new instance of class com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl using ClassLoader: null

Кастомного сервиса не нашлось, и джава взяла com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl

  1. Узнав реализацию сервиса, java можно сказать не искать сервис, а брать конкретный
-Djavax.xml.parsers.SAXParserFactory=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl

После этого выхлоп измениться на

JAXP: find factoryId =javax.xml.parsers.SAXParserFactory
JAXP: found system property, value=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl
JAXP: created new instance of class com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl using ClassLoader: null

И java не будет бегать по фс, а брать его из памяти.

  1. stderr блокирующий, а значит на проде под нагрузкой производительность еще сильнее просядет
  2. system properties можно закидывать в catalina.properties
  3. catalina.sh заворачивает sdterr в catalina.out
  4. это всё излишний перфекционизм, и это делать бесполезно
anonymous
()
Ответ на: комментарий от anonymous

Спасибо за подробные пояснения.

Особенно за п.4

vel ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.