2016-04-29 2 views
4

У меня есть 30 WARs в tomcat, и между ними существует зависимость. Поэтому у нас есть сервлет, чтобы развернуть их последовательно. Теперь я хочу развернуть необходимые приложения сначала последовательно, а затем остальные из них параллельно.Tomcat Многопоточное развертывание с использованием ManagerServlet

Мой код - это что-то вроде ниже.

public class MyDeployerServlet extends ManagerServlet { 
... 
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { 
... 
if(count < serialContexts){ 
      super.deploy(writer, context, contextName, null, false, sm); 
      count++; 
     } else { 
      MyAsyncDeployer deployer = new MyAsyncDeployer(writer, context, contextName, null, false, sm); 
      Thread deployerThread = new Thread(deployer); 
      deployerThread.start(); 
     } 
} 

MyAsyncDeployer работоспособная код:

public class MyAsyncDeployer extends MyDeployerServlet implements Runnable{ 
    private PrintWriter writer; 
    private String config; 
    private ContextName context; 
    private String war; 
    private boolean update; 
    private StringManager sm; 

    public MyAsyncDeployer(PrintWriter writer, String config, ContextName context, String war, boolean update, 
      StringManager sm) { 
     this.writer = writer; 
     this.config = config; 
     this.context = context; 
     this.war = war; 
     this.update = update; 
     this.sm = sm; 
    } 

    public void run() { 
     super.deploy(writer, config, context, null, false, sm); 
    } 

Когда я называю это, серийное развертывание идет хорошо, но многопоточные развертывания забросить ниже исключения.

Exception in thread "Thread-9" java.lang.NullPointerException 
     at javax.servlet.GenericServlet.getServletContext(GenericServlet.java:123) 
     at javax.servlet.GenericServlet.log(GenericServlet.java:188) 
     at org.apache.catalina.manager.ManagerServlet.deploy(ManagerServlet.java:834) 
     at com.example.servlet.MyAsyncDeployer.run(MyAsyncDeployer.java:30) 
     at java.lang.Thread.run(Thread.java:745) 
Exception in thread "Thread-10" java.lang.NullPointerException 
     at javax.servlet.GenericServlet.getServletContext(GenericServlet.java:123) 
     at javax.servlet.GenericServlet.log(GenericServlet.java:188) 
     at org.apache.catalina.manager.ManagerServlet.deploy(ManagerServlet.java:834) 
     at com.example.servlet.MyAsyncDeployer.run(MyAsyncDeployer.java:30) 
     at java.lang.Thread.run(Thread.java:745) 

Я не знаю, что здесь отсутствует, я использую те же ссылки на объекты в своей теме. Если это вообще возможно для развертывания многопоточным способом?

+0

Я также открыт для любого другого подхода, идея состоит в том, чтобы развернуть сначала несколько контекстов последовательно, а затем отдохнуть параллельно. – Pankaj

+0

какие типы зависимостей (jar ...) –

+0

@ Pankaj Я обновил свой ответ, не могли бы вы попробовать еще раз? – qwwdfsad

ответ

0

Проблема в том, что вы забыли инициализировать сервлет MyAsyncDeployer. Вам нужно позвонить по телефону MyAsyncDeployer#init(ServletConfig config) метод сразу после строительства (перед началом потока). Для серийного случае это работает, так как Tomcat инициализирован ваш сервлет (MyDeployerServlet) себя перед развертыванием в Javadoc для init состояний:

Вызывается контейнером сервлетов, чтобы указать на сервлет, что сервлет в настоящее время в эксплуатацию. See Servlet#init. Эта реализация сохраняет объект ServletConfig, который получает из контейнера сервлета для последующего использования. При переопределении этой формы метод, вызовите super.init(config).

Но до тех пор, пока вам не нужно развернуть сервлет асинхронного действия в контейнере и использовать его возможность развертывания, никто не создает его для вас.

Фиксированная версия кода:

if(count < serialContexts){ 
      super.deploy(writer, context, contextName, null, false, sm); 
      count++; 
     } else { 
      MyAsyncDeployer deployer = new MyAsyncDeployer(writer, context, contextName, null, false, sm); 
      delpoyer.setWrapper(getWrapper()); 
      deployer.init(getServletConfig()); 
      Thread deployerThread = new Thread(deployer); 
      deployerThread.start(); 
     } 
} 

UPD: Обратите внимание, что вы не можете избежать создания сервлета (ака, имеющий this.deploy вызов Runnable#run), потому что нить-безопасность ManagerServlet#deploy метода гарантируется с помощью полная синхронизация (весь метод равен synchronized), поэтому на самом деле такой подход будет также серийным.

+0

Я получаю ниже ошибки при вызове init. 12 мая 2016 10:40:51 вечера org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() для сервлета [Deployer] в контексте с помощью пути [/ deployer] выбрал исключение javax.servlet.UnavailableException: Контейнер не называется setWrapper() для этого сервлета \t в org.apache.catalina.manager.ManagerServlet.init (ManagerServlet.java:453) \t в javax.servlet.GenericServlet.init (GenericServlet.java:158) – Pankaj

+0

его работа после вызова метода setWrapper(). – Pankaj

Смежные вопросы