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

时间:2019-07-01 23:37:29

标签: java spring spring-boot

我需要使用嵌入式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 个答案:

答案 0 :(得分:2)

您尝试做的事情会遇到很多问题。我不认为Spring旨在在同一过程中允许两个独立的Spring应用程序。

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

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

如果您真的必须以这种方式分解代码,为什么不将这两个应用程序放在各自的版本中并分别运行呢?或者,如果它们是相同的应用程序,则只需运行两个副本,如@ThomasAndolf在其答案中建议的那样。

答案 1 :(得分:2)

运行jar并将端口作为输入参数。

然后您可以使用两个已知端口启动两个应用程序。

java -jar myServer.jar --server.port=8080

java -jar myServer.jar --server.port=8081

答案 2 :(得分:0)

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

答案 3 :(得分:0)

x=sc.nextInt();
sc.nextLine();