如何实现重试后的逻辑?

时间:2013-10-02 06:23:24

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

我最近在处理一个应用程序并且有一个用例,我将一组响应返回给客户,例如允许,拒绝和待定。

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

我想了解围绕此类用例建模服务响应的最佳做法。我想要得到这样的回答:

字符串决策; long retryIntervalInMinutes;

但是为了决定ALLOW和DENY,retryIntervalInMinutes没有意义,不应该返回。

建模的一种方法:

决定 - 抽象课 允许扩展决策 拒绝延伸决定 待定延伸决定

只有Pending对象才会包含retryIntervalInMinutes。

但是这有其自身的问题,因为客户端将如何解释这样的响应而不使用instanceof或类型转换等。

或者还有其他更好的方法来模拟这样的反应吗?

2 个答案:

答案 0 :(得分:0)

为什么不在默认情况下返回0的抽象getRetryInterval()类中使用Decision方法并在Pending具体类中覆盖它?

此外,您可以使用仅在isEntryAllowed()课程中返回true的方法Allow

您的客户可以使用这两种方法来发现答案的含义,而不是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
}

答案 1 :(得分:0)

零也是一个数字。如果您的类具有retry-delay属性(即应该等待的持续时间),那么在没有延迟的情况下,您可以将该属性设置为零。

对于将延迟传达给客户端的Web服务,名为Retry-After的标准HTTP头是适当的介质。