zookeeper分布式锁(二)

本文深入探讨了在不可靠网络环境下,为何需要使用重试操作,以及如何通过保护访问级别、接口定义和具体实现来确保操作的幂等性和可靠性。重点介绍了`retryOperation()`方法的定义、参数、返回类型和异常处理机制,旨在为开发者提供一种在网络不稳定情况下执行关键任务的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


重试操作

为什么要有这么个操作?

假如我们捕捉到了网络丢失的异常,如果我们的操作是“幂等”的,我们一般期望在一定时间后,网络恢复的情况下,重新执行这个操作来完成之前的操作。如果

我们的操作不是“幂等”的,我们一般是在捕捉到异常后经过确认来决定是否重新操作。因此重试操作在“网络是不可靠”的前提下变得就很有必要。

这里我们定义一个方法:retryOperation()


这个方法的访问级别是"protected",参数是ZooKeeperOperation对象,

ZookeeperOperation对象的定义如下:

public interface ZooKeeperOperation {
    public boolean execute() throws KeeperException, InterruptedException;
}

retryOperation()的返回值是Object,抛出"KeeperException,InterruptedException"


retryOperation()的代码如下:

protected Object retryOperation(ZooKeeperOperation operation) 
        throws KeeperException, InterruptedException {
        KeeperException exception = null;
        for (int i = 0; i < retryCount//重试次数; i++) {
            try {
                return operation.execute();
            } catch (KeeperException.SessionExpiredException e) {
                LOG.warn("Session expired for: " + zookeeper + " so reconnecting due to: " + e, e);
                throw e;
            } catch (KeeperException.ConnectionLossException e) {
                if (exception == null) {
                    exception = e;
                }
                LOG.debug("Attempt " + i + " failed with connection loss so " +
                		"attempting to reconnect: " + e, e);
                retryDelay(i);//根据重试的次数定义重试延迟时间
            }
        }
        throw exception;
    }

retryOperation()方法没有捕捉SessionExpiredException异常,因为一般session失效是zooKeeper的节点将进入“closed”态,不能恢复

如图所示:



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值