【问题标题】:How to implement a retry After logic?如何实现重试后逻辑?
【发布时间】:2013-10-02 06:23:24
【问题描述】:

我最近正在开发一个应用程序,并且有一个用例,我将一组响应返回给客户,例如允许、拒绝和挂起。

假设服务返回的响应是 PENDING,我希望客户端在给定时间间隔后重试。这个时间间隔由服务器给定。

我想知道针对此类用例对我的服务响应建模的最佳做法是什么。我想有这样的回应:

字符串判定; long retryIntervalInMinutes;

但是对于决定 ALLOW 和 DENY,retryIntervalInMinutes 没有意义,不应返回。

一种建模方法:

决策 - 抽象类 允许扩展决定 拒绝延长决定 未决扩展决定

只有 Pending 对象会包含 retryIntervalInMinutes。

但这有其自身的问题,例如客户端如何在不使用 instanceof 或类型转换等的情况下破译此类响应。

或者有没有其他更好的方法来模拟这种响应?

【问题讨论】:

    标签: java web-services design-patterns code-maintainability


    【解决方案1】:

    为什么在你的抽象 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
    }
    

    【讨论】:

      【解决方案2】:

      零也是一个数字。如果你的类有一个 retry-delay 属性,这是应该等待的持续时间,你可以在不应该有延迟的情况下将该属性设置为零。

      对于向客户端传达延迟的 Web 服务,名为 Retry-After 的标准 HTTP 标头是合适的媒介。

      【讨论】:

        猜你喜欢
        • 2022-09-25
        • 1970-01-01
        • 2012-10-20
        • 2020-11-09
        • 1970-01-01
        • 2014-06-16
        • 2021-11-14
        • 1970-01-01
        • 2013-08-26
        相关资源
        最近更新 更多