tuqin
2026-10-30 9762201a15fce951e6e8faff468ec76a1c3363bd
fix(LIMS): 修复浪潮 OSS 应用心跳从未发送,导致应用一直无法开通

TideUtils.heartbeat() 原本声明为 public static void,但 Spring 的
ScheduledAnnotationBeanPostProcessor 只给非静态方法注册调度:静态方法没有
bean 实例作为宿主,拿不到实例就无法包装成 Runnable、走不了 AOP 代理、
也无法跟随 bean 生命周期销毁,因此 Spring 5.2+ 遇到 static 直接打一条
INFO 日志后静默跳过(不抛异常,启动照常成功)。

后果:应用启动正常、日志干净,但心跳一次都没发出去。浪潮 OSS 侧因为收不到
/cpn/api/extra/v1/application/heartbeat 请求,把本应用判定为离线/未激活,
所以每次点"开通"都失败——appId/appSecret 配对了也没用,因为流程根本没走到
使用凭据的那一步。

改为 public void(去掉 static),并:
- System.out.println -> log.info,便于在 app.log 里 grep 到心跳结果
- 包一层 try/catch + log.error,避免 OSS 侧网络抖动导致定时任务线程异常中断

已验证:javap 反编译 jar 内 TideUtils.class 得到 "public void heartbeat();"
(非 static)。启动类 RuoYiApplication 上的 @EnableScheduling 本来就有,无需改动。
已修改1个文件
20 ■■■■■ 文件已修改
src/main/java/com/ruoyi/tide/utils/TideUtils.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/tide/utils/TideUtils.java
@@ -121,13 +121,23 @@
    /**
     * 五分钟一次的心跳
     * <p>
     * 注意:这里不能加 static。Spring 的 ScheduledAnnotationBeanPostProcessor 只给
     * 非静态方法注册调度(静态方法没有 bean 实例作为宿主,无法走 AOP 代理、无法管理生命周期),
     * 遇到 static 会打一条 INFO 日志后静默跳过,表现为"启动正常但从不执行"。
     * 之前写的是 public static void,导致浪潮 OSS 从未收到过本应用的心跳,
     * 应用在 OSS 侧一直是离线状态,所以"开通"一直失败。
     */
    @Scheduled(cron = "0 0/5 * * * ?")
    public static void heartbeat(){
        HashMap<String, String> header = getGetHeader(null);
        String url = ip + "/cpn/api/extra/v1/application/heartbeat";
        String body = HttpRequest.get(url).headerMap(header, false).execute().body();
        System.out.println(body + "应用心跳执行成功!");
    public void heartbeat(){
        try {
            HashMap<String, String> header = getGetHeader(null);
            String url = ip + "/cpn/api/extra/v1/application/heartbeat";
            String body = HttpRequest.get(url).headerMap(header, false).execute().body();
            log.info("浪潮 OSS 应用心跳返回:{}", body);
        } catch (Exception e) {
            log.error("浪潮 OSS 应用心跳发送失败", e);
        }
    }
    // 获取token