有没有办法在同一个jvm中运行sparkjava服务器的多个示例?我在一个“插件”软件中使用它,基于外部环境,我的插件的多个示例可能会启动,然后导致
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
.
3条答案
按热度按时间xsuvu9jc1#
诀窍是忽略在spark中实现的外部静态外壳
spark.Spark
直接与内部spark.webserver.SparkServer
. 代码中有一些障碍需要解决,例如。spark.webserver.JettyHandler
不是公共的,所以您不能从代码中示例化它,但是您可以通过将自己的类放入该包中来扩展它并将其公开。所以解决方案是这样的:
需要在代码库中复制wrap方法:
如果你的应用程序中需要多个spark服务器,这似乎是一个可行的解决方法。
mctunoxg2#
我用spark运行单元测试时遇到了这个问题,为了解决这个问题,我修改了
pom.xml
文件。forkCount=1 reuseForks=false
```org.apache.maven.plugins
maven-surefire-plugin
${surefire.version}
org.junit.platform
junit-platform-surefire-provider
${junit.platform.version}
1
false
ifsvaxew3#
从spark 2.5你可以使用
ignite()
:http://sparkjava.com/news.html#spark25released
例子:
我亲自初始化它们如下:
我建议您阅读有关如何在main方法之外使用这些服务的内容,我认为这在这里会很有用。