выборы лидера интеграции spring, отменяющие лидерство с помощью реестра блокировки jdbc при отправке сообщения на шину управления

#spring-boot #spring-integration

#spring-boot #spring-интеграция

Вопрос:

Я создал этот пример POC, в котором я хотел бы запустить адаптер входящего канала spring integration jdbc после избрания лидера. Я вижу, что когда я добавляю код, который отправляет сообщение шины управления для запуска адаптера входящего канала jdbc, он немедленно отменяет лидерство, поэтому запускается в состоянии, когда у меня не работает ни один активный лидер. Если я закомментирую код, который отправляет сообщение на шину управления, тогда у меня всегда будет один лидер, запущенный в кластере.

Вот полный POC-код

POC выборов лидера

Это то, что я делаю в моем пользовательском объекте-кандидате

 @Override
public void onGranted(Context context) {
    super.onGranted(context);
    System.out.println("*** Leadership granted ***");
    System.out.println("STARTING JDBC POLLER");
    Message<String> startMsg = MessageBuilder.withPayload("@jdbcPoller.start()").build();
    systemMessageChannel.send(startMsg);
    System.out.println("STARTUP MESSAGE SENT");

}

 @Override
public void onRevoked(Context context) {

    System.out.println("*** Leadership revoked ***");
    System.out.println("STOPPING JDBC POLLER");
    Message<String> stringMessage = MessageBuilder.withPayload("@jdbcPoller.stop()").build();
    systemMessageChannel.send(stringMessage);
    System.out.println("SHUTDOWN MESSAGE SENT");
    super.onRevoked(context);
}
  

Кто-нибудь, пожалуйста, может сказать мне, что не так с этим кодом?

Ответ №1:

Похоже, ваша проблема здесь:

 @Bean
public LockRegistryLeaderInitiator leaderInitiator(LockRegistry lockRegistry) {
    return new LockRegistryLeaderInitiator(lockRegistry, new LeaderCandidate());
}
  

Вы видите, как вы создаете свой LeaderCandidate как встроенный объект. Поскольку предполагается, что это связано с внедрением зависимости, вы должны объявить это как компонент:

 @Bean
public LockRegistryLeaderInitiator leaderInitiator(LockRegistry lockRegistry) {
    return new LockRegistryLeaderInitiator(lockRegistry, leaderCandidate());
}

@Bean
public Candidate leaderCandidate() {
    return new LeaderCandidate();
}
  

Также учтите, что не удаляйте таблицы при запуске нового экземпляра вашего приложения.

Комментарии:

1. Большое спасибо, Артем. Это решило проблему. И да, я не собираюсь воссоздавать таблицу при каждом запуске экземпляра.