Можно ли дважды создать одно и то же приложение с весенней загрузкой с разными портами? - PullRequest
1 голос
/ 02 июля 2019

Мне нужно дважды создать экземпляр одного и того же приложения с весенней загрузкой на разных портах, используя встроенный tomcat, чтобы эти два экземпляра использовали друг друга остальные 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

Каквозможно ли этого добиться?разве это не должно инициировать два разных сервера?

Ответы [ 3 ]

2 голосов
/ 02 июля 2019

запустите jar и укажите порт в качестве входного аргумента.

тогда вы можете запустить два приложения с двумя известными портами.

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

java -jar myServer.jar --server.port=8081
2 голосов
/ 02 июля 2019

У вас много проблем с тем, что вы пытаетесь сделать.Я не думаю, что Spring был спроектирован так, чтобы разрешить двум независимым приложениям Spring в одном и том же процессе.

Вы столкнулись с первым из многих столкновений между этими двумя приложениями.Вы получаете «javax.management.InstanceAlreadyExistsException», потому что у Spring есть глобальное представление о реестре бина управления JMX.Когда приложение Spring запускается, оно регистрирует кучу вещей с этим сервисом под определенными именами.Вы получаете эту ошибку, когда вторая копия вашего приложения пытается зарегистрировать что-то в реестре, которое первое приложение уже зарегистрировало под тем же именем.

Само приложение регистрируется таким образом под именем «SpringApplication».Когда я запускаю свое приложение Spring, это первое, что регистрируется.Я предполагаю, что ваше «приложение» не работает во второй раз, когда оно пытается зарегистрировать это имя в JMX.

Если вам действительно нужно разбить код таким образом, почему бы не поместить два приложения в их собственныестроит и запускает их отдельно?Или, если это одно и то же приложение, просто запустите две копии, как предлагает @ThomasAndolf в своем ответе.

0 голосов
/ 02 июля 2019

Добавьте server.port = 0 к вашему application.properties. Он будет выделять порт динамически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...