# 方法调用链 **Repository Path**: The-Blind/method-call-chain ## Basic Information - **Project Name**: 方法调用链 - **Description**: 基于注解的方法调用链 让方法链具有 组的概念 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 11 - **Forks**: 2 - **Created**: 2020-12-25 - **Last Updated**: 2023-04-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 方法调用链 #### 介绍 基于注解的方法调用链 #### 软件架构 使用 agent+javassist #### 使用说明 1. 在需要监控的项目中到入本jar包 2. 添加vm参数 -javaagent:xxxxx.jar[=com.dss.synchronization] 等于号后面为可填参数 是需要转化的包可不填 3. 添加注解@Oversee ``` public @interface Oversee { /** * @return 描述 */ String describe() default ""; boolean isGroup() default true; /** * * @return 所属组 */ String belongGroup() default ""; /** * 值 默认为组值 当不赋值时 动态获取 * * @return */ String value() default ""; /** * 获取步骤 Java 代码 * 用@Return=来获取最终返回值 * -@Return只能为String类型 * 不支持语法糖 因为语法糖会在编译期转化为最终的代码 * * @return */ String getValueSteps() default ""; String getDescribeSteps() default ""; String getIsGroupSteps() default ""; } ``` 4.配置回调 会在方法开始和结束的时候回调 ``` public class SyncCon extends MonitoringCache.AbstractCallback { @Override public void start(MonitoringCache.MonitoringData monitoringData) { SocketHandler.send(SocketHandler.SYNC_METHOD_CHAIN,monitoringData); System.out.println("Callback start "+ JSONUtil.toJsonStr(monitoringData)); } @Override public void end(MonitoringCache.MonitoringData monitoringData) { SocketHandler.send(SocketHandler.SYNC_METHOD_CHAIN,monitoringData); System.out.println("Callback end "+ JSONUtil.toJsonStr(monitoringData)); } } ``` 在项目启动的时候通过MonitoringCache.setCallback(new SyncCon()); 设置配置 ``` public static void main(String[] args) { MonitoringCache.setCallback(new SyncCon()); SpringApplication.run(SynchronizationApplication.class, args); } ``` #### 用例 ``` @Oversee(describe = "测试父", value = "b17f24ff026d409") public void run2() { System.out.println("测试父"); run3(); } @Oversee(describe = "测试子", value = "b17f24ff026d4091") public void run3() { run4(); } @Oversee(describe = "data", value = "1", isGroup = false) public void run4() { try { TimeUnit.SECONDS.sleep(6); } catch (InterruptedException e) { e.printStackTrace(); } } ``` 通过 MonitoringCache.getDataCacheTree() 返回一个树形结构 树是一个缓存树 通过 MonitoringCache.refreshDataCacheTree()可以刷新树 ``` [{ "node": { "id": "b17f24ff026d409", "belongGroup": "", "describe": "测试父", "finishedState": false, "finishedTime": null, "timeConsuming": "", "group": true }, "childNode": [{ "node": { "id": "b17f24ff026d4091", "belongGroup": "b17f24ff026d409", "describe": "测试子", "finishedState": false, "finishedTime": null, "timeConsuming": "", "group": true }, "childNode": [{ "node": { "id": "b17f24ff026d4091-1", "belongGroup": "b17f24ff026d4091", "describe": "data", "finishedState": true, "finishedTime": null, "timeConsuming": "6014", "group": false }, "childNode": [] }] }] }] ``` #### 动态访问局部变量 getXXSteps 里面写java 代码 不支持语法糖 @Return 表述最终结果 ``` @Oversee(describe = "测试父", value = "b17f24ff026d409") public void run2() { System.out.println("测试父"); run3(); } @Oversee(describe = "测试子", getValueSteps = "@Return=val;") public void run3() { String val = UUID.randomUUID().toString(); run4(); } @Oversee(describe = "data", value = "1", isGroup = false) public void run4() { try { TimeUnit.SECONDS.sleep(6); } catch (InterruptedException e) { e.printStackTrace(); } } ``` 输出 ``` [{ "node": { "id": "b17f24ff026d409", "belongGroup": "", "describe": "测试父", "finishedState": true, "finishedTime": null, "timeConsuming": "6017", "group": true }, "childNode": [{ "node": { "id": "b6aad5a4-a4e2-4032-ab4b-33efe10f7011", "belongGroup": "b17f24ff026d409", "describe": "测试子", "finishedState": true, "finishedTime": null, "timeConsuming": "6010", "group": true }, "childNode": [{ "node": { "id": "b6aad5a4-a4e2-4032-ab4b-33efe10f7011-1", "belongGroup": "b6aad5a4-a4e2-4032-ab4b-33efe10f7011", "describe": "data", "finishedState": true, "finishedTime": null, "timeConsuming": "6010", "group": false }, "childNode": [] }] }, { "node": { "id": "8dfe79de-55b8-4b33-b7c6-4af3f4d48018", "belongGroup": "b17f24ff026d409", "describe": "测试子", "finishedState": true, "finishedTime": null, "timeConsuming": "6015", "group": true }, "childNode": [{ "node": { "id": "8dfe79de-55b8-4b33-b7c6-4af3f4d48018-1", "belongGroup": "8dfe79de-55b8-4b33-b7c6-4af3f4d48018", "describe": "data", "finishedState": true, "finishedTime": null, "timeConsuming": "6015", "group": false }, "childNode": [] }] }] }] ``` #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技