このトリックは、spark.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;
}
あなたは、複数のスパークのサーバーを必要とする場合、これは実行可能な回避策のようですあなたのアプリで。あなたがignite()
を使用することができスパーク2.5から
これらのインスタンスは同じポート番号を使用しています。 sparkインスタンスを起動するときには、それ自身のポートで実行する必要があります –
いいえ、ポートが同じであるかどうかにかかわらず、2番目のインスタンスを初期化しようとすると発生します。最初の初期化ではフラグがtrueに設定され、ほとんどの設定メソッドのそのポイントからはロックダウンされます。 – jabal
sparkjavaとの統合テストを実行するときに同じ問題が発生しました。回避策として、Mavenフェールセーフプラグインが独自のJVMプロセスで各テストクラスを実行するためには、forkCount = 1/reuseForks = falseを設定してください(http://maven.apache.org/surefire/maven-surefire-plugin/examples/を参照)。 fork-options-and-parallel-execution.html) – asmaier