Tomcat не может найти существующие классы - PullRequest
1 голос
/ 12 декабря 2011

У меня есть две виртуальные машины с, казалось бы, одинаковой конфигурацией (созданные из одного и того же шаблона виртуальной машины, и различие в папке Tomcat не дало никакой разницы, кроме конфигурации имени хоста).На обеих машинах развернуты одни и те же веб-приложения.

Одна машина работает нормально.На другом компьютере я получаю ошибки, потому что классы не найдены.Я перезапустил tomcat 3 раза, и всегда получаю разные ошибки, также в разных приложениях.Одна из таких ошибок заключается в следующем:

java.lang.NoClassDefFoundError: org/springframework/web/context/request/ServletRequestAttributes
    org.springframework.web.context.request.RequestContextListener.requestInitialized(RequestContextListener.java:64)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
    org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291)
    org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:776)
    org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:705)
    org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:898)
    org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
    java.lang.Thread.run(Thread.java:662)

В каждом случае этой ошибки до сих пор отсутствующий класс (например, ServletRequestAttributes) находится в том же банке, что и класс, который нуждается в нем (например, RequestContextListener).

Я использую CentOS, Apache 2.2.3, Tomcat 6.0.30 и Oracle JDK 1.6.0_24 на обеих машинах.Tomcat сконфигурирован с большим количеством кучи и разрешенного пространства (также идентичных на обеих машинах).


Похоже, что Tomcat 6 "теряющих" классов в рабочей среде является аналогичной проблемой, нопока без решения.

Одной из возможных названных здесь проблем является «возможно, вы достигли максимального числа дескрипторов открытых файлов в ОС».Имея базовые знания Linux, мне удалось выполнить некоторые команды, найденные в Интернете, которые говорят мне, что

  • max файловых дескрипторов 6815744 на обеих машинах (cat /proc/sys/fs/file-max),
  • currentпри сбое - 10710, на правильной машине - 10200 (cat /proc/sys/fs/file-nr), максимальное количество дескрипторов файлов
  • на процесс - 1024 (ulimit -n),
  • текущее использование Tomcat - 641сбой и 686 на правильной машине (lsof -p <TOMCAT-PID> | wc -l).

ОБНОВЛЕНИЕ: Я перезапустил сбой Tomcat и сразу открыл все приложения в браузере.Использование файлов Tomcat продолжалось до 1926 года. Теперь я вижу ошибку NoClassDefFoundError почти в каждом приложении, и я также вижу это сообщение в одном файле журнала:

2011-12-12 18:38:36,225 ERROR [TP-Processor3] [rplansecurity] org.jasig.cas.client.validation.Cas20ServiceTicketValidator java.net.SocketException: Too many open files
java.net.SocketException: Too many open files
    at java.net.Socket.createImpl(Socket.java:397) ~[na:1.6.0_24]

Я сделал то же самое для правильного Tomcat, иэто тоже не удалось.Похоже, что здесь нет никакой разницы в двух машинах: обе они открывают слишком много файлов.

1 Ответ

4 голосов
/ 12 декабря 2011

Превышено максимальное количество открытых файлов - это моя первая мысль.Я также думаю, что 'ulimit -n' показывает максимальное количество файловых дескрипторов на пользователя, а не на процесс, но я могу ошибаться.Имейте в виду, что Tomcat может работать и под другим пользователем.

Я бы попытался запустить tomcat с параметром -verbose: class, чтобы увидеть, какие классы и откуда загружаются, чтобы узнать, есть ли какие-либосвоего рода образец там.

...