我有一个期货列表,每个期货完成后,我都会执行一个回调。
我正在使用Futures.successfulAsList检查是否所有期货都已完成。但是,这没有考虑回调的完成。
有没有办法可以确保回调完成?
除了回调,我可以使用Futures.transform包装到另一个Future中,并检查是否完成。但是,有了这个,我无法访问在包装好的将来抛出的运行时异常。
ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(20));
List<ListenableFuture<Object>> futures = new ArrayList<>();
for (int i = 1; i <= 20; i++) {
final int x = i * 100;
ListenableFuture<Object> future = service.submit(new Callable() {
@Override
public Object call() throws Exception {
Thread.sleep(10000 / x);
return x;
}
});
futures.add(future);
Futures.addCallback(future, new FutureCallback<Object>() {
@Override
public void onFailure(Throwable t) {
t.printStackTrace();
}
@Override
public void onSuccess(Object x) {
try {Thread.sleep((Integer) x * 10);} catch (Exception e) {}
System.out.println(x);
} …Run Code Online (Sandbox Code Playgroud) 我使用redis作为缓存,并希望使用redis中的数据到期,这些数据不会被主动使用.目前,对象的设置到期在经过了到期时间之后删除对象.但是,如果在对象到期之前至少读取一次,我想将该对象保留在redis中.
我看到的一种方法是为每个对象存储一个单独的expiry_key,并将expiry_key设置为expiry_key而不是原始对象.在expiry_key上订阅del通知,当收到del通知时,检查在到期间隔期间是否至少读取一次对象(通过单独维护的访问日志).如果未读取对象,请对原始对象执行del命令.如果已读取,则使用到期间隔重新创建expiry_key.
此实现需要额外的系统来管理到期,并且更愿意在本地使用redis.
有更好的解决方案来解决这个问题吗
每次读取时重置对象的到期时间会增加写入redis的次数,因此这不是一个选择.
请注意,redis缓存刷新是通过更改通知系统异步管理的.