Я написал небольшой веб-сервис JAX-WS, который я запускаю вне контейнера с Endpoint.publish()
:
Endpoint endpoint = Endpoint.create(new MyServiceImpl());
endpoint.publish("http://localhost:4425/myService");
Если какой-либо из моих методов веб-службы выдает исключение, конечная точка не закрывается корректно, и адрес остается в использовании до тех пор, пока Windows не освободит его. Это вызывает классическую ошибку:
com.sun.xml.internal.ws.server.ServerRtException: Ошибка выполнения сервера: java.net.BindException: Адрес уже используется: bind
Я мог бы обернуть все методы моего веб-сервиса с помощью try/catch, но это кажется немного повторяющимся. Я также попытался установить класс очистки через Thread.setDefaultUncaughtExceptionHandler()
, но это не сработало, когда мой метод веб-службы выдал исключение.
Есть ли более элегантный способ решить эту проблему, чем прибегать к бесчисленным блокам try/catch?
Основываясь на ответе Вальдхайнца, я попытался использовать классы Jetty в пользу значений по умолчанию JDK. Код компилируется, но при выполнении завершается сразу после publish
. При использовании классов JDK основной поток оставался в живых до тех пор, пока я не завершу процесс вручную. Любые идеи, что происходит не так? Интересно, происходит ли где-то исключение, но его проглатывают, поэтому я его не вижу.
Endpoint endpoint = Endpoint.create(new MyServiceImpl());
Server s = new Server(new InetSocketAddress(HOST, PORT));
ServerConnector connector = new ServerConnector(s);
connector.setReuseAddress(true);
s.setConnectors(new Connector[] { connector });
s.setHandler(new ContextHandlerCollection());
JettyHttpServer server = new JettyHttpServer(s, false);
JettyHttpContext context = (JettyHttpContext) server.createContext(PATH);
endpoint.publish(context);
HttpServer
по умолчанию, но это возможно с другими реализациями JAX-WS SPI, такими как Jettyjetty-jaxws2-spi
или подобными. 15.05.2014s.join();
, что позволило бы основному потоку ждать, пока сервер не выключится (когда и почему он выключится, это другая тема). 15.05.2014join()
, см. мой ответ для полного дампа. 19.05.2014