我在一些API测试中遇到了竞争条件,我想在调用创建端点后检查是否存在用户。
我创建了一个类,用于检查是否返回了有效数据,如果没有返回,则最多可以在本地运行四次,但我注意到,当它在管道中运行时,它不会执行线程。睡眠命令。
创建类以绕过比赛条件文章源自玩技e族-https://www.playezu.com/179129.html
public static Object commonExistenceQuery(Object endpoint) throws InterruptedException {
int Counter = 0;
Object ID = "";
Object falseCheck = "false";
synchronized (ID) {
System.out.println("attempting to obtain Id for endpoint");
ID = endpoint;
while (ID == falseCheck) {
Thread.sleep(1000);
ID = endpoint;
Counter++;
System.out.println("Id not yet obtained, retrying attempt " + Counter + " of 4");
if (Counter == 4|| ID != falseCheck) {
break;
}
}
if (Counter == 4) {
throw new ArithmeticException("ID was never obtained for endpoint, ensure successfully created");
}
else {
System.out.println("successfully called endpoint and returned a valid ID of " + endpoint);
return ID;
}
}
}
查找用户的类(在ID=端点中调用)文章源自玩技e族-https://www.playezu.com/179129.html
public Object findUser(Object name) throws IOException {
JSONObject failure = new JSONObject();
failure.put("check","false");
Map request = new HashMap();
Map body = new HashMap();
body.put("name", name);
body.put("business", "claims");
body.put("unit", 10);
request.put("body", body);
request.put("callback", "true");
Map findUser = run(userEndpoint.find, request,false);
JSONObject jsonObject = new JSONObject(findUser);
JSONObject getId = jsonObject.getJSONObject("data");
if (getId == null){
getId = failure;
// we need to convert the null to a json object in the result of a failure, to avoid a null pointer exception
System.out.println("failure to locate user ID, returning ID of "+getId.get("check"));
return getId.get("check");
}
else
{
return getId.get("id");
}
}
你知道为什么要用线吗。sleep(1000)可能不起作用,或者欢迎改进代码的方法文章源自玩技e族-https://www.playezu.com/179129.html 文章源自玩技e族-https://www.playezu.com/179129.html
未知地区 1F
这里有多个重大错误。你的代码基本上是一个奇怪的骰子。
String ID = “&引用;;
synchronized (ID) {
您在上同步 对象不 变量. 那么,你是在问 “&引用; 对象来持有锁。哪一个“有效”,但很疯狂-不要锁定字符串。您需要创建一个锁对象,并对所有要“选通”的同步块使用相同的对象,以便只有一个线程可以运行。换句话说, 同步(x){CODE} 意味着该线程将等待,直到它可以获得 x 变量点位于。如果它没有被任何其他东西锁定,它将获得锁并运行。否则,它会一直等到空闲。
Object 假 = "false";
这究竟是什么?Java有布尔值。而且 假 是个疯狂的名字。
ID == 假
== 在两个对象之间进行引用标识检查,这不是您想要的,您想要的是相等检查;那就是 ID.equals(假). 这并不重要,这显然需要 布尔型 东西
你知道为什么要用线吗。睡眠(1000)可能不起作用
你的代码不起作用,你在这里做了各种疯狂的事情,但你还没有测试,你的第一直觉是:“;必须以某种方式破坏这一记录良好的核心库函数;。您应该假设库函数没有被破坏,并且精确地执行文档中所述的操作。如果你认为它们不起作用,你99.9999%的时间是错的;是你的代码被破坏了。
JSONObject
糟糕的API;不要用那个。杰克逊或格森。