实训任务5:ZooKeeper节点操作

news2024/11/16 1:28:00

文章目录

  • 一、实训目的
  • 二、实训要求
  • 三、实训任务
  • 四、完成任务
    • (一)准备工作
    • (二)实现步骤
      • 1、创建Maven项目
      • 2、添加相关依赖
      • 3、创建日志属性文件
      • 4、创建股票价格类
        • (1)创建init()方法
        • (2)创建client1()方法
        • (3)创建client2()方法
      • 5、运行程序,测试效果

一、实训目的

  • 通过实训,使学生更加熟练掌握通过Java代码实现ZooKeeper节点的操作。

二、实训要求

  • 认真完成实训任务,写一篇CSDN博客,记录操作过程。

三、实训任务

  • 每支股票都受到很多因素的影响,比如包括政策、盈利、产品等,将这些因素量化成数字以后,可以呈现股价的增减。比如广深铁路上市时股价为6.0元,然后随着时间推移,政策发生变化提升股价0.1元,盈利提升股价0.2元,产品降低股价0.2元,则此时股价为6.1元。
  • 创建节点/guangshen,数据为6,并创建子节点:/policy/profit/product开始默认值都为0。模拟两个客户端,第一个客户端定时修改三个子节点/policy/profit/product的值,要求值是随机的,范围在[-1, 1]之间,当三个节点/policy/profit/product的值变化时,则修改/guangshen节点的值。另外一个客户端监控实时股价,并显示当前股价为多少。

四、完成任务

(一)准备工作

  • 在master虚拟机上启动ZK服务
    在这里插入图片描述
  • 在slave1虚拟机上启动ZK服务
    在这里插入图片描述
  • 在slave2虚拟机上启动ZK服务
    在这里插入图片描述

(二)实现步骤

1、创建Maven项目

  • Maven项目 - ZkStock
    在这里插入图片描述
  • 单击【Finish】按钮
    在这里插入图片描述

2、添加相关依赖

  • pom.xml文件里添加ZooKeeper和junit依赖
    在这里插入图片描述
<?xml version="1.0" encoding="UTF-8"?>
<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>net.hw.zk</groupId>
    <artifactId>ZkStock</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.8.0</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
        </dependency>
    </dependencies>
</project>

3、创建日志属性文件

  • resources目录里创建log4j.properties文件
    在这里插入图片描述
log4j.rootLogger=ERROR, stdout, logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/zkprice.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

4、创建股票价格类

  • 创建net.hw.zk包,在包里创建StockPrice
    在这里插入图片描述

(1)创建init()方法

  • 连接zk服务器,创建相关节点
package net.hw.zk;

import org.apache.zookeeper.*;
import org.junit.Test;

import java.util.concurrent.CountDownLatch;

/**
 * 功能:股票价格
 * 作者:华卫
 * 日期:2022年12月10日
 */
public class StockPrice {
    @Test
    public void init() throws Exception {
        final CountDownLatch cdl = new CountDownLatch(1);
        ZooKeeper zk = new ZooKeeper("master:2181",
                3000,
                new Watcher() {
                    @Override
                    public void process(WatchedEvent event) {
                        System.out.println("连接zk服务器集群成功!");
                        cdl.countDown();
                    }
                }
        );
        cdl.await();

        final CountDownLatch cdl1 = new CountDownLatch(1);
        zk.create("/guangshen", "6".getBytes(),
                ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT,
                new AsyncCallback.StringCallback() {
                    @Override
                    public void processResult(int rc, String path, Object ctx, String name) {
                        if (rc == 0) {
                            System.out.println("节点" + path + "创建成功!");
                        } else {
                            System.out.println("节点" + path + "创建失败!");
                        }
                        cdl1.countDown();
                    }
                }, "stock");
        cdl1.await();

        final CountDownLatch cdl2 = new CountDownLatch(1);
        zk.create("/guangshen/policy", "0".getBytes(),
                ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT,
                new AsyncCallback.StringCallback() {
                    @Override
                    public void processResult(int rc, String path, Object ctx, String name) {
                        if (rc == 0) {
                            System.out.println("节点" + path + "创建成功!");
                        } else {
                            System.out.println("节点" + path + "创建失败!");
                        }
                        cdl2.countDown();
                    }
                }, "stock");
        cdl2.await();

        final CountDownLatch cdl3 = new CountDownLatch(1);
        zk.create("/guangshen/profit", "0".getBytes(),
                ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT,
                new AsyncCallback.StringCallback() {
                    @Override
                    public void processResult(int rc, String path, Object ctx, String name) {
                        if (rc == 0) {
                            System.out.println("节点" + path + "创建成功!");
                        } else {
                            System.out.println("节点" + path + "创建失败!");
                        }
                        cdl3.countDown();
                    }
                }, "stock");
        cdl3.await();

        final CountDownLatch cdl4 = new CountDownLatch(1);
        zk.create("/guangshen/product", "0".getBytes(),
                ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT,
                new AsyncCallback.StringCallback() {
                    @Override
                    public void processResult(int rc, String path, Object ctx, String name) {
                        if (rc == 0) {
                            System.out.println("节点" + path + "创建成功!");
                        } else {
                            System.out.println("节点" + path + "创建失败!");
                        }
                        cdl4.countDown();
                    }
                }, "stock");
        cdl4.await();
    }
}

(2)创建client1()方法

  • 定时修改节点的值
@Test                                                                                                                                                   
public void client1() throws Exception {                                                                                                                
    final CountDownLatch cdl = new CountDownLatch(1);                                                                                                   
    final ZooKeeper zk = new ZooKeeper("master:2181",                                                                                                   
            3000,                                                                                                                                       
            new Watcher() {                                                                                                                             
                @Override                                                                                                                               
                public void process(WatchedEvent event) {                                                                                               
                    System.out.println("连接zk服务器集群成功!");                                                                                                 
                    cdl.countDown();                                                                                                                    
                }                                                                                                                                       
            }                                                                                                                                           
    );                                                                                                                                                  
    cdl.await();                                                                                                                                        
                                                                                                                                                        
    new Thread(new Runnable() {                                                                                                                         
        @Override                                                                                                                                       
        public void run() {                                                                                                                             
            while (true) {                                                                                                                              
                Random random = new Random();                                                                                                           
                try {                                                                                                                                   
                    zk.setData("/guangshen/policy", String.valueOf(random.nextDouble() * 2 - 1).getBytes(), -1);                                        
                    zk.setData("/guangshen/profit", String.valueOf(random.nextDouble() * 2 - 1).getBytes(), -1);                                        
                    zk.setData("/guangshen/product", String.valueOf(random.nextDouble() * 2 - 1).getBytes(), -1);                                       
                                                                                                                                                        
                    try {                                                                                                                               
                        Thread.sleep(3000);                                                                                                             
                    } catch (InterruptedException e) {                                                                                                  
                        e.printStackTrace();                                                                                                            
                    }                                                                                                                                   
                } catch (KeeperException e) {                                                                                                           
                    e.printStackTrace();                                                                                                                
                } catch (InterruptedException e) {                                                                                                      
                    e.printStackTrace();                                                                                                                
                }                                                                                                                                       
            }                                                                                                                                           
        }                                                                                                                                               
    }).start();                                                                                                                                         
                                                                                                                                                        
    while (true) {                                                                                                                                      
        final CountDownLatch cdl1 = new CountDownLatch(3);                                                                                              
                                                                                                                                                        
        try {                                                                                                                                           
                                                                                                                                                        
            byte[] policy = zk.getData("/guangshen/policy", new Watcher() {                                                                             
                @Override                                                                                                                               
                public void process(WatchedEvent event) {                                                                                               
                    if (event.getType() == Event.EventType.NodeDataChanged) {                                                                           
                        cdl1.countDown();                                                                                                               
                    }                                                                                                                                   
                }                                                                                                                                       
            }, null);                                                                                                                                   
                                                                                                                                                        
            byte[] profit = zk.getData("/guangshen/profit", new Watcher() {                                                                             
                @Override                                                                                                                               
                public void process(WatchedEvent event) {                                                                                               
                    if (event.getType() == Event.EventType.NodeDataChanged) {                                                                           
                        cdl1.countDown();                                                                                                               
                    }                                                                                                                                   
                }                                                                                                                                       
            }, null);                                                                                                                                   
                                                                                                                                                        
            byte[] product = zk.getData("/guangshen/product", new Watcher() {                                                                           
                @Override                                                                                                                               
                public void process(WatchedEvent event) {                                                                                               
                    if (event.getType() == Event.EventType.NodeDataChanged) {                                                                           
                        cdl1.countDown();                                                                                                               
                    }                                                                                                                                   
                }                                                                                                                                       
            }, null);                                                                                                                                   
                                                                                                                                                        
            cdl1.await();                                                                                                                               
                                                                                                                                                        
            double p1 = Double.parseDouble(new String(policy));                                                                                         
            double p2 = Double.parseDouble(new String(profit));                                                                                         
            double p3 = Double.parseDouble(new String(product));                                                                                        
                                                                                                                                                        
            double price = 6 + p1 + p2 + p3;                                                                                                            
                                                                                                                                                        
            zk.setData("/guangshen", String.valueOf(price).getBytes(), -1);                                                                             
        } catch (KeeperException e) {                                                                                                                   
            e.printStackTrace();                                                                                                                        
        } catch (InterruptedException e) {                                                                                                              
            e.printStackTrace();                                                                                                                        
        }                                                                                                                                               
    }                                                                                                                                                   
}                                                                                                                                                       

(3)创建client2()方法

  • 实时监控股价并显示
@Test                                                                                              
public void client2() throws Exception {                                                           
    final CountDownLatch cdl = new CountDownLatch(1);                                              
    ZooKeeper zk = new ZooKeeper("master:2181",                                                    
            3000,                                                                                  
            new Watcher() {                                                                        
                @Override                                                                          
                public void process(WatchedEvent event) {                                          
                    System.out.println("连接zk服务器集群成功!");                                            
                    cdl.countDown();                                                               
                }                                                                                  
            }                                                                                      
    );                                                                                             
    cdl.await();                                                                                   
                                                                                                   
    while (true) {                                                                                 
        byte[] data = zk.getData("/guangshen", null, null);                                        
        String price = new String(data);                                                           
        price = price.substring(0, price.indexOf(".") + 3);                                        
        System.out.println("当前股价:" + price + "元");                                                 
        final CountDownLatch cdl1 = new CountDownLatch(1);                                         
        zk.getData("/guangshen", new Watcher() {                                                   
            @Override                                                                              
            public void process(WatchedEvent event) {                                              
                if (event.getType() == Event.EventType.NodeDataChanged) {                          
                    System.out.println("股价发生变化……");                                                
                    cdl1.countDown();                                                              
                }                                                                                  
            }                                                                                      
        }, null);                                                                                  
        cdl1.await();                                                                              
    }                                                                                              
}                                                                                                  

5、运行程序,测试效果

  • 依次运行init()方法、client1()方法、client2()方法
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/78658.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【python脚本】ICer的脚本入门训练——find_key

我们的目标是┏ (゜ω゜)☞芯片前端全栈工程师~喵&#xff01; 前言 往期回顾&#xff1a; 【python脚本】ICer的脚本入门训练——svn_back_尼德兰的喵的博客-CSDN博客_svn back文件 【python脚本】ICer的脚本入门训练——gen_tc_尼德兰的喵的博客-CSDN博客 查找关键词这一类脚…

TFT-LCD LVGL与硬件交互

TFT-LCD LVGL与硬件交互 屏幕能正常显示LVGL官方例程&#xff0c;说明LVGL移植成功了&#xff0c;本次实验使用屏幕通过LVGL控制开发板硬件 实现效果 用LVGL画两个按钮和一个标签&#xff0c;一个按钮控制蜂鸣器&#xff0c;另一个按钮控制继电器&#xff0c;标签显示“TFT-…

基于intel机器人控制器,支持slam,激光雷达和AI加速

9th/8th gen Intel Core™ i7/i5/i3 & Celeron.XM-5149 是专为机器人行业设计的工业计算机产品&#xff0c;高性能的处理能力加速 AI 学习速度&#xff0c;多种类 I/0 可接摄像头、雷达等丰富外设。在设备密闭舱体内&#xff0c;整机可以高温稳定运行不降速。 产品规格 芯…

flink不同部署方式-1.14

1. 版本说明 本文档内容基于 flink-1.14.x&#xff0c;其他版本的整理&#xff0c;请查看本人博客的 flink 专栏其他文章。 2. 概述 Flink 是一种通用性框架&#xff0c;支持多种不同的部署方式。 本章简要介绍 Flink 集群的组成部分、用途和可用实现。如果你只是想在本地启…

最全LaTeX 数学公式、字母符号、上下标、列表矩阵、公式注释、分数二进制数、分割字符、逻辑集合论、否定符号等

最全LaTeX 数学公式、字母符号、上下标、列表矩阵、公式注释、分数二进制数、分割字符、逻辑集合论、否定符号等 1. 公式示例 E(T)∑(p,q)ϵκ∣∣p−Tq∣∣2E(T)\sum_{(p,q)\epsilon\kappa} \mid\mid p-T_q \mid \mid ^2 E(T)(p,q)ϵκ∑​∣∣p−Tq​∣∣2 E(T)∑(p,q)ϵκ…

高数 |【23数一 李林六套卷】卷四 自用思路 及 知识点 整理

23数一 李林六套卷 —— 自用思路 及 知识点 整理 ——【卷一】 以下均为个人复盘。 T1:高阶无穷小 T6:傅里叶级数 法一:直接套傅里叶展开公式,死算 法二:用技巧。取一个x,看最后结果趋近于这个数!是趋近于!不是直接等于 直接等于不可以。再来看下一个。

Java--IO流详解

目录 一、IO流的介绍 二、IO流的具体详解 &#xff08;1&#xff09;字节流 1&#xff1a;FileOutputStream 2&#xff1a;FileInputStream &#xff08;2&#xff09;字符流 1&#xff1a;解码编码 2&#xff1a;FileReader 3&#xff1a;FileWriter 三、IO流的使用 …

MATLB|基于改进教学的优化算法(TLSBO)的最优功率优化

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f4dd;目前更新&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;电力系统相关知识&#xff0c;期刊论文&…

使用 Zabbix 监控Oracle

zabbix ODBC 数据库监控 ODBC 是 C 语言开发的、用于访问数据库的中间件接口.zabbix 支持查询任何 ODBC 支持的数据库.zabbix 经过调用 ODBC 来获取数据库的数据以及数据库状态等等信息 一、安装unixODBC 官方主页:http://www.unixodbc.org/download.html 使用阿里巴巴提供的…

线性方程组迭代法

雅可比迭代法与高斯-塞德尔迭代法 雅可比迭代法 例一 {10x1−x2−2x37.2−x110x2−2x38.3−x1−x25x34.2\left\{\begin{array}{l} 10 x_{1}-x_{2}-2 x_{3}7.2 \\ -x_{1}10 x_{2}-2 x_{3}8.3 \\ -x_{1}-x_{2}5 x_{3}4.2 \end{array}\right. ⎩⎨⎧​10x1​−x2​−2x3​7.2−x…

Css-Grid布局(强大)

前言 我们前面讲的Flex布局是轴线布局&#xff0c;只能指定"项目"针对轴线的位置&#xff0c;可以看做是一维布局&#xff0c;Grid布局则是将容器划分成"行"和"列"&#xff0c;产生单元格&#xff0c;然后指定"项目所在"的单元格&…

从手动测试到自动化测试老司机,只用了3个月,我的薪资翻了一倍

虽然笔者是一个测试老人了&#xff0c;但是基本上所有的测试经验都停留在手工测试方面&#xff0c;对于自动化测试方面的实战经验少之又少&#xff0c;可以说&#xff0c;从这个角度来说&#xff0c;就像生活在原始社会&#xff0c;一切靠双手解决问题。&#xff08;别想歪了&a…

【深度学习】李宏毅2021/2022春深度学习课程笔记 - Deep Learning Introduction

文章目录一、深度学习的概念二、函数的类型三、深度学习的步骤3.1 定义一个参数未知的函数表达式3.2 定义一个损失函数3.3 采用梯度下降法求解使得函数表达式的Loss最小的参数四、视频播放量预测案例4.1 案例介绍和思路分析4.2 线性函数表达式14.3 改进1&#xff1a;使用前一段…

此文件存在危险因此chrome已将其拦截

当您尝试在 chrome 中下载一些文件时&#xff0c;有时 chrome 会说“此文件可能很危险&#xff0c;因此 Chrome 已阻止它”。这可能是因为 Chrome 的内置安全功能可能已将其检测为可能有害的文件。但是&#xff0c;如果您信任文件的来源并想要下载它&#xff0c;那么您可以按照…

authorization server client resource 使用1

authorization server && client && resource 使用1 OAuth2介绍 OAuth&#xff08;Open Authorization&#xff09;是一个关于授权&#xff08;authorization&#xff09;的开放网络标准&#xff0c;允许用户授权第三方应用访问他们存储在另外的服务提供者上…

leetcode.1691 堆叠长方体的最大高度 - dp + 排序

1691. 堆叠长方体的最大高度 目录 1、java 2、c 思路&#xff1a; 根据题目描述&#xff0c;长方体 j 能够放在长方体 i 上&#xff0c;当且仅当 题目允许旋转长方体&#xff0c;也就是可以选择长方体的任意一边作为长方体的高。 对于任意一种合法的堆叠&#xff0…

聊一聊三级等保

本文为joshua317原创文章,转载请注明&#xff1a;转载自joshua317博客 聊一聊三级等保 - joshua317的博客 一、前言 1.1 基本认知 网络安全&#xff1a;根据《信息安全技术网络安全等级保护基本要求》&#xff08;GB/T 22239-2019&#xff09;&#xff0c;是指通过采取必要措…

m基于功率谱,高阶累积量和BP神经网络-GRNN网络的调制方式识别仿真,对比2psk,4PSK,2FSK以及4FSK

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 首先区分大类的话采用的基于功率谱提取的len参数&#xff08;峰值频率间隔&#xff09;&#xff0c;用峰值个数来代替&#xff0c;这样能很好的区分大类把MFSK和MPSK信号区分开。 针对MPSK&…

VSCode-远程连接服务器进行开发

一&#xff1a;安装插件 二&#xff1a;设置SSH 按照划线位置依次配置要连接的服务器配置 三&#xff1a;打开远程连接选项 勾选此选项后即可显示配置好的远程服务器&#xff0c;点击登录即可。 输入服务器用户密码 注意 &#xff1a;终端框install不要关闭&#xff01;&#…

基于MPS算法和改进的非支配排序遗传算法II(MNSGA-II)求解配备起重机的模糊鲁棒设施布局问题(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…