Search in sources :

Example 6 with Event

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;
        }
    });
}
Also used : InstancesChangeEvent(com.alibaba.nacos.client.naming.event.InstancesChangeEvent) ReentrantLock(java.util.concurrent.locks.ReentrantLock) Condition(java.util.concurrent.locks.Condition) Optional(java.util.Optional) InstancesChangeEvent(com.alibaba.nacos.client.naming.event.InstancesChangeEvent) Event(com.alibaba.nacos.common.notify.Event) ReentrantLock(java.util.concurrent.locks.ReentrantLock) Lock(java.util.concurrent.locks.Lock) PostConstruct(javax.annotation.PostConstruct)

Example 7 with Event

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();
    }
}
Also used : TpsControlRuleChangeEvent(com.alibaba.nacos.core.remote.control.TpsControlRuleChangeEvent) Subscriber(com.alibaba.nacos.common.notify.listener.Subscriber) ConnectionLimitRuleChangeEvent(com.alibaba.nacos.core.remote.event.ConnectionLimitRuleChangeEvent) TpsControlRuleChangeEvent(com.alibaba.nacos.core.remote.control.TpsControlRuleChangeEvent) ConnectionLimitRuleChangeEvent(com.alibaba.nacos.core.remote.event.ConnectionLimitRuleChangeEvent) LocalDataChangeEvent(com.alibaba.nacos.config.server.model.event.LocalDataChangeEvent) Event(com.alibaba.nacos.common.notify.Event) LocalDataChangeEvent(com.alibaba.nacos.config.server.model.event.LocalDataChangeEvent) Test(org.junit.Test)

Example 8 with Event

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);
}
Also used : Subscriber(com.alibaba.nacos.common.notify.listener.Subscriber) ConfigDataChangeEvent(com.alibaba.nacos.config.server.model.event.ConfigDataChangeEvent) Event(com.alibaba.nacos.common.notify.Event) AtomicReference(java.util.concurrent.atomic.AtomicReference) ConfigDataChangeEvent(com.alibaba.nacos.config.server.model.event.ConfigDataChangeEvent) Test(org.junit.Test)

Example 9 with Event

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);
}
Also used : Event(com.alibaba.nacos.common.notify.Event) Test(org.junit.Test)

Example 10 with Event

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());
}
Also used : MembersChangeEvent(com.alibaba.nacos.core.cluster.MembersChangeEvent) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) MembersChangeEvent(com.alibaba.nacos.core.cluster.MembersChangeEvent) Event(com.alibaba.nacos.common.notify.Event) BeforeClass(org.junit.BeforeClass) AfterClass(org.junit.AfterClass) CountDownLatch(java.util.concurrent.CountDownLatch) Member(com.alibaba.nacos.core.cluster.Member) Test(org.junit.Test)

Aggregations

Event (com.alibaba.nacos.common.notify.Event)11 Test (org.junit.Test)6 Subscriber (com.alibaba.nacos.common.notify.listener.Subscriber)3 CountDownLatch (java.util.concurrent.CountDownLatch)3 BeforeClass (org.junit.BeforeClass)3 RaftDbErrorEvent (com.alibaba.nacos.config.server.model.event.RaftDbErrorEvent)2 Member (com.alibaba.nacos.core.cluster.Member)2 MembersChangeEvent (com.alibaba.nacos.core.cluster.MembersChangeEvent)2 AtomicReference (java.util.concurrent.atomic.AtomicReference)2 AfterClass (org.junit.AfterClass)2 InstancesChangeEvent (com.alibaba.nacos.client.naming.event.InstancesChangeEvent)1 ConcurrentHashSet (com.alibaba.nacos.common.utils.ConcurrentHashSet)1 ConfigDataChangeEvent (com.alibaba.nacos.config.server.model.event.ConfigDataChangeEvent)1 ConfigDumpEvent (com.alibaba.nacos.config.server.model.event.ConfigDumpEvent)1 DerbyLoadEvent (com.alibaba.nacos.config.server.model.event.DerbyLoadEvent)1 LocalDataChangeEvent (com.alibaba.nacos.config.server.model.event.LocalDataChangeEvent)1 RaftDbErrorRecoverEvent (com.alibaba.nacos.config.server.model.event.RaftDbErrorRecoverEvent)1 DumpConfigHandler (com.alibaba.nacos.config.server.service.dump.DumpConfigHandler)1 TpsControlRuleChangeEvent (com.alibaba.nacos.core.remote.control.TpsControlRuleChangeEvent)1 ConnectionLimitRuleChangeEvent (com.alibaba.nacos.core.remote.event.ConnectionLimitRuleChangeEvent)1