paramType和paramValue參數
paramType:里面的參數類型,可以是對象,也可以是基本數據類型
1、如果是基本數據類型,paramValue里面是不需要填寫class類名
2、如果參數類型是對象,那么paramValue里面需要填寫對應的class類名:class": "com.midea.jr.shuffle.model.SupplyChainRuleInfoBO",
運行Jmeter時,響應數據中文亂碼問題
修改jmeter.properties中的sampleresult.default.encoding
,文件位置:JMETER_HOME\bin\
#sampleresult.default.encoding=ISO-8859-1
改為
sampleresult.default.encoding=UTF-8
When running Jmeter, the response data Chinese garbled problem
Modify sampleresult.default.encoding
in jmeter.properties, file location: JMETER_HOME\bin\
#sampleresult.default.encoding=ISO-8859-1
Change to
sampleresult.default.encoding=UTF-8
空參使用案例
如果參數類型是基礎類型或基礎類型的包裝類
- paramType: 必須填寫,基礎類型名稱 或 包裝類完全名(含包名)
- paramValue: 填寫
null
或NULL
或不填寫值(空),不要填寫""
(""
表示后端接收到雙引號字符串並非空串),例如下圖:
如果參數類型為復雜類型,例如Map
、List
、自定義JavaBean
- paramType: 必須填寫,類完全名(含包名)
- paramValue: 必須是合法的json格式數據,需要掌握json知識,比如說集合、數組、map這些使用什么json格式體現,json格式在線驗證可以使用工具bejson
- paramValue: 填寫
null
或NULL
或不填寫值(空),不要填寫""
(""
表示后端接收到雙引號字符串並非空串) - paramValue: 填寫
{}
表示new一個空對象所有屬性都為空 - 如果只想給對象中的某幾個屬性傳值其余屬性不傳值,參考下面示例:
- 示例:對象中分別有三個屬性
attr1
、attr2
、attr3
- paramValue: 填寫
{"attr1":"val1"}
表示對象中attr1
屬性值為val1
,其余兩個屬性attr2
和attr3
的值均為null
- paramValue: 填寫
- 示例:對象中分別有三個屬性
- paramValue: 填寫
{"attr1":"null"}
表示后端接收到非null
參數對象,對象中attr1
屬性值是一個"null"
字符串,並不是null
引用 - paramValue: 填寫
{"attr1":""}
表示后端接收到非null
參數對象,對象中attr1
屬性值是一個空字符串 - paramValue: 填寫
{"attr1":}
這是一個錯誤的json格式,表示后端接收到null
引用 - paramValue: 填寫
[]
表示集合、數組類的參數
復雜參數使用案例
參數示例類
io.github.ningyu.MyClassVo
package io.github.ningyu;
import java.io.Serializable;
public class MyClassVo implements Serializable {
private static final long serialVersionUID = 2833248590539596892L;
private String name;
public void setName(String name) {
this.name= name;
}
public String getName() {
return name;
}
}
io.github.ningyu.RequestVo<T>
package io.github.ningyu;
import java.io.Serializable;
public class RequestVo<T> implements Serializable {
private static final long serialVersionUID = -5111447619170259174L;
private T items = null;
public RequestVo(T items) {
super();
this.items = items;
}
public T getItems() {
return items;
}
public void setItems(T items) {
this.items = items;
}
}
泛型參數示例
-
參數類型為:
io.github.ningyu.MyClassVo
- paramType:
io.github.ningyu.MyClassVo
- paramValue:
{"name":"123456"}
- paramType:
-
參數類型為:
io.github.ningyu.MyClassVo[]
- paramType:
io.github.ningyu.MyClassVo[]
- paramValue:
[{"name":"123456"}]
- paramType:
-
參數類型為:
io.github.ningyu.RequestVo<MyClassVo>
- paramType:
io.github.ningyu.RequestVo
- paramValue:
{"items": {"class": "io.github.ningyu.MyClassVo","name": "123456"}}
- paramType:
-
參數類型為:
io.github.ningyu.RequestVo<MyClassVo>[]
- paramType:
io.github.ningyu.RequestVo[]
- paramValue:
[{"items": {"class": "io.github.ningyu.MyClassVo","name": "123456"}}]
- paramType:
-
參數類型為:
java.util.List<MyClassVo>
- paramType:
java.util.List
- paramValue:
[{"class": "io.github.ningyu.MyClassVo","name":"123456"}]
- paramType:
-
參數類型為:
java.util.List<MyClassVo>[]
- paramType:
java.util.List[]
- paramValue:
[[{"class": "io.github.ningyu.MyClassVo","name":"123456"}]]
- paramType:
-
參數類型為:
java.util.Map<String, MyClassVo>
- paramType:
java.util.Map
- paramValue:
{"key":{"class": "io.github.ningyu.MyClassVo","name":"123456"}}
- paramType:
-
參數類型為:
java.util.Map<String, MyClassVo>[]
- paramType:
java.util.Map[]
- paramValue:
[{"key":{"class": "io.github.ningyu.MyClassVo","name":"123456"}}]
- paramType:
調用RPC報錯:java.lang.RuntimeException: Failed to set pojo XXVO property timestamp value 2018-09-13 10:00:00(class java.lang.String), cause: argument type mismatch
問題描述
這個問題是我們反序列化的對象中使用了java.sql.timestamp類型,傳入的json的值是“2018-09-13 10:32:00”,走泛化類型反序列化的時候出現錯誤。 而且還有個奇怪現象是使用jmeter-dubbo-plugin-1.2.x的版本是不會出現錯誤的,使用jmeter-dubbo-plugin-1.3.x的版本會出現錯誤。
問題分析
其實這個問題的原因是:1.2.x需要jmeter的classpath下引入業務api jar包,1.3.x走泛化類型不需要引用api jar包,所以在類型轉換是不一樣的處理邏輯。
解決方法
jmeter-dubbo-plugin在調用rpc之前會進行一次反序列化,反序列化的時候會優先找本地classpath下jar包中的類型,因此只需要將api-jar加入到jmeter的classpath即可,也就是說v1.3.x版本支持客戶端無api-jar的調用,也支持客戶端有api-jar的調用。
調用RPC報錯:No such extension com.alibaba.dubbo.common.serialize.Serialization by name kryo
請查看服務端使用的序列化類庫是什么?插件只打包了默認序列化和fst,其余的序列化類庫需要使用者手動將jar包放入JMETER_HOME/lib/ext
下
拿kryo舉個例子,比如這個配置:
<dubbo:protocol name="dubbo" port="30001" serialization="kryo"/>
這個配置說明序列化用到了kryo,那么就要將kryo的jar包放入JMETER_HOME/lib/ext
,jar包版本可以看服務端的依賴的版本
DUPLICATE_CONFIGCENTERCONFIG
重復的配置中心,這個問題是因為config center初始化后不允許修改並且只允許存在一個,我們在jmeter中反復修改config center中屬性值后運行就會出現這個錯誤,由於目前ConfigCenterConfig對象無法銷毀和重新刷新,因此只能重新打開jmeter,建議設置好配置中心的屬性后試運行一下進行預熱,如果要修改配置中心值需要重開jmeter后生效
MISS_INTERFACE
沒有設置接口信息
RETRIES_ERROR
retries不是一個數字
TIMEOUT_ERROR
timeout不是一個數字
CONNECTIONS_ERROR
connections不是一個數字
GENERIC_SERVICE_IS_NULL
沒有找到泛化接口,可能是group、version不匹配
MISS_METHOD
方法為空
MISS_ADDRESS
配置中心或注冊中心地址為空
UNKNOWN_EXCEPTION
未知異常
RpcException
參考Dubbo的錯誤編碼,http://dubbo.apache.org/docs/2.7.x/api/com/alibaba/dubbo/rpc/RpcException.html
引入地址:https://github.com/thubbo/jmeter-plugins-for-apache-dubbo/wiki/FAQ