小编vin*_*ths的帖子

番石榴期货等待回调

我有一个期货列表,每个期货完成后,我都会执行一个回调。

我正在使用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)

java future guava

5
推荐指数
2
解决办法
1万
查看次数

Redis作为缓存 - 重置到期

我使用redis作为缓存,并希望使用redis中的数据到期,这些数据不会被主动使用.目前,对象的设置到期在经过了到期时间之后删除对象.但是,如果在对象到期之前至少读取一次,我想将该对象保留在redis中.

我看到的一种方法是为每个对象存储一个单独的expiry_key,并将expiry_key设置为expiry_key而不是原始对象.在expiry_key上订阅del通知,当收到del通知时,检查在到期间隔期间是否至少读取一次对象(通过单独维护的访问日志).如果未读取对象,请对原始对象执行del命令.如果已读取,则使用到期间隔重新创建expiry_key.

此实现需要额外的系统来管理到期,并且更愿意在本地使用redis.

有更好的解决方案来解决这个问题吗

每次读取时重置对象的到期时间会增加写入redis的次数,因此这不是一个选择.

请注意,redis缓存刷新是通过更改通知系统异步管理的.

caching redis

1
推荐指数
2
解决办法
9340
查看次数

标签 统计

caching ×1

future ×1

guava ×1

java ×1

redis ×1