У меня есть Guava Cache
(вернее, я перехожу от MapMaker
до Cache
), а значения представляют собой длительные задания. Я хотел бы добавить поведение expireAfterAccess
к кешу, так как это лучший способ его очистки; однако работа может быть запущена, хотя через некоторое время кэш не был доступен через кеш, и в этом случае мне нужно предотвратить его удаление из кеша. У меня три вопроса:
-
Можно ли повторно вставить запись кэша, которая удаляется во время обратного вызова
RemovalListener
? -
Если это так, является ли он потокобезопасным, так что нет возможного способа, чтобы
CacheLoader
мог произвести второе значение для этого ключа, а обратный вызовRemovalListener
все еще происходит в другом потоке? -
Есть ли лучший способ добиться того, чего я хочу? Это не строго/только "кеш" - это важно, что для каждого ключа используется одно и только одно значение, но я также хочу кэшировать запись в течение некоторого времени после завершения заданий, которые она представляет. Раньше я использовал
MapMaker
, и поведенческие требования, которые мне нужны, теперь устарели в этом классе. Регулярно пинговать карту во время выполнения заданий является неэлегантным, а в моем случае - неосуществимым. Возможно, правильное решение состоит в том, чтобы иметь две карты, одну без выселения и одну, и переносить их по мере их завершения.
Я тоже сделаю запрос функции - это решит проблему: разрешите блокировку отдельных записей, чтобы предотвратить выселение (а затем разблокировать).
[Изменить, чтобы добавить некоторые детали]: Ключи на этой карте относятся к файлам данных. Значения представляют собой либо выполняемое задание записи, либо завершенное задание записи, либо - если не выполняется задание - объект, предназначенный только для чтения, созданный на поиск, с информацией, считанной из файла. Важно, что для каждого файла есть ровно нуль или одна запись. Я мог бы использовать отдельные карты для двух вещей, но нужно было бы координировать работу по принципу "ключ", чтобы убедиться, что только один или другой существует одновременно. Использование одной карты делает ее более простой, с точки зрения правильного выбора concurrency.