gpt4 book ai didi

java - 如何有效地递归调用服务器,直到得到正确的响应?

转载 作者:行者123 更新时间:2023-11-30 04:04:26 25 4
gpt4 key购买 nike

我目前有两个标志。一个是remoteFlag,另一个是secondaryFlag。默认情况下,两者都是 true,如果客户在调用我们的应用程序时想要更改,则可以更改它们。所以可能发生的组合是 -

remoteFlag       secondaryFlag

true true
true false
false false
false true

默认情况下它始终为真。

我应该对我们的服务器进行 HTTP 调用(所有服务器都是 Ubunutu 机器)。假设下面是我的服务器,其完全限定主机名对应于 unix 中的 hostname -f

String hostname1 = hostname1;
String hostname2 = hostname2;

String hostname3 = hostname3;
String hostname4 = hostname4;

我有几个案例,我应该按照下面的描述来做 -

  1. 假设如果 remoteFlag secondaryFlag 均为 true 那么我我应该一一访问上述所有服务器,直到我们得到从服务器返回的响应。含义假设 hostname1 已关闭所以我们不会从该服务器得到任何响应,它会抛出异常,然后我们将去 hostname2 获取相同的数据,但假设如果 hostname2 也已关闭,那么我们将继续hostname3 来获取数据,但如果假设 hostname3 也是然后我们将去 hostname4 获取数据。但如果有任何一个服务器能够给出响应然后我们将返回通过做出适当的回应来表示我们已获得数据。如果没有服务器能够返回响应,那么我们将做出错误响应,表示所有服务器都已关闭。
  2. 现在,如果 remoteFlagtrue 并且 secondaryFlagfalse,那么我们只会访问 hostname1hostname3。如果主机名1是下来,然后我们将去 hostname3 获取响应。如果两者都它们已关闭,然后我们将做出错误响应,指出服务器下降了。
  3. 现在,如果 remoteFlagfalse 并且 secondaryFlagfalse,那么我们只会访问 hostname1,仅此而已。如果 hostname1 已关闭,然后我们将做出错误响应,表示服务器已关闭。
  4. 现在,如果 remoteFlagfalse 并且 secondaryFlagtrue,那么我们只会访问 hostname1hostname2,仅此而已。如果hostname1 宕机了,那么我们就去 hostname2 获取回复。如果它们都宕机了,那么我们会犯一个错误回复说服务器已关闭。

我所说的“宕机”是指服务器没有启动,这就是它们没有响应的原因。我尝试了其中一台已关闭的服务器,如果我尝试访问该服务器,RestTemplate 会引发异常。

下面是我到目前为止的代码,仅适用于 remoteFlag secondaryFlag 都为 true 的情况,但在我看来,它又不是好的代码,因为我只是重复下面代码中的内容。我不知道如果其中任何一台服务器出现故障,我该如何继续递归调用服务器。但是,如果其中任何一个启动并得到正确的响应,则通过使用我获得的实际数据做出 SUCCESS 响应来返回调用。

下面是

public class ClientTask implements Callable<ClientResponse> {

public ClientTask(ClientKey clientKeys) {
this.clientKeys = clientKeys;
}

@Override
public ClientResponse call() throws Exception {
....

boolean remoteFlag = clientKeys.isRemoteFlag();
boolean secondaryFlag = clientKeys.isSecondaryFlag();

RestTemplate restTemplate = new RestTemplate();
String response = null;
...

String hostname1 = hostname1;
String hostname2 = hostname2;

String hostname3 = hostname3;
String hostname4 = hostname4;

// first use case when both are true
if(remoteFlag && secondaryFlag) {
if(hostname1 != null) {
try {
String url = generateURL(hostname1);
response = restTemplate.getForObject(url, String.class);

return new ClientResponse(response, ClientError.NONE, ClientStatus.SUCCESS);
} catch(Exception ex) {
ex.printStackTrace(); // use logger
}
}
// hostname1 is down
if(response == null && hostname2 != null) {
try {
String url = generateURL(hostname2);
response = restTemplate.getForObject(url, String.class);

return new ClientResponse(response, ClientError.NONE, ClientStatus.SUCCESS);
} catch(Exception ex) {
ex.printStackTrace(); // use logger
}
}
// hostname1 and 2 both are down
if(response == null && hostname3 != null) {
try {
String url = generateURL(hostname3);
response = restTemplate.getForObject(url, String.class);

return new ClientResponse(response, ClientError.NONE, ClientStatus.SUCCESS);
} catch(Exception ex) {
ex.printStackTrace(); // use logger
}
}
// hostname1, 2, 3 are down
if(response == null && hostname4 != null) {
try {
String url = generateURL(hostname4);
response = restTemplate.getForObject(url, String.class);

return new ClientResponse(response, ClientError.NONE, ClientStatus.SUCCESS);
} catch(Exception ex) {
ex.printStackTrace(); // use logger
}
}
}

// not sure how to add other use case logic here as well properly
}

/**
* Method to generate the url to hit the servers.
*
*/
private String generateURL(final String hostname) {
StringBuffer url = new StringBuffer();
url.append("http://" + hostname + ":8080/user?userId=" + clientKeys.getUserId() + "&page_id=" + clientKeys.getPageId());

Set<Entry<String, String>> params = clientKeys.getAttributeMap().entrySet();

for(Entry<String, String> e : params){
url.append("&" + e.getKey());
url.append("=" + e.getValue());
}

return url.toString();
}
}

问题陈述:-

在上面的代码中,我只是一直重复一些东西,不知道如何递归地继续调用服务器,直到得到响应。还有我如何在上面的代码中适应其他用例。最初我想为其他用例添加相同的 if block 。然后我想我的整个代码将仅由 if block 填充。

有什么想法可以有效地解决这个问题吗?

最佳答案

您的代码中有很多样板。您只需在 if 语句中填写主机列表即可轻松避免它们。然后您迭代该列表:

List<String> hostnames = new ArrayList<>();
if(remoteFlag && secondaryFlag) {
hostnames.add(hostname1);
hostnames.add(hostname2);

} else if …

for (String hostname : hostnames) {
if(hostname == null) {
continue;

}
try {
String url = generateURL(hostname1);
response = restTemplate.getForObject(url, String.class);
break;

} catch(Exception ex) {
ex.printStackTrace(); // use logger

}
}
if (response == null) {
// do error handling

}
return new ClientResponse(response, ClientError.NONE, ClientStatus.SUCCESS);
<小时/>

我个人更喜欢另一种解决方案。构建一个表达状态转换的组件并链接这些组件:

public class FallbackCall() {

private String hostname;

private String secondaryHostname;

private FallbackQuery next;

public ClientResponse call(boolean remote, boolean secondary) {
ClientResponse response = getResponse(hostname);
if (response == null && secondary) {
reponse = getResponse(secondaryHostname);

}
if (response == null && remote) {
reponse = next.call(remote, secondary);

}
return response;
}

private ClientResponse getResponse(String hostname) {
// your boiler plate
}

}

关于java - 如何有效地递归调用服务器,直到得到正确的响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21105347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com