Spring LockRegistryLeaderInitiator获得领导角色

时间:2018-05-28 12:44:17

标签: spring spring-integration

我目前正在使用基于以下内容的实现:

  

org.springframework.integration.support.leader.LockRegistryLeaderInitiator

支持不同的领导者候选角色,以便只允许每个角色的领导者节点执行调度程序。总的来说,集群将有两个领导节点:一个用于调度1,一个用于调度2角色。将分配每个角色以执行不同的调度程序。您可以在下面找到xml配置:

<bean id="scheduling1LeaderInitiator" class="org.springframework.integration.support.leader.LockRegistryLeaderInitiator">
    <constructor-arg name="locks" ref="jdbcLockRegistry"/>
    <constructor-arg name="candidate" ref="scheduling1LeaderCandidate"/>
</bean>
<bean id="scheduling1LeaderCandidate" class="org.springframework.integration.leader.DefaultCandidate">
    <constructor-arg name="id" value="#{T(java.util.UUID).randomUUID().toString()}"/>
    <constructor-arg name="role" value="scheduling1"/>
</bean>


<bean id="scheduling2LeaderInitiator" class="org.springframework.integration.support.leader.LockRegistryLeaderInitiator">
    <constructor-arg name="locks" ref="jdbcLockRegistry"/>
    <constructor-arg name="candidate" ref="scheduling2LeaderCandidate"/>
</bean>
<bean id="scheduling2LeaderCandidate" class="org.springframework.integration.leader.DefaultCandidate">
    <constructor-arg name="id" value="#{T(java.util.UUID).randomUUID().toString()}"/>
    <constructor-arg name="role" value="scheduling2"/>
</bean>

虽然我可以在LockRegistryLeaderInitiator构造函数中设置候选者,但是没有办法取回候选人的角色,或者只是我遗漏了一些东西。我希望Context能够提供对这些信息的访问,因为每个角色分配了几个领导者实例。例如:

if (leaderInitiator.getContext().isLeader()) {
    String role = leaderInitiator.getContext().getRole();
}

目前在Spring实现中缺失。

Spring集成版:5.0.5.RELEASE

1 个答案:

答案 0 :(得分:2)

似乎是一个合理的要求;请打开“改进”JIRA Issue

或许有点难看,但作为一种解决方法,你可以解析它context.toString() ...

@Override
public String toString() {
    return "LockContext{role=" + LockRegistryLeaderInitiator.this.candidate.getRole() +
            ", id=" + LockRegistryLeaderInitiator.this.candidate.getId() +
            ", isLeader=" + isLeader() + "}";
}

您必须保护解析器代码不要取回NULL_CONTEXT lambda。