flash网站制作实例,wordpress中文广告插件,wordpress怎么建商场,网店如何推广为了简化应用支持服务方便的分合#xff0c;使用Zookeeper embbed模式。集成Zookeeper比较容易#xff0c;使用starter或自己写代码都可以。但是由于集成了Dubbo#xff0c;每次启动时都会发现zookeeper没有启动就开始报错退出#xff0c;但是确是已经集成了。
于是只能翻…为了简化应用支持服务方便的分合使用Zookeeper embbed模式。集成Zookeeper比较容易使用starter或自己写代码都可以。但是由于集成了Dubbo每次启动时都会发现zookeeper没有启动就开始报错退出但是确是已经集成了。
于是只能翻Dubbo源码
发现Dubbo启动时会添加一个早期事件DubboConfigInitEvent。在spring afterproperties后会立即触发该事件。在该事件里调用zookeeper注册事件。
因此解决方式是添加早期事件DubboConfigInitEvent的侦听在侦听里去初始化zookeeper server这样就能保证在Dubbo初始化之前具备zookeeper服务了
添加一个Helper Bean实现代码如下
package org.ccframe.commons.helper;import lombok.Getter;
import lombok.SneakyThrows;
import org.apache.dubbo.config.spring.context.event.DubboConfigInitEvent;
import org.apache.zookeeper.server.NIOServerCnxnFactory;
import org.apache.zookeeper.server.ZooKeeperServer;
import org.ccframe.config.GlobalEx;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;import java.io.File;
import java.net.InetSocketAddress;
import java.nio.file.Path;
import java.nio.file.Paths;Component
public class EmbeddedZookeeperLauncher implements ApplicationListenerDubboConfigInitEvent{private String zooDir;Value(${app.zookeeper.embed.dir:})public void setZooDir(String zooDir) {this.zooDir zooDir;if (zooDir null || zooDir.isEmpty()) {this.zooDir GlobalEx.APP_BASE_DIR File.separator GlobalEx.EMBEDDED_ZOOKEEPER_DIR; //zookeeper数据放到应用运行目录}}Value(${app.zookeeper.embed.port:2181})private Integer zooPort;Value(${app.zookeeper.embed.max-connection:1024})private Integer maxConnection;Value(${app.zookeeper.embed.tick-time:500})private Integer tickTime;Getterprivate ZooKeeperServer zooKeeperServer;OverrideSneakyThrowspublic void onApplicationEvent(DubboConfigInitEvent event){if (event.getApplicationContext().getParent() null) {Path zooPath Paths.get(zooDir);zooKeeperServer new ZooKeeperServer(zooPath.toFile(), zooPath.toFile(), tickTime);NIOServerCnxnFactory factory new NIOServerCnxnFactory();System.setProperty(zookeeper.maxCnxns, Integer.toString(maxConnection));factory.configure(new InetSocketAddress(zooPort), maxConnection);factory.startup(zooKeeperServer);}}}然后启动就不会报错了 本人还实现了elasticsearch 7的集成模式这样额外只需要启动一个独立的redis即可在单台2C2G的云主机上运行ccframe微服务框架了。耐斯~