[英]How to implement a retry After logic?
我最近正在开发一个应用程序,并且有一个用例,其中我向客户端返回了一组响应,例如ALLOW,DENY和PENDING。
假设如果服务返回的响应为PENDING,我希望客户端在给定间隔后重试。 此间隔由服务器指定。
我想知道围绕这种用例对服务响应进行建模的最佳实践是什么。 我当时在想这样的回应:
字符串决策; long retryIntervalInMinutes;
但是对于ALLOW和DENY决定,retryIntervalInMinutes没有意义,因此不应返回。
一种建模的方式:
决策-抽象类允许扩展决策拒绝扩展决策待定扩展决策
仅待处理对象将包含retryIntervalInMinutes。
但这有其自身的问题,即客户端如何在不使用instanceof或类型转换等的情况下解密此类响应。
还是有其他更好的方法来对这种响应进行建模?
为什么在抽象的Decision
类中没有getRetryInterval()
方法,该方法默认情况下返回0并在Pending
具体类中覆盖它?
另外,您可以使用isEntryAllowed()
方法,该方法仅在Allow
类中返回true
。
您的客户可以仅使用这两种方法来发现答案的含义,而不必为isntanceof
。
简单的枚举会更好,因为响应是不可变的单例:
public enum Response {
ALLOW, DENY, RETRY;
public boolean isEntryAllowed() {
return this == ALLOW;
}
public boolean isRetryAllowed() {
return this == RETRY;
}
public int getRetryInterval() {
return this == RETRY ? 42 : -1;
}
}
客户端获得一些Response
实例,并可以使用其方法来找出响应的含义:
Response respone = sendRequestToServer();
if (response.isEntryAllowed()) {
// cool! let's move on!
} else if (response.isRetryAllowed()) {
retryAfter(response.getRetryInterval());
} else {
// too bad, need to find another server or sth
}
零也是一个数字。 如果您的类具有retry-delay属性(即应等待的持续时间),则在不应该延迟的情况下,可以将该属性设置为零。
对于将延迟传递给客户端的Web服务,合适的媒介是名为Retry-After的标准HTTP标头。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.