浏览代码

Merge branch 'dev'

# Conflicts:
#	jdk/src/main/java/cn/reghao/jutil/jdk/http/WebClient.java
#	jdk/src/main/java/cn/reghao/jutil/jdk/http/WebRequest.java
#	jdk/src/main/java/cn/reghao/jutil/jdk/result/Result.java
#	tool/src/main/java/cn/reghao/jutil/tool/http/DefaultWebRequest.java
reghao 1 年之前
父节点
当前提交
1c4a211f5f

+ 1 - 1
jdk/src/main/java/cn/reghao/jutil/jdk/http/WebClient.java

@@ -68,7 +68,7 @@ public class WebClient implements WebRequest {
     }
 
     @Override
-    public WebResponse upload(String url, UploadParam uploadParam) {
+    public WebResponse upload(String url, UploadParam uploadParam, String token) {
         return null;
     }
 

+ 1 - 1
jdk/src/main/java/cn/reghao/jutil/jdk/http/WebRequest.java

@@ -14,6 +14,6 @@ public interface WebRequest {
     WebResponse get(String url);
     WebResponse postFormData(String url, Map<String, String> formData);
     WebResponse postJson(String url, String json);
-    WebResponse upload(String url, UploadParam uploadParam);
+    WebResponse upload(String url, UploadParam uploadParam, String token);
     void download(String url, String referer, String filePath) throws IOException;
 }

+ 130 - 0
jdk/src/main/java/cn/reghao/jutil/jdk/http/util/UrlFormatter.java

@@ -0,0 +1,130 @@
+package cn.reghao.jutil.jdk.http.util;
+
+/**
+ * @author reghao
+ * @date 2021-03-15 12:33:44
+ */
+public class UrlFormatter {
+    /**
+     * 从 http/https url 中提取出域名
+     * https://twitter.com/Milkytutu/status/1264213127396114433 -> https://twitter.com
+     *
+     * @param
+     * @return
+     * @date 2021-03-15 下午12:13
+     */
+    public static String getDomain(String url) {
+        if (url.startsWith("https://")) {
+            String host = url.split("https://")[1].split("/")[0];
+            return "https://" + host;
+        } else {
+            String host = url.split("http://")[1].split("/")[0];
+            return "http://" + host;
+        }
+    }
+
+    /**
+     * 从 http/https url 中提取出主机
+     * https://twitter.com/Milkytutu/status/1264213127396114433 -> twitter.com
+     *
+     * @param
+     * @return
+     * @date 2021-03-15 下午12:13
+     */
+    public static String getHost(String url) {
+        if (url.startsWith("https://")) {
+            return url.split("https://")[1].split("/")[0];
+        } else {
+            return url.split("http://")[1].split("/")[0];
+        }
+    }
+
+    /**
+     * https://cdn.91p07.com//m3u8/442614/442614.m3u8?st=xHX459guiAmx5CsRJbLXyQ&e=1615796818
+     * -> https://cdn.91p07.com//m3u8/442614
+     *
+     * @param
+     * @return
+     * @date 2021-03-15 下午2:31
+     */
+    public static String getPrefix(String url) {
+        String noParamsUrl = url.split("\\?")[0];
+        return noParamsUrl.substring(0, noParamsUrl.lastIndexOf("/"));
+    }
+
+    /**
+     * https://cdn.91p07.com//m3u8/442614/442614.m3u8?st=xHX459guiAmx5CsRJbLXyQ&e=1615796818
+     * -> https://cdn.91p07.com//m3u8/442614/442614.m3u8
+     *
+     * @param
+     * @return
+     * @date 2021-03-15 下午2:33
+     */
+    public static String getUrlWithNoParams(String url) {
+        return url.split("\\?")[0];
+    }
+
+    /**
+     * 从 url 中取出指定参数的值
+     * http://91porn.com/uprofile.php?UID=b583fKPwaC8HuUDsIRbfEq9scGe1J90POTljHJwUJ998WRZq -> UID
+     *
+     * @param
+     * @return
+     * @date 2021-03-15 下午12:38
+     */
+    public static String getParamValue(String url, String name) {
+        String params = url.split("\\?")[1];
+        for (String kv : params.split("&")) {
+            String[] arr = kv.split("=");
+            if (arr.length != 2) {
+                return null;
+            }
+
+            if (name.equals(arr[0])) {
+                return arr[1];
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * https://video.twimg.com/ext_tw_video/1351933827732525056/pu/vid/3000/6000/320x544/RTM9oDMcLYnTfg_k.ts?name=value
+     * -> RTM9oDMcLYnTfg_k.ts
+     *
+     * @param
+     * @return
+     * @date 2021-03-15 下午9:36
+     */
+    public static String getFilename(String url) {
+        String noParamsUrl = url.split("\\?")[0];
+        int index = noParamsUrl.lastIndexOf("/");
+        return noParamsUrl.substring(index+1);
+    }
+
+    /**
+     * https://cdn.91p07.com//m3u8/442614/442614.m3u8?st=xHX459guiAmx5CsRJbLXyQ&e=1615796818 ->
+     * https://cdn.91p07.com//m3u8/442614/442614.m3u8
+     *
+     * @param
+     * @return
+     * @date 2021-11-26 上午11:17
+     */
+    public static String getUrlWithoutParam(String url) {
+        return url.split("\\?")[0];
+    }
+
+    /**
+     * 提取 uri
+     * http://static.reghao.icu/tnb/vid/img/vidcover/eY9G0Zpnqe.jpg -> /tnb/vid/img/vidcover/eY9G0Zpnqe.jpg
+     *
+     * @param
+     * @return
+     * @date 2021-11-24 上午9:47
+     */
+    public static String getUri(String url) {
+        String url1 = url.replaceFirst("^(http|https)://", "");
+        int idx = url1.indexOf("/");
+        return url1.substring(idx);
+    }
+}

+ 75 - 0
jdk/src/main/java/cn/reghao/jutil/jdk/jvm/JVM.java

@@ -0,0 +1,75 @@
+package cn.reghao.jutil.jdk.jvm;
+
+import cn.reghao.jutil.jdk.jvm.model.*;
+import cn.reghao.jutil.jdk.converter.DateTimeConverter;
+
+import java.lang.management.*;
+import java.util.*;
+
+/**
+ * JVM 信息和状态
+ *
+ * @author reghao
+ * @date 2020-09-10 18:31:16
+ */
+public class JVM {
+    private final RuntimeMXBean rtBean;
+    private final ClassLoadingMXBean classLoadingBean;
+    private final ThreadMXBean threadBean;
+    private final MemoryMXBean memoryBean;
+    private final List<MemoryPoolMXBean> memoryPoolBeans;
+    private final List<BufferPoolMXBean> bufferPoolBeans;
+    private final List<GarbageCollectorMXBean> gcBeans;
+
+    public JVM() {
+        this.rtBean = ManagementFactory.getRuntimeMXBean();
+        this.classLoadingBean = ManagementFactory.getClassLoadingMXBean();
+        this.threadBean = ManagementFactory.getThreadMXBean();
+        this.memoryBean = ManagementFactory.getMemoryMXBean();
+        this.memoryPoolBeans = ManagementFactory.getMemoryPoolMXBeans();
+        this.bufferPoolBeans = ManagementFactory.getPlatformMXBeans(BufferPoolMXBean.class);
+        this.gcBeans = ManagementFactory.getGarbageCollectorMXBeans();
+    }
+
+    public JvmInfo info() {
+        JvmInfo jvmInfo = new JvmInfo();
+        jvmInfo.setOsName(System.getProperty("os.name"));
+        jvmInfo.setOsVersion(System.getProperty("os.version"));
+
+        jvmInfo.setJvmName(System.getProperty("java.vm.name"));
+        jvmInfo.setJvmVersion(System.getProperty("java.vm.version"));
+
+        // TODO pid 不一定准确
+        jvmInfo.setJvmPid(Integer.parseInt(rtBean.getName().split("@")[0]));
+        jvmInfo.setJvmStartTime(DateTimeConverter.msTimestampFormat(rtBean.getStartTime()));
+
+        return jvmInfo;
+    }
+
+    private List<BufferPoolStat> bufferPoolStat() {
+        List<BufferPoolStat> list = new ArrayList<>();
+        bufferPoolBeans.forEach(bufferPoolBean -> list.add(new BufferPoolStat(bufferPoolBean)));
+        return list;
+    }
+
+    private Map<String, MemoryPoolStat> memoryPoolStat() {
+        Map<String, MemoryPoolStat> map = new HashMap<>();
+        memoryPoolBeans.forEach(
+                // TODO name 是否唯一?
+                memoryPoolBean -> map.put(memoryPoolBean.getName(), new MemoryPoolStat(memoryPoolBean)));
+        return map;
+    }
+
+    private List<GarbageCollectorStat> gcStat() {
+        List<GarbageCollectorStat> list = new ArrayList<>();
+        gcBeans.forEach(gcBean -> list.add(new GarbageCollectorStat(gcBean)));
+        return list;
+    }
+
+    private List<ThreadStat> threadStat() {
+        List<ThreadStat> list = new ArrayList<>();
+        Arrays.stream(threadBean.getThreadInfo(threadBean.getAllThreadIds()))
+                .forEach(threadInfo -> list.add(new ThreadStat(threadInfo)));
+        return list;
+    }
+}

+ 41 - 0
jdk/src/main/java/cn/reghao/jutil/jdk/jvm/model/BufferPoolStat.java

@@ -0,0 +1,41 @@
+package cn.reghao.jutil.jdk.jvm.model;
+
+import cn.reghao.jutil.jdk.converter.ByteConverter;
+import cn.reghao.jutil.jdk.converter.ByteType;
+
+import java.lang.management.BufferPoolMXBean;
+
+/**
+ * @author reghao
+ * @date 2020-10-21 15:49:56
+ */
+public class BufferPoolStat {
+    private String poolName;
+    private long bufferCount;
+    private String totalMemory;
+    private String usedMemory;
+
+    public BufferPoolStat(BufferPoolMXBean bufferPoolBean) {
+        ByteConverter converter = new ByteConverter();
+        this.poolName = bufferPoolBean.getName();
+        this.bufferCount = bufferPoolBean.getCount();
+        this.totalMemory = converter.convert(ByteType.Bytes, bufferPoolBean.getTotalCapacity());
+        this.usedMemory = converter.convert(ByteType.Bytes, bufferPoolBean.getMemoryUsed());
+    }
+
+    public String getPoolName() {
+        return poolName;
+    }
+
+    public long getBufferCount() {
+        return bufferCount;
+    }
+
+    public String getTotalMemory() {
+        return totalMemory;
+    }
+
+    public String getUsedMemory() {
+        return usedMemory;
+    }
+}

+ 41 - 0
jdk/src/main/java/cn/reghao/jutil/jdk/jvm/model/GarbageCollectorStat.java

@@ -0,0 +1,41 @@
+package cn.reghao.jutil.jdk.jvm.model;
+
+import java.lang.management.GarbageCollectorMXBean;
+import java.util.Arrays;
+
+/**
+ * @author reghao
+ * @date 2020-10-21 15:49:56
+ */
+public class GarbageCollectorStat {
+    private String gcName;
+    // GC 管理的内存池
+    private String memoryPools;
+    // 自 JVM 启动后总共发生的 GC 次数
+    private long gcCount;
+    // 自 JVM 启动后 GC 总共耗费的时间
+    private long gcTime;
+
+    public GarbageCollectorStat(GarbageCollectorMXBean gcBean) {
+        this.gcName = gcBean.getName();
+        this.memoryPools = Arrays.toString(gcBean.getMemoryPoolNames()).replace("[", "").replace("]", "");
+        this.gcCount = gcBean.getCollectionCount();
+        this.gcTime = gcBean.getCollectionCount();
+    }
+
+    public String getGcName() {
+        return gcName;
+    }
+
+    public String getMemoryPools() {
+        return memoryPools;
+    }
+
+    public long getGcCount() {
+        return gcCount;
+    }
+
+    public long getGcTime() {
+        return gcTime;
+    }
+}

+ 62 - 0
jdk/src/main/java/cn/reghao/jutil/jdk/jvm/model/JvmInfo.java

@@ -0,0 +1,62 @@
+package cn.reghao.jutil.jdk.jvm.model;
+
+/**
+ * @author reghao
+ * @date 2020-10-21 10:43:37
+ */
+public class JvmInfo {
+    private String osName;
+    private String osVersion;
+    private String jvmName;
+    private String jvmVersion;
+    private int jvmPid;
+    private String jvmStartTime;
+
+    public void setOsName(String osName) {
+        this.osName = osName;
+    }
+
+    public String getOsName() {
+        return osName;
+    }
+
+    public void setOsVersion(String osVersion) {
+        this.osVersion = osVersion;
+    }
+
+    public String getOsVersion() {
+        return osVersion;
+    }
+
+    public void setJvmName(String jvmName) {
+        this.jvmName = jvmName;
+    }
+
+    public String getJvmName() {
+        return jvmName;
+    }
+
+    public void setJvmVersion(String jvmVersion) {
+        this.jvmVersion = jvmVersion;
+    }
+
+    public String getJvmVersion() {
+        return jvmVersion;
+    }
+
+    public void setJvmPid(int jvmPid) {
+        this.jvmPid = jvmPid;
+    }
+
+    public int getJvmPid() {
+        return jvmPid;
+    }
+
+    public void setJvmStartTime(String jvmStartTime) {
+        this.jvmStartTime = jvmStartTime;
+    }
+
+    public String getJvmStartTime() {
+        return jvmStartTime;
+    }
+}

+ 36 - 0
jdk/src/main/java/cn/reghao/jutil/jdk/jvm/model/JvmStat.java

@@ -0,0 +1,36 @@
+package cn.reghao.jutil.jdk.jvm.model;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author reghao
+ * @date 2020-10-22 15:06:29
+ */
+public class JvmStat {
+    /* 类加载情况 */
+    private long jvmClassesLoaded;
+    private long jvmClassesUnloaded;
+    private long jvmClassesTotal;
+
+    /* 堆区和非堆区总体内存使用情况 */
+    private String jvmMemoryHeapInit;
+    private String jvmMemoryHeapMax;
+    private String jvmMemoryHeapUsed;
+    private String jvmMemoryHeapCommitted;
+
+    private String jvmMemoryNonheapInit;
+    private String jvmMemoryNonheapMax;
+    private String jvmMemoryNonheapUsed;
+    private String jvmMemoryNonheapCommitted;
+
+    private List<BufferPoolStat> jvmBufferPools;
+    private Map<String, MemoryPoolStat> jvmMemoryPools;
+    private List<GarbageCollectorStat> jvmGarbageCollectors;
+
+    /* 线程使用情况 */
+    private int jvmThreadsLive;
+    private int jvmThreadsDaemon;
+    private int jvmThreadsPeak;
+    private List<ThreadStat> jvmThreads;
+}

+ 29 - 0
jdk/src/main/java/cn/reghao/jutil/jdk/jvm/model/MemoryPoolStat.java

@@ -0,0 +1,29 @@
+package cn.reghao.jutil.jdk.jvm.model;
+
+import java.lang.management.MemoryPoolMXBean;
+import java.lang.management.MemoryUsage;
+
+/**
+ * @author reghao
+ * @date 2020-10-21 15:49:56
+ */
+public class MemoryPoolStat {
+    private String poolName;
+    private String memoryType;
+    private MemoryStat poolUsage;
+    // 内存池峰值时的使用情况
+    private MemoryStat poolPeakUsage;
+    // 最近一次 GC 后的内存池的使用情况
+    private MemoryStat afterGcUsage;
+
+    public MemoryPoolStat(MemoryPoolMXBean memoryPoolBean) {
+        this.poolName = memoryPoolBean.getName();
+        this.memoryType = memoryPoolBean.getType().name();
+        this.poolUsage = new MemoryStat(memoryPoolBean.getUsage());
+        this.poolPeakUsage = new MemoryStat(memoryPoolBean.getPeakUsage());
+        MemoryUsage collectionMemoryUsage = memoryPoolBean.getCollectionUsage();
+        if (collectionMemoryUsage != null) {
+            this.afterGcUsage = new MemoryStat(collectionMemoryUsage);
+        }
+    }
+}

+ 25 - 0
jdk/src/main/java/cn/reghao/jutil/jdk/jvm/model/MemoryStat.java

@@ -0,0 +1,25 @@
+package cn.reghao.jutil.jdk.jvm.model;
+
+import cn.reghao.jutil.jdk.converter.ByteConverter;
+import cn.reghao.jutil.jdk.converter.ByteType;
+
+import java.lang.management.MemoryUsage;
+
+/**
+ * @author reghao
+ * @date 2020-10-21 15:49:56
+ */
+public class MemoryStat {
+    private String init;
+    private String max;
+    private String used;
+    private String committed;
+
+    public MemoryStat(MemoryUsage memoryUsage) {
+        ByteConverter convert = new ByteConverter();
+        this.init = convert.convertStr(ByteType.Bytes, ByteType.MiB, memoryUsage.getInit());
+        this.max = convert.convertStr(ByteType.Bytes, ByteType.MiB, memoryUsage.getMax());
+        this.used = convert.convertStr(ByteType.Bytes, ByteType.MiB, memoryUsage.getUsed());
+        this.committed = convert.convertStr(ByteType.Bytes, ByteType.MiB, memoryUsage.getCommitted());
+    }
+}

+ 33 - 0
jdk/src/main/java/cn/reghao/jutil/jdk/jvm/model/ThreadStat.java

@@ -0,0 +1,33 @@
+package cn.reghao.jutil.jdk.jvm.model;
+
+import java.lang.management.ThreadInfo;
+
+/**
+ * @author reghao
+ * @date 2020-10-21 17:31:47
+ */
+public class ThreadStat {
+    private String threadName;
+    private String threadState;
+    private long blockedTime;
+    private long blockedCount;
+    private long waitedTime;
+    private long waitedCount;
+    private String lockName;
+    private String lockOwnerName;
+    private int lockedMonitorCount;
+    private int lockedSynchronizerCount;
+
+    public ThreadStat(ThreadInfo threadInfo) {
+        this.threadName = threadInfo.getThreadName();
+        this.threadState = threadInfo.getThreadState().name();
+        this.blockedTime = threadInfo.getBlockedTime();
+        this.blockedCount = threadInfo.getBlockedCount();
+        this.waitedTime = threadInfo.getWaitedTime();
+        this.waitedCount = threadInfo.getWaitedCount();
+        this.lockName = threadInfo.getLockName();
+        this.lockOwnerName = threadInfo.getLockOwnerName();
+        this.lockedMonitorCount = threadInfo.getLockedMonitors().length;
+        this.lockedSynchronizerCount = threadInfo.getLockedSynchronizers().length;
+    }
+}

+ 12 - 2
jdk/src/main/java/cn/reghao/jutil/jdk/result/Result.java

@@ -16,6 +16,7 @@ public class Result implements Serializable {
 
     private int code;
     private String msg;
+    private String data;
     private final long timestamp;
 
     public Result() {
@@ -38,6 +39,14 @@ public class Result implements Serializable {
         this.msg = msg;
     }
 
+    public String getData() {
+        return data;
+    }
+
+    public void setData(String data) {
+        this.data = data;
+    }
+
     public long getTimestamp() {
         return timestamp;
     }
@@ -59,14 +68,15 @@ public class Result implements Serializable {
     public static Result success(String data) {
         Result result = new Result();
         result.setCode(SUCCESS.getCode());
-        result.setMsg(data);
+        result.setMsg(SUCCESS.getMsg());
+        result.setData(data);
         return result;
     }
 
     public static Result success() {
         Result result = new Result();
         result.setCode(SUCCESS.getCode());
-        result.setMsg("success");
+        result.setMsg(SUCCESS.getMsg());
         return result;
     }
 

+ 4 - 33
tool/src/main/java/cn/reghao/jutil/tool/http/DefaultWebRequest.java

@@ -108,7 +108,7 @@ public class DefaultWebRequest extends BaseWebRequest implements WebRequest {
     }
 
     @Override
-    public WebResponse upload(String url, UploadParam uploadParam) {
+    public WebResponse upload(String url, UploadParam uploadParam, String token) {
         MultipartEntityBuilder builder = MultipartEntityBuilder.create();
         builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
         builder.setCharset(StandardCharsets.UTF_8);
@@ -129,6 +129,9 @@ public class DefaultWebRequest extends BaseWebRequest implements WebRequest {
         }
 
         HttpPost post = new HttpPost(url);
+        if (token != null) {
+            post.addHeader("Authorization", "Bearer " + token);
+        }
         if (headers != null) {
             headers.forEach(post::addHeader);
         }
@@ -142,38 +145,6 @@ public class DefaultWebRequest extends BaseWebRequest implements WebRequest {
         }
     }
 
-    public WebResponse upload1(String url, UploadParam uploadParam, long userId) {
-        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
-        builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
-        builder.setCharset(StandardCharsets.UTF_8);
-
-        ContentBody contentBody;
-        if (uploadParam.getFile() != null) {
-            contentBody = new FileBody(uploadParam.getFile());
-        } else if (uploadParam.getBytes() != null) {
-            contentBody = new ByteArrayBody(uploadParam.getBytes(), uploadParam.getMimeType());
-        } else {
-            return new WebResponse(600, "not data in UploadParam");
-        }
-
-        builder.addPart("file", contentBody);
-        Map<String, String> map = uploadParam.getTextParams();
-        if (map != null) {
-            map.forEach(builder::addTextBody);
-        }
-
-        HttpPost post = new HttpPost(url);
-        post.addHeader("x-user-id", ""+userId);
-        post.setEntity(builder.build());
-        try (CloseableHttpResponse response = client.execute(post)) {
-            int statusCode = response.getStatusLine().getStatusCode();
-            String body = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);;
-            return new WebResponse(statusCode, body);
-        } catch (Exception e) {
-            return new WebResponse(600, e.getMessage());
-        }
-    }
-
     private WebResponse execRequest(HttpRequestBase request) {
         if (headers != null) {
             headers.forEach(request::addHeader);