java - ReSTLet 在 HTTPS BindException 上与 Jetty 一起运行

标签 java exception jetty restlet

如果我尝试使用带有 HTTPS 的 JettyHelper 在嵌入式 Jetty 中运行 ReSTLet。如果我运行 jar 并监听端口 443,则 ReSTLet 将从 Jetty 启动。但是在第一个请求中,我从 Jetty 收到绑定(bind)异常,但一切正常:

INFO   | jvm 1    | 2013/08/05 07:35:43 | 2013-08-05 07:35:43.720:INFO:oejs.Server:jetty-7.6.5.v20120716
INFO   | jvm 1    | 2013/08/05 07:35:43 | 2013-08-05 07:35:43.813:INFO:oejs.AbstractConnector:Started SslSelectChannelConnector@0.0.0.0:443
INFO   | jvm 1    | 2013/08/05 07:35:43 | 2013-08-05 07:35:43.814:INFO:oejs.Server:jetty-7.6.5.v20120716
INFO   | jvm 1    | 2013/08/05 07:35:43 | 2013-08-05 07:35:43.820:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:8182
INFO   | jvm 1    | 2013/08/05 07:36:35 | 2013-08-05 07:36:35.730:INFO:oejs.Server:jetty-7.6.5.v20120716
INFO   | jvm 1    | 2013/08/05 07:36:35 | 2013-08-05 07:36:35.733:WARN:oejuc.AbstractLifeCycle:FAILED SslSelectChannelConnector@0.0.0.0:443: java.net.BindException: Die Adresse wird bereits verwendet
INFO   | jvm 1    | 2013/08/05 07:36:35 | java.net.BindException: Die Adresse wird bereits verwendet
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at sun.nio.ch.Net.bind0(Native Method)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at sun.nio.ch.Net.bind(Net.java:444)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at sun.nio.ch.Net.bind(Net.java:436)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:214)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.server.nio.SelectChannelConnector.open(SelectChannelConnector.java:182)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.server.AbstractConnector.doStart(AbstractConnector.java:311)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.server.nio.SelectChannelConnector.doStart(SelectChannelConnector.java:260)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.server.ssl.SslSelectChannelConnector.doStart(SslSelectChannelConnector.java:626)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.server.Server.doStart(Server.java:281)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.restlet.ext.jetty.JettyServerHelper.start(JettyServerHelper.java:398)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.restlet.Server.start(Server.java:590)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.restlet.Restlet.handle(Restlet.java:315)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.restlet.Server.handle(Server.java:513)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.restlet.engine.ServerHelper.handle(ServerHelper.java:72)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.restlet.engine.adapter.HttpServerHelper.handle(HttpServerHelper.java:152)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.restlet.ext.jetty.JettyServerHelper$WrappedServer.handle(JettyServerHelper.java:170)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:452)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:884)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:938)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:630)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:230)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:77)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.io.nio.SslConnection.handle(SslConnection.java:191)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:622)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:46)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:603)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:538)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at java.lang.Thread.run(Thread.java:724)
INFO   | jvm 1    | 2013/08/05 07:36:35 | 2013-08-05 07:36:35.735:WARN:oejuc.AbstractLifeCycle:FAILED org.restlet.ext.jetty.JettyServerHelper$WrappedServer@60ce274e: java.net.BindException: Die Adresse wird bereits verwendet
INFO   | jvm 1    | 2013/08/05 07:36:35 | java.net.BindException: Die Adresse wird bereits verwendet
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at sun.nio.ch.Net.bind0(Native Method)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at sun.nio.ch.Net.bind(Net.java:444)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at sun.nio.ch.Net.bind(Net.java:436)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:214)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.server.nio.SelectChannelConnector.open(SelectChannelConnector.java:182)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.server.AbstractConnector.doStart(AbstractConnector.java:311)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.server.nio.SelectChannelConnector.doStart(SelectChannelConnector.java:260)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.server.ssl.SslSelectChannelConnector.doStart(SslSelectChannelConnector.java:626)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.server.Server.doStart(Server.java:281)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.restlet.ext.jetty.JettyServerHelper.start(JettyServerHelper.java:398)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.restlet.Server.start(Server.java:590)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.restlet.Restlet.handle(Restlet.java:315)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.restlet.Server.handle(Server.java:513)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.restlet.engine.ServerHelper.handle(ServerHelper.java:72)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.restlet.engine.adapter.HttpServerHelper.handle(HttpServerHelper.java:152)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.restlet.ext.jetty.JettyServerHelper$WrappedServer.handle(JettyServerHelper.java:170)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:452)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:884)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:938)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:630)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:230)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:77)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.io.nio.SslConnection.handle(SslConnection.java:191)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:622)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:46)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:603)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:538)
INFO   | jvm 1    | 2013/08/05 07:36:35 |   at java.lang.Thread.run(Thread.java:724)

为什么 Jetty 尝试启动两次?我怎样才能摆脱这个异常?

源代码:

import java.security.KeyStore;

import org.restlet.Application;
import org.restlet.Component;
import org.restlet.Context;
import org.restlet.Restlet;
import org.restlet.Server;
import org.restlet.data.Parameter;
import org.restlet.data.Protocol;
import org.restlet.engine.Engine;
import org.restlet.ext.jetty.HttpServerHelper;
import org.restlet.ext.jetty.HttpsServerHelper;
import org.restlet.routing.Router;
import org.restlet.util.Series;

public class RestServer extends Application {


    private RestServer(Context context) {
        super(context);     
    }

    public static void main(String[] args) throws Exception {  

        Engine.setLogLevel(java.util.logging.Level.INFO);

        Component component = new Component();  

        component.getLogService().setLoggerName("net.asdf.WebComponent.www");

        Context context = component.getContext().createChildContext();
        component.getDefaultHost().attach(new RestServer(context));


        startHttpsServer(context, component, 443).start();
        startHttpServer(context, component, 8182).start(); 

    } 

    private static HttpServerHelper startHttpServer(Context context, Component component, Integer port) throws Exception {
        //create embedding http jetty server
        Server embedingHttpJettyServer=new Server(
                context,
                Protocol.HTTP,
                port,
                component
            );
        //construct and start JettyServerHelper
        HttpServerHelper jettyHttpServerHelper=new HttpServerHelper(embedingHttpJettyServer);
        return jettyHttpServerHelper;
    }

    private static HttpsServerHelper startHttpsServer(Context context, Component component, Integer port) throws Exception {
        //create embedding https jetty server
        final Server embedingHttpsJettyServer=new Server(
                context,
                Protocol.HTTPS,
                port, // 8183,
                component
            );

        Series<Parameter> parameters = embedingHttpsJettyServer.getContext().getParameters();
        // parameters.add("sslContextFactory", "org.restlet.ext.ssl.PkixSslContextFactory");
        // parameters.add("sslContextFactory", "org.eclipse.jetty.http.ssl.SslContextFactory");
        parameters.add("keystore", "jks/keystore.jks");
        parameters.add("keyStorePath", "jks/keystore.jks");
        parameters.add("keyStorePassword", "xxxxx");
        parameters.add("keyManagerPassword", "xxxx");
        parameters.add("keyPassword", "xxxx");
        parameters.add("password", "xxx");
        parameters.add("keyStoreType", KeyStore.getDefaultType());
        parameters.add("tracing", "true");
        parameters.add("truststore", "jks/keystore.jks"); 
        parameters.add("trustStorePath", "jks/keystore.jks"); 
        parameters.add("trustStorePassword", "xxxxx");
        parameters.add("trustPassword", "xxxxx"); 
        parameters.add("trustStoreType", KeyStore.getDefaultType()); 
        parameters.add("allowRenegotiate", "true");
        parameters.add("type", "1");
        //construct and start JettyServerHelper
        HttpsServerHelper jettyHttpsServerHelper = new HttpsServerHelper(embedingHttpsJettyServer);
        return jettyHttpsServerHelper;

    }


    /**
     * Creates a root Restlet that will receive all incoming calls.
     */
    @Override
    public Restlet createInboundRoot() {
        // Create a router Restlet that routes each call to a
        Context routerContext = getContext().createChildContext();
        Router router = new Router(routerContext);
        router.attachDefault(DefaultResource.class);
        return router;
    }
}

最佳答案

我更新了“main”、“startHttpServer”和“startHttpsServer”方法以使代码正常工作:

public static void main(String[] args) throws Exception {
    Engine.setLogLevel(java.util.logging.Level.INFO);
    Component component = new Component();
    component.getLogService().setLoggerName("net.asdf.WebComponent.www");
    component.getDefaultHost().attach(new TestPatrick());

    // Attach the server connectors descriptors to the component
    component.getServers().add(startHttpsServer(component, 443));
    component.getServers().add(startHttpServer(component, 8182));
    // Start the component, which will lead to start, at the end, the real connectors.
    component.start();
}

private static Server startHttpServer(Component component, Integer port) throws Exception {
    return new Server(Protocol.HTTP, port, component);
}

private static Server startHttpsServer(Component component, Integer port) throws Exception {
    // create embedding https jetty server
    Server server = new Server(new Context(), Protocol.HTTPS, port, component);

    Series<Parameter> parameters = server.getContext().getParameters();
    parameters.add("keystore", "jks/keystore.jks");
    parameters.add("keyStorePath", "jks/keystore.jks");
    parameters.add("keyStorePassword", "xxx");
    parameters.add("keyManagerPassword", "xxx");
    parameters.add("keyPassword", "xxx");
    parameters.add("password", "xxx");
    parameters.add("keyStoreType", KeyStore.getDefaultType());
    parameters.add("tracing", "true");
    parameters.add("truststore", "jks/keystore.jks");
    parameters.add("trustStorePath", "jks/keystore.jks");
    parameters.add("trustStorePassword", "xxx");
    parameters.add("trustPassword", "xxx");
    parameters.add("trustStoreType", KeyStore.getDefaultType());
    parameters.add("allowRenegotiate", "true");
    parameters.add("type", "1");

    return server;
}

这里有一些解释。 Component是应用程序的容器,它的目的是为这些应用程序提供一些服务。例如,它提供服务器连接器,帮助使用多种协议(protocol)通过客户端请求访问应用程序。 ReSTLet 框架提供了服务器连接器的多种实现;一种是内部的,其他的则基于特定的框架,例如 Jetty。由于我们不希望您的代码依赖于特定的扩展,因此它的理念是让组件使用充当描述符的 Server 类声明其所需的服务器连接器。然后,引擎发现位于类路径中的实现,并透明地创建真正的服务器助手。

我希望我的解释很清楚。如果没有,请随时询问更多。

关于java - ReSTLet 在 HTTPS BindException 上与 Jetty 一起运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18053034/

相关文章:

java - 如何在本地主机上启动 cxf 服务但在 wsdl 中返回外部地址?

java - 从 HttpServletRequest 读取二进制数据

tomcat - 无法连接到在 Ubuntu 10 上运行 Jetty 的 Solr

java - SharedPreferences 无法工作/保存 EditText 字段中的数据

java - GCM 在 2.3.6 中没有收到消息,但在 4.1.2 中没问题

java - 多线程类加载可能吗?

exception - 上传tomcat应用抛出SSL异常

c# - 为什么我得到 PingException?

Java ProcessBuilder 不写换行符

perl - 使用 perl 模块 Log::Syslog::Fast - 无法捕获异常