All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.jdkhome.blzo.ex.redission.actuator.MultiLockActuator Maven / Gradle / Ivy

There is a newer version: 0.5.0.3.RELEASE
Show newest version
package com.jdkhome.blzo.ex.redission.actuator;

import com.jdkhome.blzo.ex.basic.configuration.ApplicationContextProvider;
import com.jdkhome.blzo.ex.basic.enums.BasicResponseError;
import com.jdkhome.blzo.ex.basic.exception.ServiceException;
import com.jdkhome.blzo.ex.redission.Consumer;
import lombok.extern.slf4j.Slf4j;
import org.redisson.RedissonMultiLock;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * 联锁
 */
@Slf4j
public class MultiLockActuator {

    private List keys;

    private long wait = 2L;
    private long lease = 10L;

    public void exec(Consumer action) {
        RedissonClient redissonClient = ApplicationContextProvider.getBean(RedissonClient.class);

        List rLockList = new ArrayList<>();
        keys.forEach(key -> rLockList.add(redissonClient.getLock(key)));

        RedissonMultiLock multiLock = new RedissonMultiLock(rLockList.toArray(new RLock[]{}));

        try {
            boolean lockResult = multiLock.tryLock(wait, lease, TimeUnit.SECONDS);
            if (!lockResult) {
                log.warn("获取分布式联锁失败 超时 : {} ", multiLock);
                throw new ServiceException(BasicResponseError.SERVER_BUSY);
            }

            log.debug("成功获取分布式联锁 : {} ", multiLock);

            action.accept();

        } catch (ServiceException se) {
            log.warn("业务异常 当前占用分布式锁 : {} exception :{}  ", multiLock, se.getErrorMsg());
            throw se;
        } catch (InterruptedException e) {
            log.warn("InterruptedException 当前占用分布式锁 : {} ", multiLock);
            Thread.currentThread().interrupt();
            throw new ServiceException(BasicResponseError.SERVER_ERROR, e);
        } catch (Exception e) {
            log.warn("其他异常 当前占用分布式锁 : {} exception :{}  ", multiLock, e.getMessage());
            throw e;
        } finally {
            if (null != multiLock) {
                try {
                    multiLock.unlock();
                    log.debug("成功释放分布式锁 : {} ", multiLock);
                } catch (Exception e) {
                    log.warn("释放分布式锁失败", e);
                }
            }
        }

    }

    public MultiLockActuator(List keys, long wait, long lease) {
        this.keys = keys;
        this.wait = wait;
        this.lease = lease;
    }

    public MultiLockActuator(List keys) {
        this.keys = keys;
    }

    static public MultiLockActuator create(List keys, long wait, long lease) {
        return new MultiLockActuator(keys, wait, lease);
    }

    static public MultiLockActuator create(List keys) {
        return new MultiLockActuator(keys);
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy