Используя 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-порту и выяснить, что это за порт?