编写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异常。
posted @ 2017-06-23 16:37  zhaichao  阅读(880)  评论(0)    收藏  举报