如何在两个节点之间使用 HazelCast 同步方法?

How to synchronize method with HazelCast between two nodes?

Spring Boot个项目。项目在两个节点上工作。我有使用调度程序发送消息邮件的方法。消息发送了 2 次,因为有两个节点在工作。我怎样才能使用 HazelCast 配置该方法,使其只在一个更优化的节点上工作一次?网上的文档和文章很少。我已经在项目中添加了HazelCast,节点之间互相看到了

HazelCast.yaml:

hazelcast:
  network:
    join:
      multicast:
        enabled: true

Gradle:

    implementation group: 'com.hazelcast', name: 'hazelcast-all', version: '4.2'

ForExampleMyMethodForSendMail:

@Scheduled(cron = "0 0 9 * * ?")
public void senMail(MailDTO mailDTO) {
   mailService.sendMail(mailDTO);
}

使用 Hazelcast 分布式锁功能和您自己的代码来确保您只发送一次邮件。 https://docs.hazelcast.com/imdg/4.2/cp-subsystem/fencedlock.html

我创建了一个distributed map,可以同时看到两个nodes(此功能由HazelCast提供)。之后我就开始根据action的name和action的time的类型把keyvalue放在这个map里面。所以第二个节点查看地图,如果动作已经执行,它就不再执行它。所以我解决了重复消息的问题。

我创建分布式地图:

@Configuration
public class HazelCastConfiguration {

    @Bean
    public Config hazelCastConfig() {
        return new Config();
    }

    @Bean
    public HazelcastInstance hazelcastInstance(Config hazelCastConfig) {
        return Hazelcast.newHazelcastInstance(hazelCastConfig);
    }

    @Bean
    public Map<String, LocalDateTime> timeMap(@Qualifier("hazelcastInstance") HazelcastInstance hazelcastInstance) {
        return hazelcastInstance.getMap("hazelcastTimeMap");
    }
}

然后我使用 AutoWired 处理地图:

private Map<String, LocalDateTime> timeMap;

@AutoWired
public void setTimeMap(Map<String, LocalDateTime> timeMap) {
        this.timeMap = timeMap;
    }