为了账号安全,请及时绑定邮箱和手机立即绑定

是否可以使用不同的端口实例化同一个 spring-boot 应用程序两次?

是否可以使用不同的端口实例化同一个 spring-boot 应用程序两次?

慕妹3242003 2023-03-02 16:10:48
我需要使用嵌入式 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


查看完整回答
反对 回复 2023-03-02
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

您将在尝试做的事情上遇到很多问题。我不认为 Spring 被设计为允许在同一进程中使用两个独立的 Spring 应用程序。

您遇到的第一个可能是这两个应用程序之间的许多冲突。您会收到“javax.management.InstanceAlreadyExistsException”,因为 Spring 具有 JMX 管理 bean 注册表的全局概念。当 Spring 应用程序启动时,它会以特定名称向该服务注册一堆东西。当您的应用程序的第二个副本尝试向注册表注册第一个应用程序已使用相同名称注册的内容时,您会收到此错误。

应用程序本身以这种方式注册,名称为“SpringApplication”。当我运行我的 Spring 应用程序时,这是第一个注册的东西。我的猜测是您的“应用程序”第二次尝试使用 JMX 注册此名称时失败了。

如果您真的必须以这种方式分解代码,为什么不将这两个应用程序放在它们自己的构建中并分别运行呢?或者,如果它们是完全相同的应用程序,只需运行两个副本,正如@Toerktumlare 在他的回答中所建议的那样。


查看完整回答
反对 回复 2023-03-02
?
MMTTMM

TA贡献1869条经验 获得超4个赞

$ mvn spring-boot:run

$ env SERVER_PORT=8001 mvn spring-boot:run

$ env SERVER_PORT=8002 mvn spring-boot:run


查看完整回答
反对 回复 2023-03-02
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

将 server.port=0 添加到您的 application.properties。它将动态分配端口。



查看完整回答
反对 回复 2023-03-02
  • 4 回答
  • 0 关注
  • 256 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号