如何在两个节点之间使用 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
的类型把key
value
放在这个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;
}
有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
的类型把key
value
放在这个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;
}