优化
This commit is contained in:
+36
-2
@@ -13,15 +13,34 @@ import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.mockito.Mockito.*;
|
||||
|
||||
class NotificationSchedulerRecoveryTest {
|
||||
@Test void claimSqlAtomicallyIncrementsAttemptsAndEnforcesDueTimeAndLimit() throws Exception {
|
||||
Update scheduled = NotificationTaskMapper.class
|
||||
.getMethod("claimScheduled", Long.class, int.class, java.time.LocalDateTime.class)
|
||||
.getAnnotation(Update.class);
|
||||
String scheduledSql = String.join(" ", scheduled.value()).replaceAll("\\s+", " ").toUpperCase();
|
||||
assertThat(scheduledSql).contains("STATUS = 'DISPATCHING'", "ATTEMPT_COUNT = ATTEMPT_COUNT + 1",
|
||||
"STATUS = 'SCHEDULED'", "SCHEDULED_AT <= #{NOW}", "ATTEMPT_COUNT < #{MAXATTEMPTS}");
|
||||
|
||||
Update retrying = NotificationTaskMapper.class
|
||||
.getMethod("claimRetrying", Long.class, int.class, java.time.LocalDateTime.class,
|
||||
java.time.LocalDateTime.class)
|
||||
.getAnnotation(Update.class);
|
||||
String retryingSql = String.join(" ", retrying.value()).replaceAll("\\s+", " ").toUpperCase();
|
||||
assertThat(retryingSql).contains("STATUS = 'DISPATCHING'", "ATTEMPT_COUNT = ATTEMPT_COUNT + 1",
|
||||
"STATUS = 'RETRYING'", "UPDATED_AT <= #{DUEBEFORE}", "ATTEMPT_COUNT < #{MAXATTEMPTS}");
|
||||
}
|
||||
|
||||
@Test void recoverySqlRequiresTimeoutAndNoSuccessfulDeliveryEvidence() throws Exception {
|
||||
Update retry = NotificationTaskMapper.class
|
||||
.getMethod("retryTimedOutDispatchingWithoutDeliveryEvidence", java.time.LocalDateTime.class, java.time.LocalDateTime.class)
|
||||
.getMethod("retryTimedOutDispatchingWithoutDeliveryEvidence", java.time.LocalDateTime.class,
|
||||
java.time.LocalDateTime.class, int.class)
|
||||
.getAnnotation(Update.class);
|
||||
String retrySql = String.join(" ", retry.value()).replaceAll("\\s+", " ").toUpperCase();
|
||||
|
||||
assertThat(retrySql).contains("TASK.STATUS = 'DISPATCHING'", "TASK.UPDATED_AT <= #{STALEBEFORE}",
|
||||
"TASK.SENT_AT IS NULL", "RECIPIENT.STATUS = 'DELIVERED'", "IAM_NOTIFICATION_INBOX")
|
||||
.contains("SET TASK.STATUS = 'RETRYING'");
|
||||
.contains("SET TASK.STATUS = 'RETRYING'", "TASK.ATTEMPT_COUNT < #{MAXATTEMPTS}")
|
||||
.doesNotContain("ATTEMPT_COUNT = TASK.ATTEMPT_COUNT + 1");
|
||||
|
||||
Update dead = NotificationTaskMapper.class
|
||||
.getMethod("deadTimedOutDispatchingWithDeliveryEvidence", java.time.LocalDateTime.class, java.time.LocalDateTime.class)
|
||||
@@ -30,6 +49,21 @@ class NotificationSchedulerRecoveryTest {
|
||||
assertThat(deadSql).contains("SET TASK.STATUS = 'DEAD'", "TASK.STATUS = 'DISPATCHING'",
|
||||
"TASK.UPDATED_AT <= #{STALEBEFORE}", "RECIPIENT.STATUS = 'DELIVERED'", "IAM_NOTIFICATION_INBOX",
|
||||
"DISPATCH_TIMEOUT_WITH_DELIVERY_EVIDENCE");
|
||||
|
||||
Update attemptLimit = NotificationTaskMapper.class
|
||||
.getMethod("deadTimedOutDispatchingAtAttemptLimit", java.time.LocalDateTime.class,
|
||||
java.time.LocalDateTime.class, int.class)
|
||||
.getAnnotation(Update.class);
|
||||
String attemptLimitSql = String.join(" ", attemptLimit.value()).replaceAll("\\s+", " ").toUpperCase();
|
||||
assertThat(attemptLimitSql).contains("SET TASK.STATUS = 'DEAD'",
|
||||
"TASK.ATTEMPT_COUNT >= #{MAXATTEMPTS}", "DISPATCH_TIMEOUT_ATTEMPT_LIMIT");
|
||||
|
||||
Update failed = NotificationTaskMapper.class
|
||||
.getMethod("failDispatch", Long.class, int.class, String.class, java.time.LocalDateTime.class)
|
||||
.getAnnotation(Update.class);
|
||||
String failedSql = String.join(" ", failed.value()).replaceAll("\\s+", " ").toUpperCase();
|
||||
assertThat(failedSql).contains("STATUS = CASE WHEN ATTEMPT_COUNT >= #{MAXATTEMPTS} THEN 'DEAD' ELSE 'RETRYING' END",
|
||||
"LAST_ERROR = #{ERROR}", "STATUS = 'DISPATCHING'");
|
||||
}
|
||||
|
||||
@Test void schedulerRecoversBeforeClaimingScheduledAndRetryingTasks() {
|
||||
|
||||
Reference in New Issue
Block a user