2017-01-03 6 views
5

Есть ли способ запустить несколько экземпляров сервера Sparkjava в одной JVM? Я использую его в программном обеспечении «плагин» и на основании внешних обстоятельств несколько экземпляров моего плагина могут быть запущены, которые затем вызываютНесколько серверов Spark в одном JVM

java.lang.IllegalStateException: This must be done before route mapping has begun 
at spark.SparkBase.throwBeforeRouteMappingException(SparkBase.java:256) 
at spark.SparkBase.port(SparkBase.java:101) 
at com.foo.bar.a(SourceFile:59) 

Мне кажется, глядя на коде, который он сильно построен вокруг статического поля в коде, поэтому я думаю об уловке класса загрузчика или работе с SparkServerFactory как-то устраняя SparkBase.

+0

В случае, если такие экземпляры имеют одинаковый номер порта. Когда вы запускаете искровой экземпляр, он должен запускаться на своем собственном порту. –

+1

Нет, это происходит, когда вы пытаетесь инициализировать второй, независимо от того, был ли тот же порт или нет. Первая инициализация устанавливает флаг в true, и с этой точки большинство методов настройки блокируются. – jabal

+0

У меня была такая же проблема при выполнении интеграционных тестов с помощью sparkjava. В качестве обходного решения обязательно установите forkCount = 1/reuseForks = false для maven отказоустойчивого плагина для выполнения каждого тестового класса в своем собственном процессе JVM (см. Http://maven.apache.org/surefire/maven-surefire-plugin/examples/ вилочных опции-и-параллельно-execution.html) – asmaier

ответ

4

С Спарк 2.5 вы можете использовать ignite():

http://sparkjava.com/news.html#spark25released

Пример:

public static void main(String[] args) { 
    igniteFirstSpark(); 
    igniteSecondSpark(); 
} 

static void igniteSecondSpark() { 
    Service http = ignite(); 

    http.get("/basicHello", (q, a) -> "Hello from port 4567!"); 
} 

static void igniteFirstSpark() { 
    Service http = ignite() 
         .port(8080) 
         .threadPool(20); 

    http.get("/configuredHello", (q, a) -> "Hello from port 8080!"); 
} 

Я лично инициализировать их что-то вроде этого:

import spark.Service 

public static void main(String[] args) { 
    Service service1 = Service.ignite().port(8080).threadPool(20) 
    Service service2 = Service.ignite().port(8081).threadPool(10) 
} 

я рекомендую прочитать о how to use those services outside your main method, который я думаю, было бы очень полезно здесь.

1

Трюк состоит в том, чтобы игнорировать внешнюю статическую оболочку вокруг Искры, реализованную в 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, в вашем приложении.

 Смежные вопросы

  • Нет связанных вопросов^_^