[英]Datastax Java Driver Custom Retry Policy
我編寫了一個自定義重試策略類,我可以在其中傳遞沒有重試驅動程序將執行 onWriteTimeout/onUnavilable/onReadTimeout。
public class CustomRetryPolicy implements RetryPolicy {
private static final Logger LOG = LoggerFactory.getLogger(CustomRetryPolicy.class);
@VisibleForTesting
public static final String RETRYING_ON_READ_TIMEOUT =
"[{}] Retrying on read timeout on same host (consistency: {}, required responses: {}, "
+ "received responses: {}, data retrieved: {}, retries: {})";
@VisibleForTesting
public static final String RETRYING_ON_WRITE_TIMEOUT =
"[{}] Retrying on write timeout on same host (consistency: {}, write type: {}, "
+ "required acknowledgments: {}, received acknowledgments: {}, retries: {})";
@VisibleForTesting
public static final String RETRYING_ON_UNAVAILABLE =
"[{}] Retrying on unavailable exception on next host (consistency: {}, "
+ "required replica: {}, alive replica: {}, retries: {})";
@VisibleForTesting
public static final String RETRYING_ON_ABORTED =
"[{}] Retrying on aborted request on next host (retries: {})";
@VisibleForTesting
public static final String RETRYING_ON_ERROR =
"[{}] Retrying on node error on next host (retries: {})";
private static final String LOG_PREFIX = "DATASTORE-CASSANDRA";
private final int readAttempts;
private final int writeAttempts;
private final int unavailableAttempts;
public CustomRetryPolicy(int readAttempts, int writeAttempts, int unavailableAttempts) {
this.readAttempts = readAttempts;
this.writeAttempts = writeAttempts;
this.unavailableAttempts = unavailableAttempts;
}
@Override
public RetryDecision onReadTimeout(Request request, ConsistencyLevel cl, int blockFor,
int received, boolean dataPresent, int retryCount) {
RetryDecision decision = (retryCount < readAttempts && received >= blockFor && !dataPresent)
? RetryDecision.RETRY_SAME
: RetryDecision.RETHROW;
if (decision == RetryDecision.RETRY_SAME && LOG.isTraceEnabled()) {
LOG.trace(RETRYING_ON_READ_TIMEOUT, LOG_PREFIX, cl, blockFor, received, false, retryCount);
}
return decision;
}
@Override
public RetryDecision onWriteTimeout(Request request, ConsistencyLevel cl, WriteType writeType,
int blockFor, int received, int retryCount) {
RetryDecision decision = (retryCount < writeAttempts && writeType == DefaultWriteType.BATCH_LOG)
? RetryDecision.RETRY_SAME
: RetryDecision.RETHROW;
if (decision == RetryDecision.RETRY_SAME && LOG.isTraceEnabled()) {
LOG.trace(RETRYING_ON_WRITE_TIMEOUT, LOG_PREFIX, cl, writeType, blockFor, received,
retryCount);
}
return decision;
}
@Override
public RetryDecision onUnavailable(Request request, ConsistencyLevel cl, int required, int alive,
int retryCount) {
RetryDecision decision =
(retryCount < unavailableAttempts) ? RetryDecision.RETRY_NEXT : RetryDecision.RETHROW;
if (decision == RetryDecision.RETRY_NEXT && LOG.isTraceEnabled()) {
LOG.trace(RETRYING_ON_UNAVAILABLE, LOG_PREFIX, cl, required, alive, retryCount);
}
return decision;
}
@Override
public RetryDecision onRequestAborted(Request request, Throwable error, int retryCount) {
RetryDecision decision =
(error instanceof ClosedConnectionException || error instanceof HeartbeatException)
? RetryDecision.RETRY_NEXT
: RetryDecision.RETHROW;
if (decision == RetryDecision.RETRY_NEXT && LOG.isTraceEnabled()) {
LOG.trace(RETRYING_ON_ABORTED, LOG_PREFIX, retryCount, error);
}
return decision;
}
@Override
public RetryDecision onErrorResponse(Request request, CoordinatorException error,
int retryCount) {
RetryDecision decision =
(error instanceof ReadFailureException || error instanceof WriteFailureException)
? RetryDecision.RETHROW
: RetryDecision.RETRY_NEXT;
if (decision == RetryDecision.RETRY_NEXT && LOG.isTraceEnabled()) {
LOG.trace(RETRYING_ON_ERROR, LOG_PREFIX, retryCount, error);
}
return decision;
}
@Override
public void close() {
// Nothing to do
}
}
我正在使用 datastax java 驅動程序 4.6.0。 但問題是我不能用 CQLSessionBuilder 傳遞這個類的對象,這可以通過像
RetryPolicy rc = new CustomRetryPolicy(3, 3, 2);
Cluster cluster = Cluster.builder().addContactPoint("192.168.0.0").withRetryPolicy(rc).build();
在舊版本的驅動程序中。 我已經嘗試過 DriverConfigLoader,但只有選項可以傳遞自定義類名。
你能建議嗎。
如果您查看DefaultRetryPolicy 的實現和CustomRetryPolicy 的示例,您將看到兩者都接收 2 個參數: DriverContext
類型的context
和帶有配置文件名稱的字符串。 然后您應該能夠使用context
通過getConfig
調用獲取DriverConfig
,然后在 config 上使用getProfile
來提取自定義策略所需的配置值 - 您可以將自己的配置值放入配置文件並在重試中使用它政策,是這樣的:
datastax-java-driver {
advanced.retry-policy {
class = DefaultRetryPolicy
}
profiles {
custom-retries {
advanced.retry-policy {
class = CustomRetryPolicy
custom-policy {
read-attempts = 3
write-attempts = 2
...
}
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.