Не существует стандартного выпадающего решения для того, что вы просите.
Технически это может быть достигнуто многими способами - как внутри Java-экосистемы, так и за ее пределами, например. Формирование кластера Jgroups, Zookeeper или простой Redis или другой K / V-сервер, где каждый экземпляр сервера регистрируется при запуске и подписывается на изменения в группе кластера.
Поддержка и необходимые усилия будут отличаться. Общий подход состоял бы в том, чтобы использовать некоторый крюк запуска, например Инициализация контейнера сервлета или EJB @Startup @Singleton
для связи со службой обнаружения топологии (например, с вашим сервером redis), для предоставления информации о вашем экземпляре и запроса информации о других уже активных экземплярах. Если вам нужны выборы лидера, вы можете использовать множество алгоритмов, например, первым пришел - первым обслужен или основан на голосовании. Затем вам нужно подписаться и активно выслушивать изменения в топологии и, возможно, предоставить какую-то метрику здоровья - например, периодически сообщайте другим, что ваш экземпляр все еще активен
В целом, не могли бы вы уточнить, зачем вашему приложению нужны знания о других экземплярах того же типа? Нужны ли вам выборы Master или единый кластер HA? Лучшая практика для построения стабильных масштабируемых решений - держать приложение в режиме без состояния и не знать о деталях масштабирования.
Функции, которые должны выполняться только последовательно или на одном узле одновременно, могут быть извлечены в выделенную услугу, например, пакетный сервис, сервис планировщика и т. д.
Большинство поставщиков серверов JEE предлагают для этого какое-то специальное решение, например Служба JBoss HASingleton или однокомпонентное развертывание HA (приложение всегда будет работать только на одном экземпляре в кластере), которое также заботится о восстановлении после отказа.