我需要使用嵌入式 tomcat 使用不同的端口实例化相同的 spring boot 应用程序两次,以便这两个实例使用另一个 rest api。目标是模拟两个具有与两个玩家相同逻辑的独立程序。我尝试了以下方法: SpringApplicationBuilder playerOne = new SpringApplicationBuilder(GameApplication.class) .properties("server.port:" + "8080", "app.name:" + "Player1", "spring.jmx.enable:false"); SpringApplicationBuilder playerTwo = new SpringApplicationBuilder(GameApplication.class) .properties("server.port:" + "8081", "app.name:" + "Player2", "spring.jmx.enable:false"); ConfigurableApplicationContext run1 = playerOne.run(); ConfigurableApplicationContext run2 = playerTwo.run();我得到了 javax.management.InstanceAlreadyExistsException怎么可能做到这一点?它不应该启动两个不同的服务器吗?
4 回答

叮当猫咪
TA贡献1776条经验 获得超12个赞
运行 jar 并将端口作为输入参数。
然后您可以使用两个已知端口启动两个应用程序。
java -jar myServer.jar --server.port=8080 java -jar myServer.jar --server.port=8081

鸿蒙传说
TA贡献1865条经验 获得超7个赞
您将在尝试做的事情上遇到很多问题。我不认为 Spring 被设计为允许在同一进程中使用两个独立的 Spring 应用程序。
您遇到的第一个可能是这两个应用程序之间的许多冲突。您会收到“javax.management.InstanceAlreadyExistsException”,因为 Spring 具有 JMX 管理 bean 注册表的全局概念。当 Spring 应用程序启动时,它会以特定名称向该服务注册一堆东西。当您的应用程序的第二个副本尝试向注册表注册第一个应用程序已使用相同名称注册的内容时,您会收到此错误。
应用程序本身以这种方式注册,名称为“SpringApplication”。当我运行我的 Spring 应用程序时,这是第一个注册的东西。我的猜测是您的“应用程序”第二次尝试使用 JMX 注册此名称时失败了。
如果您真的必须以这种方式分解代码,为什么不将这两个应用程序放在它们自己的构建中并分别运行呢?或者,如果它们是完全相同的应用程序,只需运行两个副本,正如@Toerktumlare 在他的回答中所建议的那样。

MMTTMM
TA贡献1869条经验 获得超4个赞
$ mvn spring-boot:run $ env SERVER_PORT=8001 mvn spring-boot:run $ env SERVER_PORT=8002 mvn spring-boot:run
添加回答
举报
0/150
提交
取消