2014-12-18 5 views
2

Я успешно создан автономный сервер Scalatra/Jetty, используя официальные инструкции от Scalatra (http://www.scalatra.org/2.3/guides/deployment/standalone.html)Отладка автономного сервера причала - как указать однопоточный режим?

я отладки под Ensime, и хотел бы ограничить количество потоков обработки сообщений к одному один - так что одноэтапный метод сервлетов будет проще.

Я использовал этот код для ее достижения:

package ... 

import org.eclipse.jetty.server.Server 
import org.eclipse.jetty.servlet.{DefaultServlet, ServletContextHandler} 
import org.eclipse.jetty.webapp.WebAppContext 
import org.scalatra.servlet.ScalatraListener 
import org.eclipse.jetty.util.thread.QueuedThreadPool 
import org.eclipse.jetty.server.ServerConnector 

object JettyLauncher { 
    def main(args: Array[String]) { 
    val port = 
     if (System.getenv("PORT") != null) 
     System.getenv("PORT").toInt 
     else 
     4080 

    // DEBUGGING MODE BEGINS 
    val threadPool = new QueuedThreadPool() 
    threadPool.setMaxThreads(8) 
    val server = new Server(threadPool) 

    val connector = new ServerConnector(server) 
    connector.setPort(port) 
    server.setConnectors(Array(connector)) 
    // DEBUGGING MODE ENDS 

    val context = new WebAppContext() 
    context setContextPath "/" 
    context.setResourceBase("src/main/webapp") 
    context.addEventListener(new ScalatraListener) 
    context.addServlet(classOf[DefaultServlet], "/") 

    server.setHandler(context) 

    server.start 
    server.join 
    } 
} 

Он работает отлично - за одной незначительной детали, за исключением ...

Я не могу сказать Jetty использовать 1 нить - минимальный значение равно 8!

Если я делаю, это то, что происходит:

$ sbt assembly 
... 
$ java -jar ./target/scala-2.11/CurrentVersions-assembly-0.1.0-SNAPSHOT.jar 
18:13:27.059 [main] INFO org.eclipse.jetty.util.log - Logging initialized @41ms 
18:13:27.206 [main] INFO org.eclipse.jetty.server.Server - jetty-9.1.z-SNAPSHOT 
18:13:27.220 [main] WARN o.e.j.u.component.AbstractLifeCycle - FAILED [email protected]: java.lang.IllegalStateException: Insufficient max threads in ThreadPool: max=1 < needed=8 
java.lang.IllegalStateException: Insufficient max threads in ThreadPool: max=1 < needed=8 

... поэтому вы видите setMaxThreads(8) вместо setMaxThreads(1) в моем коде выше.

Любые идеи, почему это происходит?

ответ

2

Причина в том, что размер пула threadpool также зависит от того, что вы определили. Если вы посмотрите на исходный код сервера молы вы увидите это:

// check size of thread pool 
     SizedThreadPool pool = getBean(SizedThreadPool.class); 
     int max=pool==null?-1:pool.getMaxThreads(); 
     int selectors=0; 
     int acceptors=0; 
     if (mex.size()==0) 
     { 
      for (Connector connector : _connectors) 
      { 
       if (connector instanceof AbstractConnector) 
        acceptors+=((AbstractConnector)connector).getAcceptors(); 

       if (connector instanceof ServerConnector) 
        selectors+=((ServerConnector)connector).getSelectorManager().getSelectorCount(); 
      } 
     } 

     int needed=1+selectors+acceptors; 
     if (max>0 && needed>max) 
      throw new IllegalStateException(String.format("Insufficient threads: max=%d < needed(acceptors=%d + selectors=%d + request=1)",max,acceptors,selectors)); 

Таким образом, минимум с одним serverconnector равен 2. Похоже, у вас есть несколько других разъемов по умолчанию или селекторов работает ,

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