use of com.alibaba.nacos.common.notify.Event in project nacos by alibaba.
the class DistributedDatabaseOperateImpl method init.
protected void init() throws Exception {
this.dataSourceService = (LocalDataSourceServiceImpl) DynamicDataSource.getInstance().getDataSource();
// Because in Raft + Derby mode, ensuring data consistency depends on the Raft's
// log playback and snapshot recovery capabilities, and the last data must be cleared
this.dataSourceService.cleanAndReopenDerby();
this.jdbcTemplate = dataSourceService.getJdbcTemplate();
this.transactionTemplate = dataSourceService.getTransactionTemplate();
// Registers a Derby Raft state machine failure event for node degradation processing
NotifyCenter.registerToSharePublisher(RaftDbErrorEvent.class);
// Register the snapshot load event
NotifyCenter.registerToSharePublisher(DerbyLoadEvent.class);
NotifyCenter.registerSubscriber(new Subscriber<RaftDbErrorEvent>() {
@Override
public void onEvent(RaftDbErrorEvent event) {
dataSourceService.setHealthStatus("DOWN");
}
@Override
public Class<? extends Event> subscribeType() {
return RaftDbErrorEvent.class;
}
});
NotifyCenter.registerToPublisher(ConfigDumpEvent.class, NotifyCenter.ringBufferSize);
NotifyCenter.registerSubscriber(new DumpConfigHandler());
this.protocol.addRequestProcessors(Collections.singletonList(this));
LogUtil.DEFAULT_LOG.info("use DistributedTransactionServicesImpl");
}
use of com.alibaba.nacos.common.notify.Event in project nacos by alibaba.
the class NamingEventPublisher method handleEvent.
private void handleEvent(Event event) {
Class<? extends Event> eventType = event.getClass();
Set<Subscriber<? extends Event>> subscribers = subscribes.get(eventType);
if (null == subscribers) {
if (Loggers.EVT_LOG.isDebugEnabled()) {
Loggers.EVT_LOG.debug("[NotifyCenter] No subscribers for slow event {}", eventType.getName());
}
return;
}
for (Subscriber subscriber : subscribers) {
notifySubscriber(subscriber, event);
}
}
use of com.alibaba.nacos.common.notify.Event in project nacos by alibaba.
the class ServerMemberManager method memberChange.
synchronized boolean memberChange(Collection<Member> members) {
if (members == null || members.isEmpty()) {
return false;
}
boolean isContainSelfIp = members.stream().anyMatch(ipPortTmp -> Objects.equals(localAddress, ipPortTmp.getAddress()));
if (isContainSelfIp) {
isInIpList = true;
} else {
isInIpList = false;
members.add(this.self);
Loggers.CLUSTER.warn("[serverlist] self ip {} not in serverlist {}", self, members);
}
// If the number of old and new clusters is different, the cluster information
// must have changed; if the number of clusters is the same, then compare whether
// there is a difference; if there is a difference, then the cluster node changes
// are involved and all recipients need to be notified of the node change event
boolean hasChange = members.size() != serverList.size();
ConcurrentSkipListMap<String, Member> tmpMap = new ConcurrentSkipListMap<>();
Set<String> tmpAddressInfo = new ConcurrentHashSet<>();
for (Member member : members) {
final String address = member.getAddress();
Member existMember = serverList.get(address);
if (existMember == null) {
hasChange = true;
tmpMap.put(address, member);
} else {
// to keep extendInfo and abilities that report dynamically.
tmpMap.put(address, existMember);
}
if (NodeState.UP.equals(member.getState())) {
tmpAddressInfo.add(address);
}
}
serverList = tmpMap;
memberAddressInfos = tmpAddressInfo;
Collection<Member> finalMembers = allMembers();
// that the event publication is sequential
if (hasChange) {
Loggers.CLUSTER.warn("[serverlist] updated to : {}", finalMembers);
MemberUtil.syncToFile(finalMembers);
Event event = MembersChangeEvent.builder().members(finalMembers).build();
NotifyCenter.publishEvent(event);
} else {
if (Loggers.CLUSTER.isDebugEnabled()) {
Loggers.CLUSTER.debug("[serverlist] not updated, is still : {}", finalMembers);
}
}
return hasChange;
}
use of com.alibaba.nacos.common.notify.Event in project nacos by alibaba.
the class ServerMemberManager_ITCase method testMemberHealthCheck.
@Test
public void testMemberHealthCheck() throws Exception {
AtomicReference<Collection<Member>> healthMembers = new AtomicReference<>();
CountDownLatch first = new CountDownLatch(1);
CountDownLatch second = new CountDownLatch(1);
NotifyCenter.registerSubscriber(new Subscriber<MembersChangeEvent>() {
@Override
public void onEvent(MembersChangeEvent event) {
System.out.println(event);
healthMembers.set(MemberUtil.selectTargetMembers(event.getMembers(), member -> !NodeState.DOWN.equals(member.getState())));
if (first.getCount() == 1) {
first.countDown();
return;
}
if (second.getCount() == 1) {
second.countDown();
}
}
@Override
public Class<? extends Event> subscribeType() {
return MembersChangeEvent.class;
}
});
String firstIp = "127.0.0.1:8847";
String secondIp = "127.0.0.1:8848";
String thirdIp = "127.0.0.1:8849";
Map<String, Member> map = new HashMap<>(4);
map.put(firstIp, Member.builder().ip("127.0.0.1").port(8847).state(NodeState.UP).build());
map.put(secondIp, Member.builder().ip("127.0.0.1").port(8848).state(NodeState.UP).build());
map.put(thirdIp, Member.builder().ip("127.0.0.1").port(8849).state(NodeState.UP).build());
Set<Member> firstMemberList = new HashSet<>(map.values());
memberManager.memberJoin(map.values());
first.await();
Set<Member> copy = new HashSet<>(firstMemberList);
copy.removeAll(healthMembers.get());
Assert.assertEquals(2, copy.size());
Member member = map.get(firstIp);
member.setState(NodeState.DOWN);
Assert.assertTrue(memberManager.update(member));
second.await();
copy = new HashSet<>(firstMemberList);
copy.removeAll(healthMembers.get());
Assert.assertEquals(3, copy.size());
Assert.assertTrue(copy.contains(map.get(firstIp)));
}
use of com.alibaba.nacos.common.notify.Event in project nacos by alibaba.
the class ConfigDerbyRaft_DITCase method test_h_derby_has_error.
@Test
public void test_h_derby_has_error() throws Exception {
ThreadUtils.sleep(5000);
boolean result = iconfig7.publishConfig("raft_test_raft_error", "cluster_test_1", "this.is.raft_cluster=lessspring_7");
Assert.assertTrue(result);
NotifyCenter.registerToPublisher(RaftDbErrorRecoverEvent.class, 8);
CountDownLatch latch1 = new CountDownLatch(1);
NotifyCenter.registerSubscriber(new Subscriber<RaftDbErrorEvent>() {
@Override
public void onEvent(RaftDbErrorEvent event) {
latch1.countDown();
}
@Override
public Class<? extends Event> subscribeType() {
return RaftDbErrorEvent.class;
}
});
NotifyCenter.publishEvent(new RaftDbErrorEvent());
latch1.await(10_000L, TimeUnit.MILLISECONDS);
result = iconfig7.publishConfig("raft_test_raft_error", "cluster_test_1", "this.is.raft_cluster=lessspring_7");
Assert.assertFalse(result);
CountDownLatch latch2 = new CountDownLatch(1);
NotifyCenter.registerSubscriber(new Subscriber<RaftDbErrorRecoverEvent>() {
@Override
public void onEvent(RaftDbErrorRecoverEvent event) {
latch2.countDown();
}
@Override
public Class<? extends Event> subscribeType() {
return RaftDbErrorRecoverEvent.class;
}
});
NotifyCenter.publishEvent(new RaftDbErrorRecoverEvent());
latch2.await(10_000L, TimeUnit.MILLISECONDS);
result = iconfig7.publishConfig("raft_test_raft_error", "cluster_test_1", "this.is.raft_cluster=lessspring_7");
Assert.assertTrue(result);
}
Aggregations