Назад | Перейти на главную страницу

Apache + tomcat + jnlp

У нас есть экземпляр Tomcat за Apache. Мы используем mod_jk.

Конфигурация модуля:

LoadModule jk_module modules/mod_jk.so
<IfModule mod_jk.c>
  JkWorkersFile conf/workers.properties
  JkLogFile     logs/mod_jk.log
  JkLogLevel    info
  JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
</IfModule>

А вот конфиг VirtualHost:

<VirtualHost *:9090>
...
  JkMount  /Web/* worker-Web
  JkMount  /Web worker-Web
</VirtualHost>

Файл worker.properties:

worker.list=worker-Web
worker.worker-omiapWeb.port=8209
worker.worker-omiapWeb.host=localhost
worker.worker-omiapWeb.type=ajp13

Эта конфигурация отлично работает для jsp, html ... но у нас есть файл JNLP:

<?xml version="1.0" encoding="utf-8"?>
  <jnlp spec="1.0" codebase="$$codebase">
    <information>
      <title>Gestor Impresiones</title>
      <vendor>.</vendor>
    </information>
    <resources locale="es">
      <jar href="gestorImpresiones.jar"/>
      <jar href="jasperreports-1.2.5.jar"/>
      <jar href="commons-httpclient-3.1-beta1.jar"/>
      <jar href="commons-logging-1.1.jar"/>
      <jar href="commons-codec-1.3.jar"/>
      <jar href="commons-javaflow-20060411.jar"/>
      <jar href="commons-collections-3.1.jar"/>
      <jar href="poi-3.0.1-FINAL-20070705.jar"/>
      <jar href="jdic.jar"/>
    </resources>
    <resources os="Windows">
      <jar href="windows/jdic_stub.jar"/>
      <nativelib href="windows/jdic-native.jar"/>
    </resources>
    <resources os="Linux">
      <jar href="linux/jdic_stub.jar"/>
      <nativelib href="linux/jdic-native.jar"/>
    </resources>
    <resources locale="es">
      <j2se version="1.3+" href="http://java.sun.com/products/autodl/j2se"/>
    </resources>
    <security>
      <all-permissions/>
    </security>
    <application-desc main-class="stacks.printing.cliente.GestorImpresionLauncher"/>
  </jnlp>

Проблема в том, что загрузка ресурсов JNLP не выполняется случайным образом (это происходит чаще, если скорость соединения низкая).

Если мы напрямую обращаемся к Tomcat, все работает нормально.

Любые идеи?

Отредактировано 1:

Ошибка журнала Apache:

[Thu Jul 01 09:51:45 2010] [868:5096] [info] jk_connect.c (566): connect to 127.0.0.1:8209 failed (errno=61)
[Thu Jul 01 09:51:45 2010] [868:5096] [info] jk_ajp_common.c (869): Failed opening socket to (127.0.0.1:8209) (errno=61)
[Thu Jul 01 09:51:45 2010] [868:5096] [error] jk_ajp_common.c (1359): (worker-omiapWeb) connecting to backend failed. Tomcat is probably not started or is listening on the wrong port (errno=61)
[Thu Jul 01 09:51:45 2010] [868:5096] [info] jk_ajp_common.c (2186): (worker-omiapWeb) sending request to tomcat failed (recoverable), because of error during request sending (attempt=2)
[Thu Jul 01 09:51:45 2010] [868:5096] [error] jk_ajp_common.c (2204): (worker-omiapWeb) Connecting to tomcat failed. Tomcat is probably not started or is listening on the wrong port
[Thu Jul 01 09:51:45 2010] [868:5096] [info] mod_jk.c (2364): Service error=-3 for worker=worker-omiapWeb

Отредактировано 2:

server.xml Раздел AJP:

<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8209" 
       maxThreads="300" connectionTimeout="600000"
       enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />

Почему вы обслуживаете приложение JNLP из tomcat? WebStart использует простые HTTP-запросы GET для доступа к файлу JNLP, а затем к файлам .jar. Вы можете разместить их вне Tomcat и позволить Apache выполнять работу в одиночку.

Вы также можете опубликовать биты вашего server.xml для коннектора AJP. Одна из возможностей заключается в том, что ваш соединитель на стороне Tomcat не имеет достаточной емкости (maxThreads и тайм-аут) для обработки количества соединений, которые Apache отправляет.

Попробуйте установить таймауты рабочего времени выше, чем значения по умолчанию:

worker.worker-omiapWeb.socket_timeout = 60

worker.worker-omiapWeb.connect_timeout = 2000

worker.worker-omiapWeb.prepost_timeout = 1000

worker.worker-omiapWeb.reply_timeout = 30000

Это находится в вашем файле worker.properties. Возможно, вам придется пойти дальше с одним или несколькими из них - нам нужно будет просмотреть ваши файлы журнала apache, чтобы убедиться, какой из них вызывает у вас проблему.