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

com.spring.boxes.dollar.ShotUtils Maven / Gradle / Ivy

package com.spring.boxes.dollar;

import java.util.Date;

import lombok.extern.slf4j.Slf4j;

/**
 * 流量打散工具类
 */
@Slf4j
public class ShotUtils {

    // 弹窗最大等待时间
    public static final Long maxWaitTime = 5000L;

    // 弹窗生命周期时间
    public static final Long durationTime = 2 * 60 * 1000L;

    /**
     * 基于事件时间计算递减周期
     * 初始弹窗50000ms,在2分钟的时间内追减递减直至消亡。
     *
     * @param eventTime 热点事件时间
     * @return 打散时间
     */
    public static long timeDismiss(Date eventTime) {
        return timeDismiss(eventTime, maxWaitTime, durationTime);
    }

    /**
     * 基于事件时间计算递减周期
     * 初始弹窗50000ms,在2分钟的时间内追减递减直至消亡。
     *
     * @param eventTime    热点事件时间
     * @param initialTime  初始值弹窗时间 50000ms
     * @param durationTime 初始弹窗消亡持续总时间长度。示例中的2分钟
     * @return 打散值
     */
    public static long timeDismiss(Date eventTime, long initialTime, long durationTime) {
        // 环绕削峰,前后各取一半
        long half = durationTime / 2;
        // 计算时间距离热点时间的偏移
        long offset = eventTime.getTime() - System.currentTimeMillis();
        // 超出约束区间,直接打散结果为0
        if (Math.abs(offset) > half) {
            return 0;
        }
        // 进入约束区间,进行打散时间计算
        return timeDismiss(initialTime, half, Math.abs(offset));
    }

    /**
     * 初始弹窗50000ms,在2分钟的时间内追减递减直至消亡。
     *
     * @param initialTime  初始值弹窗时间 50000ms
     * @param durationTime 初始弹窗消亡持续总时间长度。示例中的2分钟
     * @param count        消亡次数
     * @return 消亡剩余次数
     */
    public static long timeDismiss(long initialTime, long durationTime, long count) {
        return initialTime - (initialTime * count / durationTime);
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy