美文网首页
Soul源码阅读 数据同步之http长轮询同步【第九天】

Soul源码阅读 数据同步之http长轮询同步【第九天】

作者: cutieagain | 来源:发表于2021-01-24 02:04 被阅读0次

    类似zk同步,都会使用配置进行维护信息
    因为有

    @ConditionalOnProperty(prefix = "soul.sync.http", name = "url")
    

    所以配置要加上

    http:
        url : http://localhost:9095
    

    才能启动,很尴尬的是没启动起来。
    报错:

    Caused by: org.springframework.web.client.HttpClientErrorException$Unauthorized: 401 : [{"code":600,"message":"token is error"}
    

    这同步为啥还要token?
    admin中需要加

    soul :
        sync:
          http:
            enabled: true
    

    启动成功

    @Configuration
    @ConditionalOnClass(HttpSyncDataService.class)
    @ConditionalOnProperty(prefix = "soul.sync.http", name = "url")
    @Slf4j
    public class HttpSyncDataConfiguration {
    
        /**
         * Http sync data service.
         *
         * @param httpConfig        the http config
         * @param pluginSubscriber the plugin subscriber
         * @param metaSubscribers   the meta subscribers
         * @param authSubscribers   the auth subscribers
         * @return the sync data service
         */
        @Bean
        // http长轮询服务初始化
        public SyncDataService httpSyncDataService(final ObjectProvider<HttpConfig> httpConfig, final ObjectProvider<PluginDataSubscriber> pluginSubscriber,
                                               final ObjectProvider<List<MetaDataSubscriber>> metaSubscribers, final ObjectProvider<List<AuthDataSubscriber>> authSubscribers) {
            log.info("you use http long pull sync soul data");
            return new HttpSyncDataService(Objects.requireNonNull(httpConfig.getIfAvailable()), Objects.requireNonNull(pluginSubscriber.getIfAvailable()),
                    metaSubscribers.getIfAvailable(Collections::emptyList), authSubscribers.getIfAvailable(Collections::emptyList));
        }
    
        /**
         * Http config http config.
         *
         * @return the http config
         */
        @Bean
        @ConfigurationProperties(prefix = "soul.sync.http")
        // http长轮询配置
        public HttpConfig httpConfig() {
            return new HttpConfig();
        }
    }
    

    HttpSyncDataService中第一次启动会进行初始化以及服务启动

    private void start() {
            // It could be initialized multiple times, so you need to control that.
            // 为什么会初始化很多次?
            if (RUNNING.compareAndSet(false, true)) {
                // fetch all group configs.
                this.fetchGroupConfig(ConfigGroupEnum.values());
                int threadSize = serverList.size();
                this.executor = new ThreadPoolExecutor(threadSize, threadSize, 60L, TimeUnit.SECONDS,
                        new LinkedBlockingQueue<>(),
                        SoulThreadFactory.create("http-long-polling", true));
                // start long polling, each server creates a thread to listen for changes.
                this.serverList.forEach(server -> this.executor.execute(new HttpLongPollingTask(server)));
            } else {
                log.info("soul http long polling was started, executor=[{}]", executor);
            }
        }
    

    线程池以守护线程的方式运行,一直保活,在服务进行初始化的情况下会一直进行轮询,

    相关文章

      网友评论

          本文标题:Soul源码阅读 数据同步之http长轮询同步【第九天】

          本文链接:https://www.haomeiwen.com/subject/yrvpzktx.html