编写dubbo测试代码
操作步骤:
1、新建dubbo接口测试工程(建议一个dubbo服务工程对应一个dubbo接口测试工程,这样方便代码管理)
a)安装好IntelliJ IDEA,打开file->new->Project->maven->next,新建maven工程

b)填写groupId、artifactId、version

c)填写project name
注意:maven一定要配置成你本地的

2、配置pom.xml文件
a)配置需要测试的dubbo服务
1 <!--配置需要测试的dubbo服务--> 2 <dependencies> 3 <dependency> 4 <artifactId>promotion-interfaces</artifactId> 5 <version>1.0.9-SNAPSHOT</version> 6 <groupId>com.gome.npop</groupId> 7 <exclusions> 8 <exclusion> 9 <groupId>*</groupId> 10 <artifactId>*</artifactId> 11 </exclusion> 12 </exclusions> 13 </dependency> 14 </dependencies>
注意如果pom.xml报错如下:
Invalid content was found starting with element 'dependency'. One of '{"http://maven.apache.org/POM/4.0.0":parent, "http://maven.apache.org/POM/4.0.0":packaging, "http://maven.apache.org/POM/4.0.0":name, "http://maven.apache.org/POM/4.0.0":description, "http://maven.apache.org/POM/4.0.0":url, "http://maven.apache.org/POM/4.0.0":prerequisites, "http://maven.apache.org/POM/4.0.0":issueManagement, "http://maven.apache.org/POM/4.0.0":ciManagement, "http://maven.apache.org/POM/4.0.0":inceptionYear, "http://maven.apache.org/POM/4.0.0":mailingLists, "http://maven.apache.org/POM/4.0.0":developers, "http://maven.apache.org/POM/4.0.0":contributors, "http://maven.apache.org/POM/4.0.0":licenses, "http://maven.apache.org/POM/4.0.0":scm, "http://maven.apache.org/POM/4.0.0":organization, "http://maven.apache.org/POM/4.0.0":build, "http://maven.apache.org/POM/4.0.0":profiles, "http://maven.apache.org/POM/4.0.0":modules, "http://maven.apache.org/POM/4.0.0":repositories, "http://maven.apache.org/POM/4.0.0":pluginRepositories, "http://maven.apache.org/POM/4.0.0":dependencies, "http://maven.apache.org/POM/4.0.0":reports, "http://maven.apache.org/POM/4.0.0":reporting, "http://maven.apache.org/POM/4.0.0":dependencyManagement, "http://maven.apache.org/POM/4.0.0":distributionManagement, "http://maven.apache.org/POM/4.0.0":properties}' is expected.
解决办法:
在所有的<dependency>...</dependency>外加上<dependencies>...</dependencies>
b)配置需要的一些工具jar包(dubbo工程会有,可参考父工程pom.xml文件)
1 <!--配置需要的一些工具jar包--> 2 <dependency> 3 <groupId>com.alibaba</groupId> 4 <artifactId>dubbo</artifactId> 5 <version>2.5.3</version> 6 <exclusions> 7 <exclusion> 8 <groupId>org.springframework</groupId> 9 <artifactId>spring</artifactId> 10 </exclusion> 11 </exclusions> 12 </dependency>
c)配置jmeter相关的jar包,使用的是ApacheJMeter_java,版本号此处使用2.13,可自行在jmeter官网查看版本号,根据需要配置。
1 <!--配置jmeter相关的jar包--> 2 <dependency> 3 <groupId>org.apache.jmeter</groupId> 4 <artifactId>ApacheJMeter_java</artifactId> 5 <version>2.13</version> 6 <exclusions> 7 <exclusion> 8 <groupId>d-haven-managed-pool</groupId> 9 <artifactId>d-haven-managed-pool</artifactId> 10 </exclusion> 11 <exclusion> 12 <artifactId>commons-math3</artifactId> 13 <groupId>commons-math3</groupId> 14 </exclusion> 15 <exclusion> 16 <artifactId>commons-pool2</artifactId> 17 <groupId>commons-pool2</groupId> 18 </exclusion> 19 </exclusions> 20 <!--<scope>provided</scope>--> 21 </dependency>
d)配置build相关(打包需要),建议就使用如下配置,不要做其他更改,使用其他配置,可能导致产生一些无法预知的问题。
1 <!--配置build相关(打包需要)--> 2 <build> 3 <plugins> 4 <plugin> 5 <groupId>org.apache.maven.plugins</groupId> 6 <artifactId>maven-shade-plugin</artifactId> 7 <version>1.4</version> 8 <executions> 9 <execution> 10 <phase>package</phase> 11 <goals> 12 <goal>shade</goal> 13 </goals> 14 <configuration> 15 <filters> 16 <filter> 17 <artifact>*:*</artifact> 18 <excludes> 19 <exclude>META-INF/*.SF</exclude> 20 <exclude>META-INF/*.DSA</exclude> 21 <exclude>META-INF/*.RSA</exclude> 22 </excludes> 23 </filter> 24 </filters> 25 26 <transformers> 27 <transformer 28 implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 29 <resource>META-INF/spring.handlers</resource> 30 </transformer> 31 <transformer 32 implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 33 <mainClass>com.fxc.rpc.impl.member.MemberProvider</mainClass> 34 </transformer> 35 <transformer 36 implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 37 <resource>META-INF/spring.schemas</resource> 38 </transformer> 39 </transformers> 40 </configuration> 41 </execution> 42 </executions> 43 </plugin> 44 </plugins> 45 </build>
e)阿里的Dubbo框架已经集成了Zookeeper、Spring等框架所以无须再添加这些框架的引用,但是有一个例外就是zkclient,如果没有引用将会抛出异常信息,所以添加zkclient的jar
1 <dependency> 2 <groupId>com.github.sgroschupf</groupId> 3 <artifactId>zkclient</artifactId> 4 <version>0.1</version> 5 </dependency>
3、Dubbo配置
a)编写dubbo消费端配置文件
resources文件夹下面新建dubbo-client.xml 。 如图,发现没有spring文件

在pom.xml里面配置spring依赖
1 <dependency> 2 <groupId>org.springframework</groupId> 3 <artifactId>spring-context</artifactId> 4 <version>4.1.7.RELEASE</version> 5 </dependency>
配置好刷新包之后,再次选择

创建好spring配置文件dubbo-client.xml :
加入红框内容,否则
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd
这两句提示未使用,并且dubbo-client.xml文件报 Namespace 'dubbo' is not bound

<dubbo:registry>:dubbo 服务注册配置
<dubbo:application>:dubbo应用名称
<dubbo:reference>:生成远程服务代理,可以像使用本地bean一样使用远程服务。
4、基本配置全部完毕,开始Java类编写:
如下例子:
查询商家是否参购物券活动
接口类:com.gome.coupon.interfaces.dubbo.IPromotionAndCouponManager
方法:isShopPlatformCouponActivity(List<String> shopNoList,String userId)
参数:参数1:{"80007138","81012768","81012772"}, 参数2:“171170338”
新建类ContextGetBean
1 import org.springframework.context.support.ClassPathXmlApplicationContext; 2 3 /** 4 * Created by zhaichao on 2017/6/27. 5 */ 6 public class ContextGetBean { 7 private static ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"classpath:dubbo-client.xml"}); 8 public static void ContextGetBean(){ 9 context.start(); 10 } 11 public static Object getBean(String classpath,String beanName){ 12 return context.getBean(beanName); 13 } 14 }
jmeter执行类 CouponActivity
1 import com.gome.coupon.interfaces.dubbo.IPromotionAndCouponManager; 2 import com.gome.coupon.model.cartBean.ResultDO; 3 import com.gome.coupon.model.cartBean.ShopPromotionResult; 4 import org.apache.jmeter.config.Arguments; 5 import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient; 6 import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext; 7 import org.apache.jmeter.samplers.SampleResult; 8 9 import java.util.ArrayList; 10 import java.util.List; 11 import java.util.Map; 12 13 /** 14 * Created by zhaichao on 2017/6/27. 15 */ 16 public class CouponActivity extends AbstractJavaSamplerClient { 17 private IPromotionAndCouponManager iPromotionAndCouponManager; 18 private Arguments params; 19 public void setupTest(JavaSamplerContext args) 20 { 21 iPromotionAndCouponManager=(IPromotionAndCouponManager)ContextGetBean.getBean("classpath:dubbo-client.xml","promotionAndCouponManager"); 22 23 } 24 25 public Arguments getDefaultParameters(){ 26 // ResultDO<Map<String, ShopPromotionResult>> isShopPlatformCouponActivity(List<String> var1, String var2); 27 this.params=new Arguments(); 28 this.params.addArgument("shopNoList","\"80007138\",\"81012768\",\"81012772\""); 29 this.params.addArgument("userId","171170338"); 30 return params; 31 } 32 33 public SampleResult runTest(JavaSamplerContext args) 34 { 35 String shopNoList = args.getParameter("shopNoList","\"80007138\",\"81012768\",\"81012772\""); 36 String userId = args.getParameter("userId","171170338"); 37 shopNoList=shopNoList.replace("\"",""); 38 String[] noList = shopNoList.split(","); 39 List<String> list = java.util.Arrays.asList(noList); 40 List arrList = new ArrayList(list); 41 for (int i = 0 ; i < noList.length;i++){ 42 arrList.add(noList[i]); 43 } 44 ResultDO<Map<String, ShopPromotionResult>> rd = iPromotionAndCouponManager.isShopPlatformCouponActivity(list,userId); 45 SampleResult sr = new SampleResult(); 46 sr.sampleStart(); 47 try{ 48 if(rd != null && rd.isSuccess()==true){ 49 this.getLogger().info("正确通过"); 50 sr.setSuccessful(true);//必须得加,否则在jmeter中执行的话查看结果树是红色的 51 }else{ 52 this.getLogger().info(rd.getErrorMsg()); 53 this.getLogger().info("未抛异常"); 54 sr.setSuccessful(false); 55 56 } 57 }catch (Exception e){ 58 sr.setSuccessful(false); 59 e.getStackTrace(); 60 this.getLogger().error("抛出异常如下:"+e); 61 } 62 sr.sampleEnd(); 63 return sr; 64 } 65 66 public void teardownTest(JavaSamplerContext args) 67 { 68 69 } 70 71 public static void main(String[] args){ 72 CouponActivity couponActivity = new CouponActivity(); 73 Arguments param = couponActivity.getDefaultParameters(); 74 JavaSamplerContext javaSamplerContext = new JavaSamplerContext(param); 75 couponActivity.setupTest(javaSamplerContext); 76 SampleResult result = couponActivity.runTest(javaSamplerContext); 77 couponActivity.teardownTest(javaSamplerContext); 78 } 79 80 }
5、遇到的问题
1、在执行主函数如果报错如下:

原因:在string转List<String>的时候代码:
1 String shopNoList = args.getParameter("shopNoList","\"80007138\",\"81012768\",\"81012772\""); 2 String userId = args.getParameter("userId","171170338"); 3 shopNoList=shopNoList.replace("\"",""); 4 String[] noList = shopNoList.split(","); 5 List<String> list = java.util.Arrays.asList(noList); 6 for (int i = 0 ; i < noList.length;i++){ 8 list.add(noList[i]); 9 }
修正之后如下:
1 String shopNoList = args.getParameter("shopNoList","\"80007138\",\"81012768\",\"81012772\""); 2 String userId = args.getParameter("userId","171170338"); 3 shopNoList=shopNoList.replace("\"",""); 4 String[] noList = shopNoList.split(","); 5 List<String> list = java.util.Arrays.asList(noList); 6 List arrList = new ArrayList(list); 7 for (int i = 0 ; i < noList.length;i++){ 8 arrList.add(noList[i]); 9 }
原因:
java.lang.UnsupportedOperationException是指请求的方法不被支持的异常。在从Arrays.asList()转化过来的List的不支持add()和remove()方法,这是由于从Arrays.asList()返回的是java.util.Arrays$ArrayList,
而不是ArrayList。Arrays$ArrayList和ArrayList都是继承AbstractList,add() 和remove()等方法在AbstractList中默认throw UnsupportedOperationException而不做任何操作。ArrayList重写这些方法对List进行操作,
而Arrays$ArrayList却没有重写add()和 remove()等方法,所以对从Arrays.asList()转化过来的List进行add()和remove()会出现UnsupportedOperationException异常。
浙公网安备 33010602011771号