Der Trick besteht darin, die externe statische Shell um Spark zu ignorieren, die in spark.Spark
implementiert ist und direkt mit dem internen spark.webserver.SparkServer
arbeitet. Es gibt einige Hindernisse im Code, die eine Problemumgehung erfordern, z. spark.webserver.JettyHandler
ist nicht öffentlich, Sie können es also nicht aus Ihrem Code instanziieren, aber Sie können es mit Ihrer eigenen Klasse erweitern und es öffentlich machen.
So ist die Lösung in dieser Richtung:
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();
und brauchen die Wickelmethode in Ihrem Code-Basis zu duplizieren:
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;
}
Dieses eine tragfähige Abhilfe zu sein scheint, wenn Sie mehrere Spark-Server benötigen in deiner App
Wahrscheinlich verwenden diese Instanzen die gleiche Portnummer. Wenn Sie eine Spark-Instanz starten, muss sie auf ihrem eigenen Port ausgeführt werden. –
Nein, dies geschieht, wenn Sie versuchen, eine zweite Instanz zu initialisieren, unabhängig davon, ob der Port identisch ist oder nicht. Bei der ersten Initialisierung wird ein Flag auf "true" gesetzt und ab diesem Zeitpunkt werden die meisten Konfigurationsmethoden gesperrt. – jabal
Ich hatte das gleiche Problem beim Ausführen von Integrationstests mit sparkjava. Stellen Sie als Workaround sicher, dass forkCount = 1/reuseForks = false gesetzt ist, damit das maven failsafe-Plugin jede Testklasse in einem eigenen JVM-Prozess ausführt (siehe http://maven.apache.org/surefire/maven-surefire-plugin/examples/). fork-options-and-parallel-execution.html) – asmaier