Запуск javax.xml.ws.Endpoint на динамическом («эфемерном») TCP-порту - PullRequest
0 голосов
/ 04 ноября 2018

Используя Java API javax.xml.ws.Endpoint, я хочу предложить конечную точку SOAP (подделка для целей тестирования). Чтобы предотвратить конфликты портов, я хочу следовать обычной практике тестирования программного обеспечения, которая заключается в том, чтобы запускать такие службы на динамических портах TCP (диапазон временных портов). Поэтому я использую http://[::]:]/ в качестве URL для публикации порта SOAP RCP.

Я использую следующий код:

package foo;

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.xml.ws.Endpoint;

@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class FakeService implements AutoCloseable {
    private final Endpoint endpoint;
    public FakeService() {
        endpoint = Endpoint.create(this);
        endpoint.publish("http://[::]:0/");
        // TODO determine actual URL / TCP port number
    }
    @Override
    public void close() {
        endpoint.stop();
    }
    @WebMethod
    public String getInfo() {
        return "info";
    }

    public static void main(final String... args) {
        new FakeService();
    }
}
  • Компиляция: javac --add-modules java.se.ee foo/FakeService.java
  • Прогон: java --add-modules java.se.ee foo.FakeService)

В качестве обходного пути в настоящее время я использую следующий код:

    // ...
    url = String.format("http://[::]:%d/", getTemporaryPortNumber());
    // ...

public static int getTemporaryPortNumber() {
    try (final ServerSocket serverSocket = new ServerSocket(0)) {
        return serverSocket.getLocalPort();
    } catch (final IOException e) {
        return 20000 + new Random(systemUTC().millis()).nextInt(5000);
    }
}

Как программно определить фактический URL-адрес или порт, на котором запущена конечная точка (в месте с комментарием TODO), когда порт TCP был указан как 0? Если это невозможно, есть ли альтернативный способ запустить конечную точку SOAP на динамическом / эфемерном TCP-порту и выяснить, что это за порт?

...