use of com.alibaba.nacos.common.notify.Event in project muses by acgist.
the class ShutdownListener method init.
@PostConstruct
public void init() {
if (!this.shutdownEnable) {
log.info("服务没有配置自动关机:{}", this.serviceName);
return;
}
log.info("启动服务关机配置:{}-{}", this.serviceName, this.shutdownGracefully);
NotifyCenter.registerSubscriber(new Subscriber<InstancesChangeEvent>() {
/**
* 锁
*/
private final Lock lock = new ReentrantLock();
/**
* 条件
*/
private final Condition condition = this.lock.newCondition();
@Override
public void onEvent(InstancesChangeEvent event) {
final Optional<Instance> optional = event.getHosts().stream().filter(ShutdownListener.this::self).findFirst().or(ShutdownListener.this::findSelf);
if (optional.isPresent()) {
this.up();
} else {
this.down();
}
}
/**
* 启动
*/
private void up() {
if (!ShutdownListener.this.shutdown) {
log.debug("实例有效:已经生效:{}", ShutdownListener.this.serviceName);
return;
}
log.debug("实例有效:重置关闭事件:{}", ShutdownListener.this.serviceName);
ShutdownListener.this.shutdown = false;
try {
this.lock.lock();
this.condition.signalAll();
} finally {
this.lock.unlock();
}
}
/**
* 关闭
*/
private void down() {
if (ShutdownListener.this.shutdown) {
log.debug("实例无效:已经启动关闭事件:{}", ShutdownListener.this.serviceName);
return;
}
log.debug("实例无效:启动关闭事件:{}-{}", ShutdownListener.this.serviceName, ShutdownListener.this.shutdownGracefully);
ShutdownListener.this.shutdown = true;
ShutdownListener.this.taskExecutor.execute(() -> {
try {
this.lock.lock();
final long remaing = this.condition.awaitNanos(TimeUnit.SECONDS.toNanos(ShutdownListener.this.shutdownGracefully));
if (ShutdownListener.this.shutdown) {
log.info("实例无效:关闭实例:{}", ShutdownListener.this.serviceName);
// 关闭NacosServiceManager.nacosServiceShutDown()会出现空指针异常:2021-08以后版本已经修复
// 阻塞关闭:不用再次等待
ShutdownListener.this.context.close();
// System.exit(0);
// 强制关机
Runtime.getRuntime().halt(0);
} else {
log.debug("实例有效:忽略关闭事件:{}-{}", ShutdownListener.this.serviceName, TimeUnit.NANOSECONDS.toSeconds(remaing));
}
} catch (InterruptedException e) {
log.error("关闭实例异常", e);
} finally {
this.lock.unlock();
}
});
}
@Override
public Class<? extends Event> subscribeType() {
return InstancesChangeEvent.class;
}
});
}
use of com.alibaba.nacos.common.notify.Event in project nacos by alibaba.
the class InternalConfigChangeNotifierTest method testOnEvent.
@Test
public void testOnEvent() {
final String groupKey = GroupKey2.getKey("nacos.internal.tps.control_rule_1", "nacos", "tenant");
final String limitGroupKey = GroupKey2.getKey("nacos.internal.tps.nacos.internal.connection.limit.rule", "nacos", "tenant");
NotifyCenter.registerSubscriber(new Subscriber() {
@Override
public void onEvent(Event event) {
ConnectionLimitRuleChangeEvent connectionLimitRuleChangeEvent = (ConnectionLimitRuleChangeEvent) event;
Assert.assertEquals("content", connectionLimitRuleChangeEvent.getLimitRule());
}
@Override
public Class<? extends Event> subscribeType() {
return ConnectionLimitRuleChangeEvent.class;
}
});
NotifyCenter.registerSubscriber(new Subscriber() {
@Override
public void onEvent(Event event) {
TpsControlRuleChangeEvent tpsControlRuleChangeEvent = (TpsControlRuleChangeEvent) event;
Assert.assertEquals("content", tpsControlRuleChangeEvent.getRuleContent());
}
@Override
public Class<? extends Event> subscribeType() {
return TpsControlRuleChangeEvent.class;
}
});
internalConfigChangeNotifier.onEvent(new LocalDataChangeEvent(groupKey));
internalConfigChangeNotifier.onEvent(new LocalDataChangeEvent(limitGroupKey));
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
use of com.alibaba.nacos.common.notify.Event in project nacos by alibaba.
the class ConfigChangePublisherTest method testConfigChangeNotify.
@Test
public void testConfigChangeNotify() throws InterruptedException {
AtomicReference<ConfigDataChangeEvent> reference = new AtomicReference<>();
NotifyCenter.registerToPublisher(ConfigDataChangeEvent.class, NotifyCenter.ringBufferSize);
NotifyCenter.registerSubscriber(new Subscriber() {
@Override
public void onEvent(Event event) {
reference.set((ConfigDataChangeEvent) event);
}
@Override
public Class<? extends Event> subscribeType() {
return ConfigDataChangeEvent.class;
}
});
// nacos is standalone mode and use embedded storage
EnvUtil.setIsStandalone(true);
PropertyUtil.setEmbeddedStorage(true);
ConfigChangePublisher.notifyConfigChange(new ConfigDataChangeEvent("chuntaojun", "chuntaojun", System.currentTimeMillis()));
Thread.sleep(2000);
Assert.assertNotNull(reference.get());
reference.set(null);
// nacos is standalone mode and use external storage
EnvUtil.setIsStandalone(true);
PropertyUtil.setEmbeddedStorage(false);
ConfigChangePublisher.notifyConfigChange(new ConfigDataChangeEvent("chuntaojun", "chuntaojun", System.currentTimeMillis()));
Thread.sleep(2000);
Assert.assertNotNull(reference.get());
reference.set(null);
// nacos is cluster mode and use embedded storage
EnvUtil.setIsStandalone(false);
PropertyUtil.setEmbeddedStorage(true);
ConfigChangePublisher.notifyConfigChange(new ConfigDataChangeEvent("chuntaojun", "chuntaojun", System.currentTimeMillis()));
Thread.sleep(2000);
Assert.assertNull(reference.get());
reference.set(null);
// nacos is cluster mode and use external storage
EnvUtil.setIsStandalone(false);
PropertyUtil.setEmbeddedStorage(false);
ConfigChangePublisher.notifyConfigChange(new ConfigDataChangeEvent("chuntaojun", "chuntaojun", System.currentTimeMillis()));
Thread.sleep(2000);
Assert.assertNotNull(reference.get());
reference.set(null);
}
use of com.alibaba.nacos.common.notify.Event in project nacos by alibaba.
the class ServerConfigChangeEventTest method test.
@Test
public void test() {
Event event = ServerConfigChangeEvent.newEvent();
Assert.assertTrue(event instanceof ServerConfigChangeEvent);
}
use of com.alibaba.nacos.common.notify.Event in project nacos by alibaba.
the class ServerMemberManager_ITCase method testMemberChange.
@Test
public void testMemberChange() throws Exception {
AtomicInteger integer = new AtomicInteger(0);
CountDownLatch latch = new CountDownLatch(1);
NotifyCenter.registerSubscriber(new Subscriber<MembersChangeEvent>() {
@Override
public void onEvent(MembersChangeEvent event) {
integer.incrementAndGet();
latch.countDown();
}
@Override
public Class<? extends Event> subscribeType() {
return MembersChangeEvent.class;
}
});
Collection<Member> members = memberManager.allMembers();
System.out.println(members);
memberManager.memberJoin(members);
members.add(Member.builder().ip("115.159.3.213").port(8848).build());
boolean changed = memberManager.memberJoin(members);
Assert.assertTrue(changed);
latch.await(10_000L, TimeUnit.MILLISECONDS);
Assert.assertEquals(1, integer.get());
}
Aggregations