Трюк состоит в том, чтобы игнорировать внешнюю статическую оболочку вокруг Искры, реализованную в spark.Spark
, и непосредственно работать с внутренним spark.webserver.SparkServer
. В коде есть некоторые препятствия, которые требуют обходного пути, например. spark.webserver.JettyHandler
не является общедоступным, поэтому вы не можете создавать его из своего кода, но можете расширить его с помощью собственного класса, помещенного в этот пакет, и превратить его в общедоступный.
Таким образом, решение по этим линиям:
SimpleRouteMatcher routeMatcher1 = new SimpleRouteMatcher();
routeMatcher1.parseValidateAddRoute("get '/foo'", "*/*", wrap("/foo", "*/*", (req, res) -> "Hello World 1"));
MatcherFilter matcherFilter1 = new MatcherFilter(routeMatcher1, false, false);
matcherFilter1.init(null);
PublicJettyHandler handler1 = new PublicJettyHandler(matcherFilter1);
SparkServer server1 = new SparkServer(handler1);
new Thread(() -> {
server1.ignite("0.0.0.0", 4567, null, null, null, null, "/META-INF/resources/", null, new CountDownLatch(1),
-1, -1, -1);
}).start();
И нужно дублировать метод обертку в вашем коде:
protected RouteImpl wrap(final String path, String acceptType, final Route route) {
if (acceptType == null) {
acceptType = "*/*";
}
RouteImpl impl = new RouteImpl(path, acceptType) {
@Override
public Object handle(Request request, Response response) throws Exception {
return route.handle(request, response);
}
};
return impl;
}
Это, кажется, жизнеспособный обходной путь, если вам нужно несколько серверов Spark, в вашем приложении.
В случае, если такие экземпляры имеют одинаковый номер порта. Когда вы запускаете искровой экземпляр, он должен запускаться на своем собственном порту. –
Нет, это происходит, когда вы пытаетесь инициализировать второй, независимо от того, был ли тот же порт или нет. Первая инициализация устанавливает флаг в true, и с этой точки большинство методов настройки блокируются. – jabal
У меня была такая же проблема при выполнении интеграционных тестов с помощью sparkjava. В качестве обходного решения обязательно установите forkCount = 1/reuseForks = false для maven отказоустойчивого плагина для выполнения каждого тестового класса в своем собственном процессе JVM (см. Http://maven.apache.org/surefire/maven-surefire-plugin/examples/ вилочных опции-и-параллельно-execution.html) – asmaier