我正在使用eclipsejettyhttpclient向服务器发送post请求,以进行负载测试。
热释光;dr:有没有一种方法可以将一个httpclient示例与多个用户凭据集一起使用到一个目标url?
为此,我需要作为单独的用户登录到被测服务器。尽管httpclient是线程安全的,但由于其共享的身份验证存储,它似乎不支持在单个示例中使用它。
解决方案似乎很简单,只需为每个用户或每个线程使用一个httpclient。
这可以正常工作,除了httpclient为每个示例创建了许多线程(看起来是5到10个),所以我的负载测试需要一个非常大的堆,否则它将在尝试创建新线程时抛出outofmemory异常。
例如,在这个非常基本的测试中,第一组凭证用于所有后续的帖子:
public class Test
{
static class User
{
String username;
String password;
User(String username, String password)
{
this.username = username;
this.password = password;
}
}
public static void main(String[] args) throws Exception
{
SslContextFactory sslContextFactory = new SslContextFactory.Client();
HttpClient httpClient = new HttpClient(sslContextFactory);
httpClient.start();
List<User> users = new ArrayList<>();
users.add(new User("fry", "1234"));
users.add(new User("leela", "2345"));
users.add(new User("zoidberg", "3456"));
URI uri = new URI("http://localhost:8080/myapi");
for (User user : users)
{
AuthenticationStore auth = httpClient.getAuthenticationStore();
auth.addAuthentication(new DigestAuthentication(uri, DigestAuthentication.ANY_REALM, user.username, user.password));
Request request = httpClient.newRequest(uri);
request.method("POST");
ContentResponse result = request.send();
System.out.println(result.getStatus());
}
}
}
现在,我意识到在这个人为的测试中,我可以调用 httpClient.getAuthenticationStore().clearAuthenticationResults()
以及 httpClient.getAuthenticationStore().clearAuthentications();
在循环之间,但是这不适用于我的实际测试,我有多个线程在同一时间发布。
我是否为每个用户使用一个单独的httpclient示例?
谢谢你的建议!
1条答案
按热度按时间t5zmwmid1#
您所需要的可以通过“抢占”每个请求的身份验证头来完成,如文档中所述。
你应该这样做:
发送请求不需要像上面的简单示例那样是连续的或使用阻塞api。
你可以从一个
for
循环,并随机选择一个用户(及其相应的授权),例如,使用异步API以获得更好的性能。