#spring-boot #spring-integration
#spring-boot #spring-интеграция
Вопрос:
Я создал этот пример POC, в котором я хотел бы запустить адаптер входящего канала spring integration jdbc после избрания лидера. Я вижу, что когда я добавляю код, который отправляет сообщение шины управления для запуска адаптера входящего канала jdbc, он немедленно отменяет лидерство, поэтому запускается в состоянии, когда у меня не работает ни один активный лидер. Если я закомментирую код, который отправляет сообщение на шину управления, тогда у меня всегда будет один лидер, запущенный в кластере.
Вот полный 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. Большое спасибо, Артем. Это решило проблему. И да, я не собираюсь воссоздавать таблицу при каждом запуске экземпляра.