package com.brframework.commondistributed.annotation;

import com.brframework.commondistributed.core.DistributedExpressionRootObject;
import com.brframework.commondistributed.exception.LockedException;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 分布式锁
 * @Author xu
 * @Date 2019年9月4日22:37:26
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface DistributedLock {

    /**
     * lock key
     * 示例：
     *  "targetClassName + methodName + #phone"
     *  "targetClassName + methodName + 'simple'"
     *  "targetClassName + methodName + args[0]"
     * 使用spring el表达式，
     * 内置对象包括：
     * @see DistributedExpressionRootObject
     * method -> 当前method对象
     * methodName -> method.getName()
     * args -> 当前方法的参数，可以通过args[index]访问
     * target -> 当前调用对象
     * targetClassName -> target.getClass().getName()
     *
     */
    String key();

    /**
     * 锁被占用，是否等待解锁
     *
     * 不等待解锁时，如果出现锁被占用，将抛出锁占用异常
     * @see LockedException
     */
    boolean waitFor() default true;

    /**
     * waitFor为false，并且出现锁被占用，是否抛出LockedException异常
     * 应用：
     * 分布式定时任务，锁占用的时候不执行即可，不需要抛出异常
     */
    boolean throwException() default true;

}
