简体   繁体   中英

Publishing multiple Endpoints with built-in Java JAX-WS web server

So I have 2 implementations, Impl1 and Impl2, of a web service interface class. I would like to publish both under the same domain and port but with different URLS:

http://some.domain.asd/ws1 and http://some.domain.asd/ws2

Apparently, I should be able to create a configuration where I have 2 Endpoints, one for each implementation, bound to a single web server instance.

Note that I am not deploying but using the Java 7 internal publishing mechanism. I noticed that instead of calling

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

to directly publish a web service, I can call

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

to publish the Implementor at a specific serverContext. What exactly is such a serverContext and how do I use it? I noticed that the publish method instantiates a javax.xml.ws.spi.Provider class and uses it for publishing purposes. But that is apparently not what I am looking for. Ideally, I would like a solution that resembles something like this:

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

Can this even be done with the built-in publishing system, maybe using EndpointReferences objects? Or am I required to use a web service container to deploy my Endpoints seperately?

Publishing multiple Endpoints running on the same port could be achieved with this code :

@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());
  } 
}

Running this locally in Eclipse it works , but when you deploy it to another server its broken.
To fix this you can either use http://0.0.0.0:8888 instead of localhost or the correct internal ip-address of the server.

You find it running: windows: ipconfig unix: ifconfig

It looks something like this: 192.168.100.55.

I stumbled across this problem today; I kept getting "java.net.BindException: Address already in use" when publishing two different endpoints to the same host+port. The solution is to instantiate the HttpServer yourself and "bind" each endpoint to this server:

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();
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM