Изменение конфигурации для встроенного веб-приложения Tomcat - PullRequest
1 голос
/ 20 декабря 2011

Я пытался изменить встроенную конфигурацию tomcat для моего приложения heroku.Я установил приложение heroku, используя ссылку вики ниже, которая настраивает простой встроенный кот.

http://devcenter.heroku.com/articles/create-a-java-web-application-using-embedded-tomcat

Исходный код находится здесь:

public static void main(String[] args) throws Exception {

    String webappDirLocation = "src/main/webapp/";
    Tomcat tomcat = new Tomcat();

    //The port that we should run on can be set into an environment variable
    //Look for that variable and default to 8080 if it isn't there.
    String webPort = System.getenv("PORT");
    if(webPort == null || webPort.isEmpty()) {
        webPort = "8080";
    }

    tomcat.setPort(Integer.valueOf(webPort));

    tomcat.addWebapp("/", new File(webappDirLocation).getAbsolutePath());
    System.out.println("configuring app with basedir: " + new File("./" + webappDirLocation).getAbsolutePath());

    tomcat.start();
    tomcat.getServer().await();  

}

Вопросы:

  1. Поскольку я использую встроенный tomcat, как настроить время ожидания сеанса по умолчанию для моего веб-приложения?Кажется, по умолчанию 30 минут по какой-то причине?Я хочу установить что-то вроде одной недели.
  2. Если я запускаю приложение из затмения, как мне установить autodeploy = true, чтобы мне не приходилось компилировать и перезапускать мое приложение каждый раз, когда я изменяю Javaкод?
  3. есть ли способ настроить мои web.xml и server.xml?
  4. как мне запустить apache tomcat manager?

Документация в интернетене очень понятно.Не могли бы вы помочь?

Заранее спасибо .. Киран

1 Ответ

1 голос
/ 13 января 2012

Использовать Context.setSessionTimeout (int). Java документы здесь . Вот тот же Основной класс с тайм-аутом сеанса, установленным на 30 дней:

package launch;
import java.io.File;
import org.apache.catalina.startup.Tomcat;
import org.apache.catalina.Context;


public class Main {

    public static void main(String[] args) throws Exception {

        String webappDirLocation = "src/main/webapp/";
        Tomcat tomcat = new Tomcat();

        //The port that we should run on can be set into an environment variable
        //Look for that variable and default to 8080 if it isn't there.
        String webPort = System.getenv("PORT");
        if(webPort == null || webPort.isEmpty()) {
            webPort = "8080";
        }

        tomcat.setPort(Integer.valueOf(webPort));

        Context ctx = tomcat.addWebapp("/", new File(webappDirLocation).getAbsolutePath());
        ctx.setSessionTimeout(2592000);
        System.out.println("configuring app with basedir: " + new File("./" + webappDirLocation).getAbsolutePath());

        tomcat.start();
        tomcat.getServer().await();  
    }
}

Обратите внимание на Context ctx = ... и ctx.setSessionTimeout(...).

Что касается Tomcat Manager, вы не можете использовать его, когда встраиваете Tomcat в свое приложение таким образом. Мне интересно, для чего вы хотели бы использовать Tomcat Manager?

Все, что вы обычно делаете из server.xml, вы можете сделать через API встраивания. Весь смысл встраивания заключается в том, что вы настраиваете все программно.

Вы можете настроить свой собственный web.xml, как обычно. Просто добавьте его в каталог WEB-INF в каталоге, который вы передаете как webappDirLocation. Но опять же, мне любопытно, что вы хотели бы вставить в web.xml? Поскольку вы «владеете» основным циклом приложения, вы можете настроить любую необходимую конфигурацию из основного метода. Я настоятельно рекомендую практику инициализации всего, что вам нужно в основном цикле, и чтения переменных среды ОС для всего, что зависит от среды (например, URL JDBC).

Наконец, что касается Eclipse, вам больше не нужно горячее развертывание, потому что вы не используете модель развертывания контейнера. Вы можете просто запустить свое приложение из Eclipse с помощью «Debug as ...», и Eclipse автоматически скомпилирует и перезагрузит код при его изменении. Это не совсем похоже на горячее развертывание. Например, он не будет перегружать классы новыми сигнатурами методов. Но циклически обрабатывать все приложение намного быстрее, чем при использовании контейнера, поэтому в целом я считаю его гораздо более продуктивным.

...