package tech.powerjob.common.utils; import tech.powerjob.common.OmsConstant; import tech.powerjob.common.exception.PowerJobException; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateFormatUtils; import java.util.Collection; import java.util.Date; import java.util.Map; import java.util.UUID; import java.util.function.Supplier; /** * 公共工具类 * * @author tjq * @since 2020/3/18 */ @Slf4j public class CommonUtils { private static final int MAXIMUM_CAPACITY = 1 << 30; /** * 重试执行,仅适用于失败抛出异常的方法 * @param executor 需要执行的方法 * @param tryTimes 尝试次数(总执行次数) * @param intervalMS 失败后下一次执行的间隔时间 * @param 执行函数返回值类型 * @return 函数成功执行后的返回值 * @throws Exception 执行失败,调用方自行处理 */ public static T executeWithRetry(SupplierPlus executor, int tryTimes, long intervalMS) throws Exception { if (tryTimes <= 1 || intervalMS <= 0) { return executor.get(); } for (int i = 1; i < tryTimes; i++) { try { return executor.get(); }catch (Exception e) { Thread.sleep(intervalMS); } } return executor.get(); } public static T executeWithRetry0(SupplierPlus executor) throws Exception { return executeWithRetry(executor, 3, 100); } /** * 重试执行,仅适用于根据返回值决定是否执行成功的方法 * @param booleanExecutor 需要执行的方法,其返回值决定了执行是否成功 * @param tryTimes 尝试执行次数 * @param intervalMS 失败后下一次执行的间隔时间 * @return 最终执行结果 */ public static boolean executeWithRetryV2(Supplier booleanExecutor, int tryTimes, long intervalMS) { if (tryTimes <= 1 || intervalMS <= 0) { return booleanExecutor.get(); } for (int i = 1; i < tryTimes; i++) { try { if (booleanExecutor.get()) { return true; } Thread.sleep(intervalMS); }catch (Exception ignore) { } } return booleanExecutor.get(); } /** * 生成数据库查询语句 in 后的条件 * @param collection eg,["a", "b", "c"] * @return eg,('a','b','c') */ public static String getInStringCondition(Collection collection) { if (collection == null || collection.isEmpty()) { return "()"; } StringBuilder sb = new StringBuilder(" ( "); collection.forEach(str -> sb.append("'").append(str).append("',")); return sb.replace(sb.length() -1, sb.length(), " ) ").toString(); } public static void executeIgnoreException(SupplierPlus executor) { try { executor.get(); }catch (Exception ignore) { } } public static void executeIgnoreException(Meaningless executor) { try { executor.m(); }catch (Exception ignore) { } } /** * 将大小格式化为 2的N次 * @param cap 初始大小 * @return 格式化后的大小,2的N次 */ public static int formatSize(int cap) { int n = cap - 1; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16; return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1; } public static T requireNonNull(T obj, String msg) { if (obj == null) { throw new PowerJobException(msg); } if (obj instanceof String) { if (StringUtils.isEmpty((String) obj)) { throw new PowerJobException(msg); } } if (obj instanceof Collection) { if (CollectionUtils.isEmpty((Collection) obj)) { throw new PowerJobException(msg); } } if (obj instanceof Map) { if (MapUtils.isEmpty((Map) obj)) { throw new PowerJobException(msg); } } return obj; } /** * 格式化时间,将时间戳转化为可阅读时间 * @param ts 时间戳 * @return 可阅读时间 */ public static String formatTime(Long ts) { if (ts == null || ts <= 0) { return OmsConstant.NONE; } try { return DateFormatUtils.format(ts, OmsConstant.TIME_PATTERN); }catch (Exception ignore) { } return OmsConstant.NONE; } public static String formatTime(Date date) { if (date == null) { return OmsConstant.NONE; } return formatTime(date.getTime()); } /** * 格式化字符串,如果是 null 或空则显示 N/A * @param str 字符串 * @return 结果 */ public static String formatString(String str) { if (StringUtils.isEmpty(str)) { return OmsConstant.NONE; } return str; } /** * 生成 UUID * @return uuid */ public static String genUUID() { return StringUtils.replace(UUID.randomUUID().toString(), "-", ""); } public static void easySleep(long millis) { try { Thread.sleep(millis); } catch (InterruptedException ignore) { } } }