调试独立的jetty服务器 - 如何指定单线程模式?

时间:2014-12-18 16:29:16

标签: scala jetty

我使用Scalatra(http://www.scalatra.org/2.3/guides/deployment/standalone.html)的官方说明成功创建了一个独立的Scalatra / Jetty服务器

我在Ensime下调试它,并希望将处理消息的线程数量限制为单个 - 这样单步执行servlet方法会更容易。

我用这段代码来实现它:

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 org.eclipse.jetty.server.Server@1ac539f: 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)的原因。

为什么会发生这种情况?

1 个答案:

答案 0 :(得分:2)

原因是线程池的大小还取决于您定义的连接器数量。如果你看一下jetty服务器的源代码,你会看到:

// 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));

因此,单个服务器连接器的最小值为2.看起来您已经运行了其他几个默认连接器或选择器。