Was ist der beste Weg, um ein einzelnes Objekt innerhalb eines festen Timeouts zwischenzuspeichern?

Lesezeit: 1 Minute

Google Guava verfügt über einen CacheBuilder, mit dem ConcurrentHash mit ablaufenden Schlüsseln erstellt werden kann, mit denen Einträge nach dem festgelegten Timeout entfernt werden können. Ich muss jedoch nur eine Instanz eines bestimmten Typs zwischenspeichern.

Was ist der beste Weg, um einzelne Objekte innerhalb eines festen Timeouts mit Google Guava zwischenzuspeichern?

Benutzer-Avatar
Etienne Neveu

Ich würde Guava verwenden Suppliers.memoizeWithExpiration (Lieferantendelegierter, lange Dauer, TimeUnit-Einheit)

public class JdkVersionService {

    @Inject
    private JdkVersionWebService jdkVersionWebService;

    // No need to check too often. Once a year will be good :) 
    private final Supplier<JdkVersion> latestJdkVersionCache
            = Suppliers.memoizeWithExpiration(jdkVersionSupplier(), 365, TimeUnit.DAYS);


    public JdkVersion getLatestJdkVersion() {
        return latestJdkVersionCache.get();
    }

    private Supplier<JdkVersion> jdkVersionSupplier() {
        return new Supplier<JdkVersion>() {
            public JdkVersion get() {
                return jdkVersionWebService.checkLatestJdkVersion();
            }
        };
    }
}

Update mit JDK 8

Heute würde ich diesen Code anders schreiben, indem ich JDK 8-Methodenreferenzen und Konstruktorinjektion für saubereren Code verwende:

import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import com.google.common.base.Suppliers;

@Service
public class JdkVersionService {

    private final Supplier<JdkVersion> latestJdkVersionCache;

    @Inject
    public JdkVersionService(JdkVersionWebService jdkVersionWebService) {
        this.latestJdkVersionCache = Suppliers.memoizeWithExpiration(
                jdkVersionWebService::checkLatestJdkVersion,
                365, TimeUnit.DAYS
        );
    }

    public JdkVersion getLatestJdkVersion() {
        return latestJdkVersionCache.get();
    }
}

  • Kennen Sie eine Lösung für den Fall, dass der Lieferant eine geprüfte Ausnahme auslöst?

    – Benutzer2417480

    23. September 2019 um 15:20 Uhr

  • @ user2417480 Ich würde diese Ausnahme wahrscheinlich in eine RuntimeException einschließen. Entpacken Sie es vielleicht später, wenn Sie wirklich eine geprüfte Ausnahme behalten möchten, aber es ist normalerweise ein Anti-Pattern, um eine geprüfte Ausnahme über mehrere Ebenen herumzutragen … Deshalb hat zB spring-jdbc eine Übersetzungsschicht, um geprüfte Ausnahmen in Laufzeit-DataAccessException umzuwandeln .

    – Etienne Neveu

    22. Januar 2020 um 22:56 Uhr

1145000cookie-checkWas ist der beste Weg, um ein einzelnes Objekt innerhalb eines festen Timeouts zwischenzuspeichern?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy