package systems.composable.dropwizard.cassandra.loadbalancing; import com.datastax.driver.core.policies.ErrorAwarePolicy; import com.datastax.driver.core.policies.LoadBalancingPolicy; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeName; import io.dropwizard.util.Duration; import javax.validation.Valid; import javax.validation.constraints.NotNull; /** * A factory for configuring and building {@link ErrorAwarePolicy} instances. * <p/> * <b>Configuration Parameters:</b> * <table> * <tr> * <td>Name</td> * <td>Default</td> * <td>Description</td> * </tr> * <tr> * <td>subPolicy</td> * <td>No default. You must provide a child policy.</td> * <td>The load balancing policy to wrap with error awareness.</td> * </tr> * <tr> * <td>maxErrorsPerMinute</td> * <td>Inherits the default from {@link ErrorAwarePolicy.Builder}</td> * <td>The maximum number of errors allowed per minute for each host.</td> * </tr> * <tr> * <td>retryPeriod</td> * <td>Inherits the default from {@link ErrorAwarePolicy.Builder}</td> * <td>The time during which a host is excluded by the policy once it has exceeded {@link #maxErrorsPerMinute}</td> * </tr> * </table> */ @JsonTypeName("errorAware") public class ErrorAwarePolicyFactory implements LoadBalancingPolicyFactory { @Valid @NotNull private LoadBalancingPolicyFactory subPolicy; private Integer maxErrorsPerMinute; private Duration retryPeriod; @JsonProperty public LoadBalancingPolicyFactory getSubPolicy() { return subPolicy; } @JsonProperty public void setSubPolicy(LoadBalancingPolicyFactory subPolicy) { this.subPolicy = subPolicy; } @JsonProperty public Integer getMaxErrorsPerMinute() { return maxErrorsPerMinute; } @JsonProperty public void setMaxErrorsPerMinute(Integer maxErrorsPerMinute) { this.maxErrorsPerMinute = maxErrorsPerMinute; } @JsonProperty public Duration getRetryPeriod() { return retryPeriod; } @JsonProperty public void setRetryPeriod(Duration retryPeriod) { this.retryPeriod = retryPeriod; } @Override public LoadBalancingPolicy build() { ErrorAwarePolicy.Builder builder = ErrorAwarePolicy.builder(subPolicy.build()); if (maxErrorsPerMinute != null) { builder.withMaxErrorsPerMinute(maxErrorsPerMinute); } if (retryPeriod != null) { builder.withRetryPeriod(retryPeriod.getQuantity(), retryPeriod.getUnit()); } return builder.build(); } }