Spring boot spring integration leader election在向控制总线发送消息时使用jdbc锁注册表撤销领导权

Spring boot spring integration leader election在向控制总线发送消息时使用jdbc锁注册表撤销领导权,spring-boot,spring-integration,Spring Boot,Spring Integration,我已经构建了这个示例POC,在这里我想在领导人当选时启动spring integration jdbc入站通道适配器。我确实看到,当我添加发送控制总线消息以启动jdbc入站通道适配器的代码时,它会立即取消引导,因此在没有任何活动引导运行的状态下运行。如果我注释掉发送消息到控制总线的代码,那么集群中总是有一个leader在运行 这是完整的POC代码 这就是我在自定义候选对象中所做的 @Override public void onGranted(Context context) { su

我已经构建了这个示例POC,在这里我想在领导人当选时启动spring integration jdbc入站通道适配器。我确实看到,当我添加发送控制总线消息以启动jdbc入站通道适配器的代码时,它会立即取消引导,因此在没有任何活动引导运行的状态下运行。如果我注释掉发送消息到控制总线的代码,那么集群中总是有一个leader在运行

这是完整的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);
}
@覆盖
公共void onGranted(上下文){
super.onGranted(上下文);
System.out.println(“***领导权授予***”);
System.out.println(“启动JDBC轮询器”);
Message startMsg=MessageBuilder.withPayload(“@jdbpoller.start()”).build();
systemMessageChannel.send(startMsg);
System.out.println(“发送启动消息”);
}
@凌驾
已撤销的公共void(上下文){
System.out.println(“*********”);
System.out.println(“停止JDBC轮询器”);
Message stringMessage=MessageBuilder.withPayload(@jdbpoller.stop()).build();
systemMessageChannel.send(stringMessage);
System.out.println(“发送关机消息”);
super.on(上下文);
}

有人能告诉我这个代码有什么问题吗?

看起来你的问题在这里:

@Bean
public LockRegistryLeaderInitiator leaderInitiator(LockRegistry lockRegistry) {
    return new LockRegistryLeaderInitiator(lockRegistry, new LeaderCandidate());
}
您将看到如何将您的
LeaderCandidate
创建为一个内嵌对象。由于这应该涉及依赖项注入,因此必须将其声明为bean:

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

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

在启动应用程序的新实例时,也不要考虑删除表。 多谢你,阿泰姆。这就解决了问题。是的,我不会在每次实例启动时都重新创建表。