soul源码阅读(十八)自定义helloworld数据同步

目录

自定义说明

soul admin自定义

soul bootstrap自定义

总结


自定义说明

按照我们前文提到的一个源码的阅读,光光读懂它还不够,需要尝试着去用它,加深对它的理解。前面我们阅读了soul websocket同步和zookeeper同步的方式,今天来自定义一个helloworld同步的方式,本来确实底层想用一个新的工具来进行同步,但一时间没找到合适的,那么底层我们还是选用websocket来进行同步吧,也不太影响我们上手使用去加深对它的理解。

soul admin自定义

application.yml修改sync属性如下:

DataSyncConfiguration文件配置如下:

 @Configuration
    @ConditionalOnProperty(name = "soul.sync.helloworld.enabled", havingValue = "true")
    @EnableConfigurationProperties(HelloWorldSyncProperties.class)
    static class HelloWorldListener {

        /**
         * Config event listener data changed listener.
         *
         * @return the data changed listener
         */
        @Bean
        @ConditionalOnMissingBean(WebsocketDataChangedListener.class)
        public HelloWorldDataChangedListener helloWorldDataChangedListener() {
            return new HelloWorldDataChangedListener();
        }

        /**
         * Websocket collector websocket collector.
         *
         * @return the websocket collector
         */
        @Bean
        @ConditionalOnMissingBean(HelloWorldCollector.class)
        public HelloWorldCollector helloWorldCollector() {
            return new HelloWorldCollector();
        }

        /**
         * Server endpoint exporter server endpoint exporter.
         *
         * @return the server endpoint exporter
         */
        @Bean
        @ConditionalOnMissingBean(ServerEndpointExporter.class)
        public ServerEndpointExporter serverEndpointExporter() {
            return new ServerEndpointExporter();
        }
    }

分别新建HelloWorldCollector类和HelloWorldDataChangedListener类,截图如下,HelloWorldCollector加上注解@ServerEndpoint("/helloworld"),声明为helloworld服务站点。HelloWorldDataChangedListener只实现onPluginChanged做下演示。监听器收到事件通知后调用HelloWorldCollector.send方法发送消息。

底层发送消息用的也是websocket机制

启动SoulAdminBootstrap,没错,一个自定义的websocket的helloworld服务站点就起来了。

soul bootstrap自定义

application-local.yml配置属性如下:

自定义一个soul-spring-boot-starter-sync-data-helloworld,结构如下

HelloWorldSyncDataConfiguration配置类用于注册一个WebsocketSyncDataService,service也可以自定义哈,这里就偷了个懒,直接用的原来的service类,增加一个WebsocketConfig读取soul.sync.helloworld的属性,初始化的时候会拿到urls跟服务站点进行连接。

好了,soul-bootstrap模块的pom.xml文件引入starter

启动SoulBootstrapApplication,admin提示已正常连接,但收到bootstrap myself同步的时候报了个空指针异常。

因为websocket同步策略配置了matchIfmissing=true,了解下matchIfMissing属性,它是用来指定如果配置文件中未进行对应属性配置时的默认处理:默认情况下matchIfMissing为false,也就是说如果未进行属性配置,则自动配置不生效。如果matchIfMissing为true,则表示如果没有对应的属性配置,则自动配置默认生效。首先此处我们虽然将原来的websocket属性注释了,但还是作为有效的配置加载了它的监听器,导致发消息的时候,WebsocketCollector的session为空,抛出了异常。

去掉该属性即可。

总结

简单的底层复用了websocket同步方式自定了一个helloworld服务站点,从学到上手使用,再到应用,这是一个进阶的过程。包括websocket同步策略里用到的观察者模式,也可以尝试着自定义一个新的事件分发器,新的事件加深下理解,非常有助于写代码能力的提升。

猜你喜欢

转载自blog.csdn.net/he_cha_bu/article/details/113531122