訣竅是忽略在spark.Spark
中執行的Spark周圍的外部靜態shell,並直接與內部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();
而且需要複製wrap方法在你的代碼庫:
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運行集成測試時遇到了同樣的問題。作爲解決方法,確保爲maven failsafe插件設置forkCount = 1/reuseForks = false,以在其自己的JVM進程中執行每個測試類(請參閱http://maven.apache.org/surefire/maven-surefire-plugin/examples/叉選項和 - 並行execution.html) – asmaier