Java Jetty在多个TCP端口上发布端点

Java Jetty在多个TCP端口上发布端点,java,jetty,jax-ws,embedded-jetty,jetty-9,Java,Jetty,Jax Ws,Embedded Jetty,Jetty 9,我们正在使用Jetty 9.3嵌入式和发布多个webservice端点(使用Endpoint.publish)。但是,我不确定如何在不同的TCP端口上发布其中的一些 端点发布: endpoint = Endpoint.publish("http://0.0.0.0:8081/services/Service1"), service1); endpoint = Endpoint.publish("http://0.0.0.0:8081/services/Service2"), service2);

我们正在使用Jetty 9.3嵌入式和发布多个webservice端点(使用Endpoint.publish)。但是,我不确定如何在不同的TCP端口上发布其中的一些

端点发布:

endpoint = Endpoint.publish("http://0.0.0.0:8081/services/Service1"), service1);
endpoint = Endpoint.publish("http://0.0.0.0:8081/services/Service2"), service2);
endpoint = Endpoint.publish("http://0.0.0.0:8082/services/Service3"), service3);
期望:使服务1和2在端口8081上仅8081可用,而服务3在端口8082上仅8082可用

实际:这三种服务在两个TCP端口上都可用

设置使用我们的嵌入式码头,使用:

JettyHttpServerProvider.setServer(jettyWebServer);
System.setProperty("com.sun.net.httpserver.HttpServerProvider", JettyHttpServerProvider.class.getName());
为完整起见,jetty web服务器初始化:

jettyWebServer = new Server(new DelegatingThreadPool(new QueuedThreadPool()));
ServerConnector connector = new ServerConnector(jettyWebServer);
//connector.setHost();
connector.setPort(8081);
jettyWebServer.addConnector(connector);
必须为第二个端口添加此端口,否则终结点发布将无法用于Service3:

connector = new ServerConnector(jettyWebServer);
//connector.setHost(...);
connector.setPort(8082);
jettyWebServer.addConnector(connector);
ContextHandlerCollection contexts = new ContextHandlerCollection();
jettyWebServer.setHandler(contexts);
但是这三个端口在端口8081和8082上都可用。无法设置多个jetty服务器实例来处理此问题,似乎只有一个set方法可用:
JettyHttpServerProvider.setServer(…)
,无add或类似方法


非常感谢您的帮助。

我创建了两个Jetty
服务器
实例,并使用不同的实例设置全局
JettyHttpServerProvider.Server
静态字段,如下所示:

package com.scotth.jettypublish;

import javax.xml.ws.Endpoint;

import org.eclipse.jetty.http.spi.DelegatingThreadPool;
import org.eclipse.jetty.http.spi.JettyHttpServerProvider;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
import org.eclipse.jetty.util.thread.QueuedThreadPool;

import com.scotth.jettypublish.ws.HelloWorld;
import com.scotth.jettypublish.ws.impl.HelloWorldImplOne;
import com.scotth.jettypublish.ws.impl.HelloWorldImplThree;
import com.scotth.jettypublish.ws.impl.HelloWorldImplTwo;

public class PublishTesterMain {

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

        Server ws1 = new Server(new DelegatingThreadPool(new QueuedThreadPool()));
        ServerConnector connector = new ServerConnector(ws1);
        connector.setPort(8081);
        ws1.addConnector(connector);
        ContextHandlerCollection contexts = new ContextHandlerCollection();
        ws1.setHandler(contexts);

        Server ws2 = new Server(new DelegatingThreadPool(new QueuedThreadPool()));
        ServerConnector connector2 = new ServerConnector(ws2);
        connector2.setPort(8082);
        ws2.addConnector(connector2);
        ContextHandlerCollection contexts2 = new ContextHandlerCollection();
        ws2.setHandler(contexts2);

        System.setProperty("com.sun.net.httpserver.HttpServerProvider", JettyHttpServerProvider.class.getName());

        HelloWorld service1 = new HelloWorldImplOne();
        HelloWorld service2 = new HelloWorldImplTwo();

        JettyHttpServerProvider.setServer(ws1);
        Endpoint.publish("http://0.0.0.0:8081/services/Service1", service1);
        Endpoint.publish("http://0.0.0.0:8081/services/Service2", service2);
        ws1.start();

        HelloWorld service3 = new HelloWorldImplThree();

        JettyHttpServerProvider.setServer(ws2);
        Endpoint.publish("http://0.0.0.0:8082/services/Service3", service3);
        ws2.start();
        Thread.sleep(Long.MAX_VALUE);
    }

}
运行此主要方法后,我观察到以下打印到标准输出:

2016-05-31 22:38:54.818:INFO::main: Logging initialized @212ms
2016-05-31 22:38:55.807:INFO:oejs.Server:main: jetty-9.3.z-SNAPSHOT
2016-05-31 22:38:55.870:INFO:oejsh.ContextHandler:main: Started o.e.j.h.s.HttpSpiContextHandler@53045c6c{/services/Service1,null,AVAILABLE}
2016-05-31 22:38:55.870:INFO:oejsh.ContextHandler:main: Started o.e.j.h.s.HttpSpiContextHandler@5149d738{/services/Service2,null,AVAILABLE}
2016-05-31 22:38:55.901:INFO:oejs.AbstractConnector:main: Started ServerConnector@7d9d0818{HTTP/1.1,[http/1.1]}{0.0.0.0:8081}
2016-05-31 22:38:55.902:INFO:oejs.Server:main: Started @1299ms
2016-05-31 22:38:55.939:INFO:oejs.Server:main: jetty-9.3.z-SNAPSHOT
2016-05-31 22:38:55.939:INFO:oejsh.ContextHandler:main: Started o.e.j.h.s.HttpSpiContextHandler@5f8e8a9d{/services/Service3,null,AVAILABLE}
2016-05-31 22:38:55.941:INFO:oejs.AbstractConnector:main: Started ServerConnector@17bffc17{HTTP/1.1,[http/1.1]}{0.0.0.0:8082}
2016-05-31 22:38:55.942:INFO:oejs.Server:main: Started @1339ms
请求并生成了预期的web服务端点问候页面,同时生成了一个
HTTP404
。请求生成了预期的第三个服务端点问候页面

要完成代码示例(如果您已经有可用的ServiceImpl对象,则不需要),下面是我使用的服务端点接口(三个impl使用相同的接口):

下面是演示的
Endpoint.publish()调用中使用的三种web服务实现:

一:

二:

三:

package com.scotth.jettypublish.ws.impl;

import javax.jws.WebService;

import com.scotth.jettypublish.ws.HelloWorld;

@WebService(endpointInterface = "com.scotth.jettypublish.ws.HelloWorld")
public class HelloWorldImplThree implements HelloWorld {

    @Override
    public String sayHello(String name) {
        return "THREE Hello " + (name == null ? "World" : name);
    }

}

谢谢,很好用。回答得非常好,做得很好,非常受欢迎。
package com.scotth.jettypublish.ws.impl;

import javax.jws.WebService;

import com.scotth.jettypublish.ws.HelloWorld;

@WebService(endpointInterface = "com.scotth.jettypublish.ws.HelloWorld")
public class HelloWorldImplOne implements HelloWorld {

    @Override
    public String sayHello(String name) {
        return "ONE Hello " + (name == null ? "World" : name);
    }

}
package com.scotth.jettypublish.ws.impl;

import javax.jws.WebService;

import com.scotth.jettypublish.ws.HelloWorld;

@WebService(endpointInterface = "com.scotth.jettypublish.ws.HelloWorld")
public class HelloWorldImplTwo implements HelloWorld {

    @Override
    public String sayHello(String name) {
        return "TWO Hello " + (name == null ? "World" : name);
    }

}
package com.scotth.jettypublish.ws.impl;

import javax.jws.WebService;

import com.scotth.jettypublish.ws.HelloWorld;

@WebService(endpointInterface = "com.scotth.jettypublish.ws.HelloWorld")
public class HelloWorldImplThree implements HelloWorld {

    @Override
    public String sayHello(String name) {
        return "THREE Hello " + (name == null ? "World" : name);
    }

}