Я пишу плагин Java - Jira с конечными точками отдыха на Джерси. Приложение является многоуровневым, а остальные ресурсы общаются со службами, которые общаются со сборщиками, фабриками и хранилищами для обработки каждого запроса.
Из-за структуры моего приложения во время одного веб-запроса одна и та же сущность может создаваться несколько раз.
Мой текущий подход заключается в использовании JiraAuthenticationContextImpl.getRequestCache
, который внутренне использует ThreadLocal<Map<String, Object>>
. Этот подход кажется рискованным, если потоки должны были повторно использоваться между запросами.
Как я могу реализовать потокобезопасность для каждого кэша веб-запросов в плагине Jira?
Пример того, что я сейчас пытаюсь
public class WorklogIssueManagerCache implements WorklogIssueManager {
private static final String CACHE_KEY = WorklogIssueManagerCache.class.getName() + ".worklogissues";
private WorklogIssueManager delegate;
public WorklogIssueManagerCache(WorklogIssueManager delegate) {
this.delegate = delegate;
}
@Override
public Issue getIssue(Long issueId) {
IssueCache cache = JiraAuthenticationContextImpl
.getRequestCache(CACHE_KEY, () -> new IssueCache());
Optional<Issue> issue = cache.getById(issueId);
if (issue == null) {
issue = Optional.ofNullable(this.delegate.getIssue(issueId));
cache.put(issueId, issue);
}
return issue.orElse(null);
}
private static class IssueCache {
private final HashMap<Long, Optional<Issue>> byId;
private IssueCache() {
this.byId = new HashMap();
}
public Optional<Issue> getById(Long id) {
return this.byId.get(id);
}
public void put(Long id, Optional<Issue> issue) {
this.byId.put(id, issue);
}
}
}