mirror of https://github.com/halo-dev/halo
feat: add retry operation for post and single page when publish and update (#2497)
#### What type of PR is this? /kind improvement /area core /milestone 2.0 #### What this PR does / why we need it: 发布和更新文章及自定义页面时如果遇到乐观锁错误自动重试 #### Which issue(s) this PR fixes: Fixes # #### Special notes for your reviewer: /cc @halo-dev/sig-halo #### Does this PR introduce a user-facing change? ```release-note None ```pull/2499/head
parent
3995adba32
commit
470696fff1
|
@ -3,6 +3,7 @@ package run.halo.app.content.impl;
|
||||||
import static run.halo.app.extension.router.selector.SelectorUtil.labelAndFieldSelectorToPredicate;
|
import static run.halo.app.extension.router.selector.SelectorUtil.labelAndFieldSelectorToPredicate;
|
||||||
|
|
||||||
import java.security.Principal;
|
import java.security.Principal;
|
||||||
|
import java.time.Duration;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
|
@ -11,12 +12,14 @@ import java.util.Objects;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.springframework.dao.OptimisticLockingFailureException;
|
||||||
import org.springframework.security.core.context.ReactiveSecurityContextHolder;
|
import org.springframework.security.core.context.ReactiveSecurityContextHolder;
|
||||||
import org.springframework.security.core.context.SecurityContext;
|
import org.springframework.security.core.context.SecurityContext;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
import reactor.core.publisher.Flux;
|
import reactor.core.publisher.Flux;
|
||||||
import reactor.core.publisher.Mono;
|
import reactor.core.publisher.Mono;
|
||||||
|
import reactor.util.retry.Retry;
|
||||||
import run.halo.app.content.ContentService;
|
import run.halo.app.content.ContentService;
|
||||||
import run.halo.app.content.Contributor;
|
import run.halo.app.content.Contributor;
|
||||||
import run.halo.app.content.ListedPost;
|
import run.halo.app.content.ListedPost;
|
||||||
|
@ -239,6 +242,8 @@ public class PostServiceImpl implements PostService {
|
||||||
post.getSpec().setHeadSnapshot(contentWrapper.snapshotName());
|
post.getSpec().setHeadSnapshot(contentWrapper.snapshotName());
|
||||||
return client.update(post);
|
return client.update(post);
|
||||||
})
|
})
|
||||||
|
.retryWhen(Retry.backoff(5, Duration.ofMillis(100))
|
||||||
|
.filter(throwable -> throwable instanceof OptimisticLockingFailureException))
|
||||||
.then(Mono.defer(() -> client.fetch(Post.class, post.getMetadata().getName())));
|
.then(Mono.defer(() -> client.fetch(Post.class, post.getMetadata().getName())));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -285,7 +290,9 @@ public class PostServiceImpl implements PostService {
|
||||||
return client.update(post);
|
return client.update(post);
|
||||||
})
|
})
|
||||||
.then(Mono.defer(() -> client.fetch(Post.class, postName)));
|
.then(Mono.defer(() -> client.fetch(Post.class, postName)));
|
||||||
});
|
})
|
||||||
|
.retryWhen(Retry.backoff(5, Duration.ofMillis(100))
|
||||||
|
.filter(throwable -> throwable instanceof OptimisticLockingFailureException));
|
||||||
}
|
}
|
||||||
|
|
||||||
void appendPublishedCondition(Post post, Post.PostPhase phase) {
|
void appendPublishedCondition(Post post, Post.PostPhase phase) {
|
||||||
|
|
|
@ -3,6 +3,7 @@ package run.halo.app.content.impl;
|
||||||
import static run.halo.app.extension.router.selector.SelectorUtil.labelAndFieldSelectorToPredicate;
|
import static run.halo.app.extension.router.selector.SelectorUtil.labelAndFieldSelectorToPredicate;
|
||||||
|
|
||||||
import java.security.Principal;
|
import java.security.Principal;
|
||||||
|
import java.time.Duration;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
|
@ -11,12 +12,14 @@ import java.util.Objects;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.springframework.dao.OptimisticLockingFailureException;
|
||||||
import org.springframework.security.core.context.ReactiveSecurityContextHolder;
|
import org.springframework.security.core.context.ReactiveSecurityContextHolder;
|
||||||
import org.springframework.security.core.context.SecurityContext;
|
import org.springframework.security.core.context.SecurityContext;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
import reactor.core.publisher.Flux;
|
import reactor.core.publisher.Flux;
|
||||||
import reactor.core.publisher.Mono;
|
import reactor.core.publisher.Mono;
|
||||||
|
import reactor.util.retry.Retry;
|
||||||
import run.halo.app.content.ContentService;
|
import run.halo.app.content.ContentService;
|
||||||
import run.halo.app.content.Contributor;
|
import run.halo.app.content.Contributor;
|
||||||
import run.halo.app.content.ListedSinglePage;
|
import run.halo.app.content.ListedSinglePage;
|
||||||
|
@ -101,6 +104,8 @@ public class SinglePageServiceImpl implements SinglePageService {
|
||||||
page.getSpec().setHeadSnapshot(contentWrapper.snapshotName());
|
page.getSpec().setHeadSnapshot(contentWrapper.snapshotName());
|
||||||
return client.update(page);
|
return client.update(page);
|
||||||
})
|
})
|
||||||
|
.retryWhen(Retry.backoff(5, Duration.ofMillis(100))
|
||||||
|
.filter(throwable -> throwable instanceof OptimisticLockingFailureException))
|
||||||
.then(Mono.defer(() -> client.fetch(SinglePage.class, page.getMetadata().getName())));
|
.then(Mono.defer(() -> client.fetch(SinglePage.class, page.getMetadata().getName())));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -130,7 +135,9 @@ public class SinglePageServiceImpl implements SinglePageService {
|
||||||
return client.update(page);
|
return client.update(page);
|
||||||
})
|
})
|
||||||
.then(Mono.defer(() -> client.fetch(SinglePage.class, name)));
|
.then(Mono.defer(() -> client.fetch(SinglePage.class, name)));
|
||||||
});
|
})
|
||||||
|
.retryWhen(Retry.backoff(5, Duration.ofMillis(100))
|
||||||
|
.filter(throwable -> throwable instanceof OptimisticLockingFailureException));
|
||||||
}
|
}
|
||||||
|
|
||||||
private Mono<String> getContextUsername() {
|
private Mono<String> getContextUsername() {
|
||||||
|
|
Loading…
Reference in New Issue