我正在使用jersey-client-1.2访问EHCache REST API来放置/获取我自己的自定义对象。
Jersey Maven依赖:
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.2</version>
</dependency>
客户代码:
MyObject myObject = new MyObject();
myObject.setName("Narendra");
long start = System.currentTimeMillis();
Client client = Client.create();
WebResource webResource = client.resource("http://localhost:9080/ehcache-server/rest/mycache/");
System.out.println("Time spend in creating client - " + (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
ClientResponse putResponse = webResource.type("application/x-java-serialized-object").put(ClientResponse.class, SerializationUtils.serialize(myObject));
System.out.println("Time spend in serializing and putting Object into cache - " + (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
ClientResponse getResponse = webResource.accept("application/x-java-serialized-object").get(ClientResponse.class);
byte[] bytes = getResponse.getEntity(byte[].class);
System.out.println("Time spend in getting and deseralizing object from cache " + (System.currentTimeMillis() - start));
当我使用上面的代码执行负载测试时,应用程序服务器(运行上面的客户端)提供了不良的性能。由于泽西客户端调用,大多数线程进入等待阶段。但是,部署缓存REST API的服务器响应正常。看来球衣客户表现不佳。
我是否遵循上述代码中的Jersey客户端的最佳做法?我错过了导致性能问题的任何问题吗?请问任何想法。
答案 0 :(得分:6)
我得到了解决方案。我正在为每个请求创建泽西客户端。 根据{{3}},在每个请求上创建客户端的成本太高。下面的部分取自同一文档:
客户端实例是昂贵的资源。建议一个 已配置的实例可用于创建Web资源。该 创建Web资源,建立请求和接收 响应保证是线程安全的。因此客户端实例和 WebResource实例可以在多个线程之间共享
作为jersey 2.0 document,我立刻创建了客户端并将其设置为单例类作为变量。然后从同一客户端为不同的请求创建Web资源。因此,对于多个请求,只能调用 Client.create()一次。
用负载测试应用程序后,它就像魅力一样工作,并给出了非常好的性能结果。性能提高了近95%。