使用内置 Java JAX-WS Web 服务器发布多个端点

Posted

技术标签:

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

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

http://some.domain.asd/ws1 和 http://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?

【问题讨论】:

【参考方案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 不是受支持的上下文。”在运行时发布功能。

以上是关于使用内置 Java JAX-WS Web 服务器发布多个端点的主要内容,如果未能解决你的问题,请参考以下文章

如何避免需要在 CXF 或 JAX-WS 生成的 Web 服务客户端中指定 WSDL 位置?

JAX-WS、Axis2 和 CXF 的区别

JAX-WS服务端及客户端

如何避免在CXF或JAX-WS生成的Web服务客户端中指定WSDL位置?

为 JAX-RPC Web 服务生成 JAX-WS 客户端存根?

编写 jax-ws web 服务并在没有 XSD 的情况下生成 WSDL