- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前有两个标志。一个是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;
我有几个案例,我应该按照下面的描述来做 -
remoteFlag
和 secondaryFlag
均为 true
那么我我应该一一访问上述所有服务器,直到我们得到从服务器返回的响应。含义假设 hostname1
已关闭所以我们不会从该服务器得到任何响应,它会抛出异常,然后我们将去 hostname2
获取相同的数据,但假设如果 hostname2
也已关闭,那么我们将继续hostname3
来获取数据,但如果假设 hostname3
也是然后我们将去 hostname4
获取数据。但如果有任何一个服务器能够给出响应然后我们将返回通过做出适当的回应来表示我们已获得数据。如果没有服务器能够返回响应,那么我们将做出错误响应,表示所有服务器都已关闭。remoteFlag
为 true
并且 secondaryFlag
为 false
,那么我们只会访问 hostname1
和 hostname3
。如果主机名1
是下来,然后我们将去 hostname3
获取响应。如果两者都它们已关闭,然后我们将做出错误响应,指出服务器下降了。remoteFlag
为 false
并且 secondaryFlag
为 false
,那么我们只会访问 hostname1
,仅此而已。如果 hostname1
已关闭,然后我们将做出错误响应,表示服务器已关闭。remoteFlag
为 false
并且 secondaryFlag
为 true
,那么我们只会访问 hostname1
和 hostname2
,仅此而已。如果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/
我正在尝试检查 Entry 中是否存在重复项,并使用内联消息提醒用户该数字存在。 $(document).ready(function(){ $("#con1").blur(function(
我有一个基于类的 View 。我在引导模式上使用 Ajax。为了避免页面刷新,我想使用此类基于 View 返回 JSON 响应而不是 HTTP 响应,但我只看到了如何为基于函数的 View 返回 JS
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我有一个大型内部企业基于 Web 的应用程序在 IIS6 上运行 ASP.NET 3.5,生成 401 个“未经授权”响应,然后是 200 个“Ok”响应(如 Fiddler 所述)。我知道为什么会发
感谢您研究我的问题。 我有一个node/express服务器,配置了一个server.js文件,它调用urls.js,而urls.js又调用 Controller 来处理http请求,所有这些都配置相
当我使用以下命令时,我得到正确的 JSON 响应: $ curl --data "regno=&dob=&mobile=" https://vitacademics-rel.herokuapp.co
我有一个非常简单的 RESTful 服务,它通过 POST 接收一些表单数据,其目的是在云存储(Amazon S3、Azure Blob 存储等)中简单地保留文本主体(具有唯一 ID)作为一个文件..
UDP 不发送任何 ack,但它会发送任何响应吗? 我已经设置了客户端服务器UDP程序。如果我让客户端向不存在的服务器发送数据,那么客户端会收到任何响应吗? 我的假设是; 客户端 --> 广播服务器地
我有一个电梯项目,其中 有一个扩展 RestHelper 的类,看起来像这样 serve{ "api" / "mystuff" prefix { case a
我们正在寻求覆盖 Kong 错误响应结构并编写自定义消息(即用我们的自定义消息替换“超出 API 速率限制”、“无效的身份验证凭据”等)。 我们要找的错误响应结构(代码是自定义的内部错误代码,与HTT
我正在尝试监听 EKEventStoreChangedNotification 以检查当我的应用程序处于后台时日历是否已更改。 我在 View Controller 的 initWithNibMeth
我了解 javascript,并且正在学习 ASP.NET C# 我想要做什么(完成的是javascript): document.getElementById('divID-1'
是否可以过滤所有 har 对象并仅获取 POST 请求/响应?也许在初始化 BrowserMobProxyServer 期间是这样做的方法?我需要将 har 对象保存到文件中并上传到 har 查看器。
我正在尝试向 Oauth 的 API 发送响应。遗憾的是,Symfony2 文档在解释 $response->headers->set(...); 的所有不同部分方面做得很差。 这是我的 OauthC
我正在尝试测试用例来模拟 api 调用,并使用 python 响应来模拟 api 调用。 下面是我的模拟, with responses.RequestsMock() as rsps: url
在尝试在 Haskell 中进行一些领域驱动设计时,我发现自己遇到了这个问题: data FetchAccessories = FetchAccessories data AccessoriesRes
我正在与 ANT+ USB 棒连接,并用项目 react 器替换我自己天真的“MessageBus”,因为它看起来非常合适。 USB接口(interface)本质上是异步的(单独的输入/输出管道),我
我正在将项目迁移到AFNetworking 2.0。使用AFNetworking 1.0时,我编写了代码来记录控制台中的每个请求/响应。这是代码: -(AFHTTPRequestOperation *
我有以下代码段。 ajaxRequest.onreadystatechange = function(){ if(ajaxRequest.readyState == 4){
我有问题......我在 php 中有一个监听器脚本可以执行以下操作: if ($count != 1) {echo 'no';} else { echo "yes";} 因此它会回显"is"或“
我是一名优秀的程序员,十分优秀!