Реализация кэширования каждого веб-запроса в плагине JIRA - PullRequest
0 голосов
/ 06 сентября 2018

Я пишу плагин 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);
        }
    }
}
...