有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java终止Jetty服务器线程池(如果start()出现异常)

我正在Clojure中编写一个嵌入式Jetty应用程序,主要名称空间如下:

(ns rudkus.core
  (:require [clojure.tools.cli :as cli]
            [ring.adapter.jetty :as jetty])
  (:gen-class))

(defn handler [request]
  {:status 200
   :headers {"Content-Type" "text/html"}
   :body "Hello, World!"})

(def ^{:private true} server (atom nil))

(defn start [port]
  (swap! server #(if (not (nil? %))
                  (throw (IllegalStateException. "Server already started."))
                  (jetty/run-jetty handler
                                   {:port port
                                    :join? false}))))

(defn stop []
  (swap! server #(if (nil? %)
                  (throw (IllegalStateException. "Server already stopped."))
                  (do (.stop %)
                      nil))))

(defn -main [& args]
  (let [[options extra-args banner] (cli/cli args
                                             ["-p" "--port" "Port" :default 80 :parse-fn #(Integer. %)])]
    (if (not-empty extra-args)
      (println banner)
      (start (:port options)))))

这一切正常——我希望能够通过REPL启动和停止,以及从运行JAR的控制台启动和启动(不过,如果有更好的模式来启动/停止Clojure Ring Jetty程序,我很想知道)。问题是如果我参选

lein run

或者

lein trampoline run

jetty/run jetty(它包装了一个Server.start()调用)引发了一个异常——例如,在我的MacBook Pro上,如果我试图在端口80上启动jetty服务器,它会发出呕吐声——Clojure程序不会退出。然而,线程“main”中存在异常。那么为什么这个项目不退出呢?我能想到的唯一一件事就是码头上到处都是细线。但是start()失败了!!!那么这些线程(池)在做什么

这是爪哇岛的东西,Clojure的东西,Leiningen的东西,码头的东西,还是戒指的东西

编辑:

以下是stacktrace:

$ java -jar rudkus-0.1.0-SNAPSHOT-standalone.jar
2012-09-09 15:54:59.664:INFO:oejs.Server:jetty-7.x.y-SNAPSHOT
2012-09-09 15:54:59.803:WARN:oejuc.AbstractLifeCycle:FAILED SelectChannelConnector@0.0.0.0:80: java.net.SocketException: Permission denied
java.net.SocketException: Permission denied
    at sun.nio.ch.Net.bind(Native Method)
    at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:124)
    at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:59)
    at org.eclipse.jetty.server.nio.SelectChannelConnector.open(SelectChannelConnector.java:173)
    at org.eclipse.jetty.server.AbstractConnector.doStart(AbstractConnector.java:311)
    at org.eclipse.jetty.server.nio.SelectChannelConnector.doStart(SelectChannelConnector.java:251)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
    at org.eclipse.jetty.server.Server.doStart(Server.java:272)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
    at ring.adapter.jetty$run_jetty.invoke(jetty.clj:86)
    at rudkus.core$start$fn__16.invoke(core.clj:16)
    at clojure.lang.Atom.swap(Atom.java:37)
    at clojure.core$swap_BANG_.invoke(core.clj:2108)
    at rudkus.core$start.invoke(core.clj:14)
    at rudkus.core$_main.doInvoke(core.clj:31)
    at clojure.lang.RestFn.invoke(RestFn.java:397)
    at clojure.lang.AFn.applyToHelper(AFn.java:159)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at rudkus.core.main(Unknown Source)
2012-09-09 15:54:59.806:WARN:oejuc.AbstractLifeCycle:FAILED org.eclipse.jetty.server.Server@6e5dfaf1: java.net.SocketException: Permission denied
java.net.SocketException: Permission denied
    at sun.nio.ch.Net.bind(Native Method)
    at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:124)
    at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:59)
    at org.eclipse.jetty.server.nio.SelectChannelConnector.open(SelectChannelConnector.java:173)
    at org.eclipse.jetty.server.AbstractConnector.doStart(AbstractConnector.java:311)
    at org.eclipse.jetty.server.nio.SelectChannelConnector.doStart(SelectChannelConnector.java:251)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
    at org.eclipse.jetty.server.Server.doStart(Server.java:272)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
    at ring.adapter.jetty$run_jetty.invoke(jetty.clj:86)
    at rudkus.core$start$fn__16.invoke(core.clj:16)
    at clojure.lang.Atom.swap(Atom.java:37)
    at clojure.core$swap_BANG_.invoke(core.clj:2108)
    at rudkus.core$start.invoke(core.clj:14)
    at rudkus.core$_main.doInvoke(core.clj:31)
    at clojure.lang.RestFn.invoke(RestFn.java:397)
    at clojure.lang.AFn.applyToHelper(AFn.java:159)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at rudkus.core.main(Unknown Source)
Exception in thread "main" java.net.SocketException: Permission denied
    at sun.nio.ch.Net.bind(Native Method)
    at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:124)
    at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:59)
    at org.eclipse.jetty.server.nio.SelectChannelConnector.open(SelectChannelConnector.java:173)
    at org.eclipse.jetty.server.AbstractConnector.doStart(AbstractConnector.java:311)
    at org.eclipse.jetty.server.nio.SelectChannelConnector.doStart(SelectChannelConnector.java:251)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
    at org.eclipse.jetty.server.Server.doStart(Server.java:272)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
    at ring.adapter.jetty$run_jetty.invoke(jetty.clj:86)
    at rudkus.core$start$fn__16.invoke(core.clj:16)
    at clojure.lang.Atom.swap(Atom.java:37)
    at clojure.core$swap_BANG_.invoke(core.clj:2108)
    at rudkus.core$start.invoke(core.clj:14)
    at rudkus.core$_main.doInvoke(core.clj:31)
    at clojure.lang.RestFn.invoke(RestFn.java:397)
    at clojure.lang.AFn.applyToHelper(AFn.java:159)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at rudkus.core.main(Unknown Source)

共 (1) 个答案

  1. # 1 楼答案

    如果你看一下这段代码(在谷歌搜索结果的第一页上找到答案),有一个解决方案:source code containing method contextStartupFailed()但是这个解决方案对我不起作用,因为它要求一个名为_的字段,而我的Jetty版本(8.1.8.v20121106)没有这样的字段

    然而,现在,防波堤接缝支撑着更好的东西。对我来说,以下几点很有用:

      protected static void contextStartupFailed(WebAppContext pContext) throws Exception {
    
      Throwable failedException = pContext.getUnavailableException();
    
      if (failedException != null) {
         throw new RuntimeException("Error starting WebContext of Jetty.", failedException);
      }
    

    }

    我刚启动Jetty就调用了这个方法。当然,这只适用于有WebAppContext的情况