【问题标题】:Publishing multiple Endpoints with built-in Java JAX-WS web server使用内置 Java JAX-WS Web 服务器发布多个端点
【发布时间】:2014-09-09 11:29:40
【问题描述】:

所以我有 2 个实现,Impl1 和 Impl2,一个 Web 服务接口类。我想在相同的域和端口下发布,但使用不同的 URL:

http://some.domain.asd/ws1http://some.domain.asd/ws2

显然,我应该能够创建一个配置,其中我有 2 个端点,每个实现一个,绑定到单个 Web 服务器实例。

请注意,我不是在部署而是使用 Java 7 内部发布机制。 我注意到,而不是调用

Endpoint.publish(URL, new Implementor());

直接发布web服务,我可以调用

Endpoint ep = Endpoint.create(new Implementor());
ep.publish(serverContext);

在特定的 serverContext 上发布实施程序。这样的 serverContext 到底是什么,我该如何使用它?我注意到publish 方法实例化了一个javax.xml.ws.spi.Provider 类并将其用于发布目的。但这显然不是我想要的。理想情况下,我想要一个类似于这样的解决方案:

Object serverContext = new Server(URL);
Endpoint impl1 = Endpoint.create(new Impl1());
Endpoint impl2 = Endpoint.create(new Impl2());
impl1.publish(serverContext);
impl2.publish(serverContext);

这甚至可以使用内置发布系统来完成,也许使用EndpointReferences 对象?或者我是否需要使用 Web 服务容器来单独部署我的 Endpoints?

【问题讨论】:

    标签: java web-services jax-ws publish built-in


    【解决方案1】:

    使用此代码可以实现发布在同一端口上运行的多个端点:

    @SpringBootApplication
    public class Application {
      public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
        Endpoint.publish("http://localhost:8888/ws/send", new SendServiceImpl());
        Endpoint.publish("http://localhost:8888/ws/send23", new SendServiceImpl());
      } 
    }
    

    在 Eclipse 中本地运行它可以工作,但是当你将它部署到另一台服务器时它就坏了。
    要解决此问题,您可以使用 http://0.0.0.0:8888 而不是 localhost 或服务器的正确内部 IP 地址。

    您发现它正在运行: 窗口:ipconfig Unix:ifconfig

    看起来像这样:192.168.100.55。

    【讨论】:

    • 如果您认为您链接的问题也可以回答这个问题,请将其标记为重复,不要将其链接为答案。
    • 由于我的代表率低,我无法将其标记为重复。
    • 这不是重复的,而且答案不会令人满意。但我编辑了答案,因为我找到了一个行之有效的解决方案。
    • 即使在 Eclipse 中也不适合我。例外是“java.net.BindException:地址已在使用中”
    • @Jian Chen 那么你应该将端口从 8888 更改为你想要的任何端口。
    【解决方案2】:

    我今天偶然发现了这个问题;将两个不同的端点发布到同一个主机+端口时,我不断收到“java.net.BindException:地址已在使用”。解决方案是自己实例化HttpServer 并将每个端点“绑定”到此服务器:

    package mypackage;
    
    import com.sun.net.httpserver.HttpServer;
    
    import javax.xml.ws.Endpoint;
    import java.io.IOException;
    import java.net.InetAddress;
    import java.net.InetSocketAddress;
    
    public static void main(String[] args) throws IOException {
        final HttpServer httpServer = HttpServer.create(new InetSocketAddress(InetAddress.getByName("0.0.0.0"), 8080), 16);
    
        final Endpoint fooEndpoint = Endpoint.create(new FooImpl());
        fooEndpoint.publish(httpServer.createContext("/Foo"));
    
        final Endpoint barEndpoint = Endpoint.create(new BarImpl());
        barEndpoint.publish(httpServer.createContext("/Bar"));
    
        httpServer.start();
    }
    

    【讨论】:

    • 我收到错误“类 sun.net.httpserver.HttpContextImpl 不是受支持的上下文。”在运行时发布功能。
    猜你喜欢
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 2015-07-21
    • 2012-08-09
    • 2017-04-05
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    相关资源
    最近更新 更多