Ver código fonte

Add Refreshable, easier way to use AutoRefreshingReference

tags/2.0.1
Jonathan Cobb 5 anos atrás
pai
commit
bd725eb29d
3 arquivos alterados com 77 adições e 0 exclusões
  1. +4
    -0
      src/main/java/org/cobbzilla/util/cache/AutoRefreshingReference.java
  2. +28
    -0
      src/main/java/org/cobbzilla/util/cache/BackgroundRefreshable.java
  3. +45
    -0
      src/main/java/org/cobbzilla/util/cache/Refreshable.java

+ 4
- 0
src/main/java/org/cobbzilla/util/cache/AutoRefreshingReference.java Ver arquivo

@@ -7,6 +7,10 @@ import java.util.concurrent.atomic.AtomicReference;

import static org.cobbzilla.util.daemon.ZillaRuntime.now;

// Wraps an AtomicReference and presents a similar 'get' method, but will refresh the underlying
// object via the 'refresh' method if it is null or stale.
//
// Consider using Refreshable, a subclass with a more functional approach
public abstract class AutoRefreshingReference<T> {

@Getter private final AtomicReference<T> object = new AtomicReference<>();


+ 28
- 0
src/main/java/org/cobbzilla/util/cache/BackgroundRefreshable.java Ver arquivo

@@ -0,0 +1,28 @@
package org.cobbzilla.util.cache;

import lombok.Getter;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.Callable;
import java.util.function.Function;

@Slf4j
public class BackgroundRefreshable<T> extends BackgroundRefreshingReference<T> {

@Getter private final String name;
@Getter private final long timeout;
@Getter private final Callable<T> refresher;
@Getter private final Function<Exception, T> errorRefreshing;

public BackgroundRefreshable(String name, long timeout, Callable<T> refresher) { this(name, timeout, refresher, e -> null); }

public BackgroundRefreshable(String name, long timeout, Callable<T> refresher, Function<Exception, T> errorRefreshing) {
this.name = name;
this.timeout = timeout;
this.refresher = refresher;
this.errorRefreshing = errorRefreshing;
}

@Override public T refresh() { return Refreshable.refresh(name, refresher, errorRefreshing); }

}

+ 45
- 0
src/main/java/org/cobbzilla/util/cache/Refreshable.java Ver arquivo

@@ -0,0 +1,45 @@
package org.cobbzilla.util.cache;

import lombok.Getter;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.Callable;
import java.util.function.Function;

import static org.cobbzilla.util.daemon.ZillaRuntime.die;
import static org.cobbzilla.util.daemon.ZillaRuntime.shortError;

@Slf4j
public class Refreshable<T> extends AutoRefreshingReference<T> {

@Getter private final String name;
@Getter private final long timeout;
@Getter private final Callable<T> refresher;
@Getter private final Function<Exception, T> errorRefreshing;

public Refreshable(String name, long timeout, Callable<T> refresher) { this(name, timeout, refresher, e -> null); }

public Refreshable(String name, long timeout, Callable<T> refresher, Function<Exception, T> errorRefreshing) {
this.name = name;
this.timeout = timeout;
this.refresher = refresher;
this.errorRefreshing = errorRefreshing;
}

@Override public T refresh() { return refresh(name, refresher, errorRefreshing); }

public static <T> T refresh(String name, Callable<T> refresher, Function<Exception,T> errorRefreshing) {
try {
return refresher.call();
} catch (Exception e) {
final String msg = "refresh(" + name + "): " + shortError(e);
log.error(msg);
try {
return errorRefreshing.apply(e);
} catch (Exception ex) {
return die("refresh("+name+") failed with: "+shortError(e)+", and then errorRefreshing failed with "+shortError(ex));
}
}
}

}

Carregando…
Cancelar
Salvar