#java #tomcat #servlets #url-routing
#java #tomcat #сервлеты #url-маршрутизация
Вопрос:
У меня есть веб-приложение Java, которое передает страницы VXML интерпретатору VXML. В условиях постоянного трафика в тестовой лаборатории Tomcat (6.0.32), похоже, иногда выбирает неправильный сервлет для обработки следующего запроса страницы:
http://localhost/<myapp>/Main.vxml?<some_query_params_that_get_ignored>
Ниже приведен полный список сервлетов, определенных в моем web.xml досье. В соответствии с этим первый сервлет всегда должен обрабатывать указанный выше URL-адрес, но в очень небольшом проценте случаев (менее 0,1% при более чем 100 тыс. запросов в течение выходных) Tomcat перенаправляет его на второй сервлет (CometControllerServlet).
<servlet>
<servlet-name>MainVXML</servlet-name>
<jsp-file>/WEB-INF/jsp/vxml/Main.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>MainVXML</servlet-name>
<url-pattern>/Main.vxml</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ABPAsync</servlet-name>
<servlet-class>com.avaya.cc.aaeplite.web.CometControllerServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ABPAsync</servlet-name>
<url-pattern>/async/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ABP</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ABP</servlet-name>
<url-pattern>/app/*</url-pattern>
</servlet-mapping>
Следующие события в выводе трассировки из самого последнего запуска трафика указывают на время их … несколько разбросаны, поэтому трудно что-либо прочитать.
27 16:29:54.880 ERROR <http-6080-exec-2 > [ite.web.CometControllerServlet] perform() Invalid Request Type: Main.vxml
27 17:36:40.773 ERROR <http-6080-exec-2 > [ite.web.CometControllerServlet] perform() Invalid Request Type: Main.vxml
27 19:08:18.705 ERROR <http-6080-exec-4 > [ite.web.CometControllerServlet] perform() Invalid Request Type: Main.vxml
27 19:19:58.799 ERROR <http-6080-exec-5 > [ite.web.CometControllerServlet] perform() Invalid Request Type: Main.vxml
27 19:49:14.688 ERROR <http-6080-exec-1 > [ite.web.CometControllerServlet] perform() Invalid Request Type: Main.vxml
27 19:49:34.721 ERROR <http-6080-exec-3 > [ite.web.CometControllerServlet] perform() Invalid Request Type: Main.vxml
28 07:15:30.835 ERROR <http-6080-exec-7 > [ite.web.CometControllerServlet] perform() Invalid Request Type: Main.vxml
Оцените любые мысли, которые могут возникнуть у людей о том, почему это происходит.
Комментарии:
1. не могли бы вы ввести фильтр для регистрации URL-адресов, фактически запрошенных в этих запросах?
2. Возможно ли, что относительный URL-адрес в сгенерированном VXML пытается получить доступ
/async/Main.vxml
?3. rsp — я проверил из журналов интерпретатора VXML, что это не так. Gandalf — интерпретатор VXML в любом случае регистрирует эту информацию для меня. Хотя хороший вопрос. Я смотрю, не вызывает ли что-то там у меня проблем. Я забыл при публикации, что URL-адрес запроса также включает часть запроса, которую я игнорирую в настоящее время. Я думаю, что приведенный выше шаблон url должен безопасно обрабатывать это?
4. Гэндальф — я подтвердил, что при возникновении ошибки в URL-адресах запросов нет ничего особенного. Единственное различие в каждом запросе — это строка идентификатора сеанса в конце URL-адреса, которая содержит только шестнадцатеричные символы, поэтому ничего, что могло бы сбить Tomcat с толку.
5. Какой интерпретатор VXML вы используете? Можете ли вы воспроизвести проблему, используя скрипт JMeter для генерации нагрузки?