繁体   English   中英

如何实现重试After逻辑?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM