分布式通知和协调作用

1  通过下面方法充分理解zookeeper的结构

zookpeer =  树形结构+通知机制

有点像:wait 和 notifyall

操作步骤:建立多个这样的客户端,通过命令更改zookeeper服务

set   /atcunzi/distribute  AAA ; set   /atcunzi/distribute  BBB 查看运行结果

注意  triggerValue方法和递归方法的区别

import java.io.IOException;

import org.apache.log4j.Logger;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;

public class ClientA
{
	/**
	 * Logger for this class
	 */
	private static final Logger logger = Logger.getLogger(ClientA.class);

	// 定义常量
	private static final String CONNECTSTRING = "192.168.31.167:2181";
	private static final int SESSION_TIMEOUT = 50 * 1000;
	private static final String PATH = "/atcunzi/distributed";
	// 定义实例变量
	private ZooKeeper zk = null;


	public ZooKeeper startZK() throws IOException
	{
		return new ZooKeeper(CONNECTSTRING, SESSION_TIMEOUT, new Watcher() {
			@Override
			public void process(WatchedEvent event)
			{
			}
		});

	}


	public String getZNode(String nodePath) throws KeeperException, InterruptedException
	{
		String result = "";
		
		byte[] byteArray = zk.getData(nodePath, new Watcher() {
			@Override
			public void process(WatchedEvent event)
			{
				try 
				{
					triggerValue(nodePath);
				}catch (KeeperException | InterruptedException e) {
					e.printStackTrace();
				}
			}
		}, new Stat());
		
		result = new String(byteArray);
		return result; //abc
	}

	public boolean triggerValue(String nodePath) throws KeeperException, InterruptedException
	{
		String result = "";

		byte[] byteArray = zk.getData(nodePath, new Watcher() {
			@Override
			public void process(WatchedEvent event)
			{
				try {
					triggerValue(nodePath);
				}
				catch (KeeperException | InterruptedException e) {
					e.printStackTrace();
				}
			}
		}, new Stat());

		result = new String(byteArray);
		
		if("AAA".equalsIgnoreCase(result))
		{
			logger.info("**********change AAA runn......");
			return true;
		}else{
			return false;
		}

	}

	public static void main(String[] args) throws IOException, KeeperException, InterruptedException
	{
		ClientA a = new ClientA();

		a.setZk(a.startZK());
		
		logger.info("****************first result: "+a.getZNode(PATH));
		
		Thread.sleep(Long.MAX_VALUE);

	}

	// setter------getter
	public ZooKeeper getZk()
	{
		return zk;
	}

	public void setZk(ZooKeeper zk)
	{
		this.zk = zk;
	}

}

5  maven配置

    

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.atguigu.zk1014</groupId>
	<artifactId>zk1014</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>zk1014</name>
	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

	<dependencies>
		<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
		<dependency>
			<groupId>com.101tec</groupId>
			<artifactId>zkclient</artifactId>
			<version>0.10</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
		<dependency>
			<groupId>org.apache.zookeeper</groupId>
			<artifactId>zookeeper</artifactId>
			<version>3.4.9</version>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.9</version>
			<scope>test</scope>
		</dependency>
	</dependencies>
</project>

猜你喜欢

转载自blog.csdn.net/qq_35703121/article/details/80949170