zookeeper写入数据乱码问题

 

      先来看看现象:

这是用工具ZooInspector查看zookeeper上的数据显示的结果,从图中可以看出,数据的前几个字节是乱码。

 

pom.xml中的zookeeper依赖:

       <!-- zookeeper -->
	    <dependency>
		     <groupId>org.apache.zookeeper</groupId>
		     <artifactId>zookeeper</artifactId>
		     <version>3.4.12</version>
	 	</dependency>
		<dependency>
		    <groupId>org.apache.curator</groupId>
		    <artifactId>curator-recipes</artifactId>
		    <version>4.0.1</version>
		</dependency>
		
		<dependency>
		    <groupId>com.101tec</groupId>
		    <artifactId>zkclient</artifactId>
		    <version>0.10</version>
		</dependency>

而写入数据代码如下:

public ZkClient zk = new ZkClient(zkAddr);

if(!zk.exists("/abc/servers")){
			zk.createPersistent("/abc/servers", true);
}

zk.writeData("/abc/servers", data);

无论写入的数据是否是中文,都会出现乱码。

 

解决的方法:

新建一个MyZkSerializer类,实现了ZkSerializer接口,里面的内容如下:

public class MyZkSerializer implements ZkSerializer
{
	 	@Override
	    public Object deserialize(byte[] bytes) throws ZkMarshallingError {
	        	return new String(bytes, Charset.forName("UTF-8"));
	    }
	 	
	    @Override
	    public byte[] serialize(Object serializable) throws ZkMarshallingError {
	        	return ((String)serializable).getBytes(Charset.forName("UTF-8"));
	    }
}

然后在client写入数据之前,添加一行代码:

zk.setZkSerializer(new MyZkSerializer());

这样就不会出现乱码了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用 Java API 将数据写入 ZooKeeper 的示例代码: ```java import org.apache.zookeeper.*; import org.apache.zookeeper.Watcher.Event.KeeperState; import org.apache.zookeeper.ZooDefs.Ids; import org.apache.zookeeper.data.Stat; import java.io.IOException; import java.util.concurrent.CountDownLatch; public class ZooKeeperWriter implements Watcher { private static final int SESSION_TIMEOUT = 5000; private static final String CONNECTION_STRING = "localhost:2181"; private static final String ZNODE_PATH = "/my_znode"; private static final String ZNODE_DATA = "Hello, ZooKeeper!"; private ZooKeeper zooKeeper; private CountDownLatch connectedSignal = new CountDownLatch(1); public void connect() throws IOException, InterruptedException { zooKeeper = new ZooKeeper(CONNECTION_STRING, SESSION_TIMEOUT, this); connectedSignal.await(); } public void close() throws InterruptedException { zooKeeper.close(); } public void createZNode() throws KeeperException, InterruptedException { byte[] data = ZNODE_DATA.getBytes(); zooKeeper.create(ZNODE_PATH, data, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); } public void updateZNode() throws KeeperException, InterruptedException { byte[] data = "Updated data".getBytes(); zooKeeper.setData(ZNODE_PATH, data, zooKeeper.exists(ZNODE_PATH, true).getVersion()); } public void deleteZNode() throws KeeperException, InterruptedException { zooKeeper.delete(ZNODE_PATH, zooKeeper.exists(ZNODE_PATH, true).getVersion()); } public void process(WatchedEvent event) { if (event.getState() == KeeperState.SyncConnected) { connectedSignal.countDown(); } } public static void main(String[] args) throws IOException, InterruptedException, KeeperException { ZooKeeperWriter zooKeeperWriter = new ZooKeeperWriter(); zooKeeperWriter.connect(); zooKeeperWriter.createZNode(); zooKeeperWriter.updateZNode(); zooKeeperWriter.deleteZNode(); zooKeeperWriter.close(); } } ``` 这个示例程序首先创建了一个 ZooKeeper 实例并在 `connect()` 方法中等待连接建立。然后,它使用 `createZNode()` 方法创建了一个数据节点,并使用 `updateZNode()` 方法更新了该节点的数据,最后使用 `deleteZNode()` 方法删除了该节点。在 `process()` 方法中,我们使用 `CountDownLatch` 来等待连接建立完成。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值