动态脚本实现 :

参考文档:https://github.com/chaosblade-io/chaosblade/wiki/%E5%8A%A8%E6%80%81%E8%84%9A%E6%9C%AC%E5%AE%9E%E7%8E%B0-Java-%E5%AE%9E%E9%AA%8C%E5%9C%BA%E6%99%AF

进阶文档解决问题:

  1. 脚本结构解析
  2. 三方工具类引用
  3. SpringBoot管理Bean 手动引入
脚本结构解析:
package com.alibaba.csp.monkeyking.controller;

import java.util.ArrayList;
import java.util.List;
import java.util.Map; import com.alibaba.csp.monkeyking.demo.model.Pet;
import com.alibaba.csp.monkeyking.model.PetVO;
import com.alibaba.csp.monkeyking.model.Result; //包名没有限制可以随意
//依赖的类,必须是目标应用所具备的类或者JDK自带的
//必须添加 public Object run(Map<String, Object> params) 方法 params 对象中包含目标方法参数 key 是参数索引下标 params.get("0")
//调试脚本的时候添加log.info() 日志打印在对应目标服务的日志中
public class ChaosController {
//打印日志便于调试、定位问题
private final static Log log = Log.get(HttpUtils.class);
public Object run(Map<String, Object> params) {
ArrayList<PetVO> petVOS = new ArrayList<>();
log.info("测试难受啊!!!!!!!!!!!!!!!!!");
for (int i = 0; i < 3; i++) {
Pet pet = new Pet();
pet.setName("test_" + i);
PetVO petVO = PetVO.from(pet);
petVOS.add(petVO);
}
Result<List<PetVO>> results = Result.success(petVOS);
return results;
}
}

  

  调试脚本具体方法:

(1)、 用户目录下日志:  /用户/logs/chaosblade/chaosblade.log

(2)、进入chaosblade.log 日志查看脚本执行是否生效:

(3)、查看目标服务的日志:

这就是最基本动态脚本实现。

三方工具类引用

  动态脚本的实现往往会根据不同的场景来实现,但是有很多时候工程内的工具类无法满足需求。这个时候我们的动态脚本还需要用

如何实现呢??  例如我要生成随机身份证、姓名、电话号(我自己的jar包工具类用于测试)

 解决方案:

       将对应的jar包工具类放入jdk中  这样JVM启动的时候就会扫描到你的工具类

(1)、查找jdk位置

(2)、将工具类jar包 方法放入/opt/soft/packet/jdk/jre/lib/ext

注意:你的工具类放入jdk中可能会引起其他服务的jar包冲突,如果其他服务无法启动。先把你放入jdk中的jar包删除。待服务启动后  再放入即可

SpringBoot管理Bean 手动引入

  为什么要手动引入Bean呢?现在大部分代码都是通过Spring 管理的Bean的。我们脚本要使用Bean呢。首先明确一点 动态脚本中不能使用 Spring bean

自动注入。如果我们要使用对应的Bean 就需要手动获取Bean。

(1) 、对应的工程中要有手动注入Bean放入工具类

package com.test.utils;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component; @Component
public class BeanUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext; @Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
BeanUtils.applicationContext = applicationContext;
} private static ApplicationContext getApplicationContext() {
return applicationContext;
} //通过name获取 Bean.
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
} //通过class获取Bean.
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
} //通过name,以及Clazz返回指定的Bean
public static <T> T getBean(String name, Class<T> clazz) {
return getApplicationContext().getBean(name, clazz);
} }

  (2)、动态脚本中手动获取Bean

package com.test.controller;

import com.test.utils.BeanUtils;
import lombok.extern.slf4j.Slf4j; import java.util.ArrayList;
import java.util.List;
import java.util.Map; public class ChaosController {
private final static Log log = Log.get(HttpUtils.class);
//Chaosblade脚本入口
public Object run(Map<String, Object> params) {
BeanUtils applicationContext = new BeanUtils();
//获取Bean类
log.info("测试难受啊 !******************************************************");
Test test= applicationContext.getBean("***", ***.class);
log.info("测试"+ test.toString());
Test2 test2= applicationContext.getBean("***", ***.class);
log.info("测试难受啊 !"+test2.toString());
return 0;
} }

  脚本执行效果:

  

ChaosBlade--动态脚本实现 Java 实验场景的更多相关文章

  1. atitit.bsh BeanShell 的动态脚本使用java

    atitit.bsh BeanShell 的动态脚本使用java 1.1. BeanShell是一个小巧免费的JAVA源码解释器 ,支持对象式的脚本语言特性,亦可嵌入到JAVA源代码中. 亦可嵌入到J ...

  2. 详解java动态代理机制以及使用场景

    详解java动态代理机制以及使用场景 https://blog.csdn.net/u011784767/article/details/78281384 深入理解java动态代理的实现机制 https ...

  3. Java中运行动态脚本

    这里主要总结Java中集成Groovy的应用. Groovy可以与Java完美集成来扩展我们的应用,比如替代Java+jexl实现算式表达式计算或其它功能.在Ofbiz中也集成了Groovy来执行一些 ...

  4. Java动态脚本Groovy,高级啊!

    前言:请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 简介: Groovy是用于Java虚拟机的一种敏捷的动态语言,它是一种成熟的面向对象编程语言,既可以用于面向对象编程,又可以用作纯粹的脚 ...

  5. 180723-Quick-Task 动态脚本支持框架之结构设计篇

    文章链接:https://liuyueyi.github.io/hexblog/2018/07/23/180723-Quick-Task-动态脚本支持框架之结构设计篇/ Quick-Task 动态脚本 ...

  6. 180719-Quick-Task 动态脚本支持框架之使用介绍篇

    文章链接:https://liuyueyi.github.io/hexblog/2018/07/19/180719-Quick-Task-动态脚本支持框架之使用介绍篇/ Quick-Task 动态脚本 ...

  7. 【开源】.Net 动态脚本引擎NScript

    开源地址: https://git.oschina.net/chejiangyi/NScript 开源QQ群: .net 开源基础服务  238543768 .Net 动态脚本引擎 NScript   ...

  8. LR动态脚本的处理

    在处理SSO修改密码脚本时遇到一个问题,根据用户名的不同,提交请求中数据会不一样.处理此问题,如果经分析用同类型的账号(每个账号含有的子账号类型和数目一致)测试与实际不同类型账号性能没有大的差别,则用 ...

  9. 【前端基础】动态脚本与JSONP

    博主入职两个月了,越来越感受到打好基础对于前端工程师的重要性,在向着狂拽酷炫的框架&构建工具高速狂奔之前,必须有一个坚实的基础打底,才不至于轻易翻车.所以博主最近一直在恶补<JS高级程序 ...

随机推荐

  1. ElasticSearch 32766 的限制

    插入一个稍大的数据到elasticsearch的时候,突然报错“ 400 - elastic: Error 400 (Bad Request): Document contains at least ...

  2. 控制台报错Cause: org.xml.sax.SAXParseException; lineNumber: 4; columnNumber: 78; 元素类型 "select" 必须后跟属性规范 ">" 或 "/>"

    首先我的控制台报错是这样的,我找了一下原因看到是第四行的错误: 它说元素select后面必须跟属性规范">""/>"但是我把我眼睛都快丑瞎了都没发现 ...

  3. 使用sklearn做单机特征工程(Performing Feature Engineering Using sklearn)

    本文转载自使用sklearn做单机特征工程 目录 目录 特征工程是什么 数据预处理 1 无量纲化 11 标准化 12 区间缩放法 13 标准化与归一化的区别 2 对定量特征二值化 3 对定性特征哑编码 ...

  4. setAttribute 方法

    IE8及以下不支持 setAttribute用来修改dom标签上的属性比如(onclick); getAttribute用来获取dom标签上的属性

  5. MySQL常用存储引擎:MyISAM与InnoDB之华山论剑

    一 MyISAM 1.1 MyISAM简介 MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的 ISAM (Indexed Sequential Access Method:有索引的顺 ...

  6. [HDU]1166敌兵布阵<静态线段树>

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 题目大意:给出n个点,每个点有一个值,现在有三种操作, 1.在i点加上j 2.在i点减去j 3. ...

  7. js拖拽效果的实现及原理

    元素拖拽分成3个步骤:按下鼠标,移动鼠标,松开鼠标. 拖拽原理:按下拖拽元素后开始监听文档中鼠标移动事件,然后再监听鼠标松开事件:鼠标移动时,元素div要随着鼠标一起移动,需要计算元素div位移的距离 ...

  8. 使用Pytorch在多GPU下保存和加载训练模型参数遇到的问题

    最近使用Pytorch在学习一个深度学习项目,在模型保存和加载过程中遇到了问题,最终通过在网卡查找资料得已解决,故以此记之,以备忘却. 首先,是在使用多GPU进行模型训练的过程中,在保存模型参数时,应 ...

  9. 类实例调用静态方法(Java)

    前言 第一次看到在Java中是可以通过类实例调用静态方法,当然不推荐这么做,接下来会讲到,但是在C#中通过类实例调用静态方法在编译时就不会通过,这里做下记录. 类实例调用静态方法 首先我们来看一个简单 ...

  10. 1005 Spell It Right (20 分)

    Given a non-negative integer N, your task is to compute the sum of all the digits of N, and output e ...