小编Tho*_*our的帖子

Guava :为 ListenableFuture 回调和侦听器设置默认执行器

我们的应用程序有许多实现ListenableFuture基于 API 的服务,包括:

public interface MyService {
    ListenableFuture<Thing> getMyThing();
    ListenableFuture<?> putMyThing(Thing thing);
}
Run Code Online (Sandbox Code Playgroud)

由于我们的域模型根本不是线程安全的,因此除了上述服务之外,我们的大部分代码都在众所周知的单线程上运行Executor。我认为如果服务能够保证添加到Future它们生成的 s 中的任何侦听器都将被调用,那就太好了Executor

当然,我可以通过调用 或使用适当的参数在服务的客户端中很好地强制执行此操作,ListenableFuture.addListener但我的目标正是降低客户端代码中Futures.addCallback的复杂性和错误的可能性,所以我想要侦听器当调用这些方法而不传递参数时,会发生众所周知的调用。Futures.transformExecutorExecutorExecutor

所以,现在我一直以这种方式实现服务的方法:

class MyServiceImpl {
    private Executor executor; /* the "main" executor */

    public ListenableFuture<Thing> getMyThing() {
        ListenableFuture<Thing> future = ...; /* actual service call */

        return Futures.transform(future, Functions.<Thing>identity(), executor );
    }
}
Run Code Online (Sandbox Code Playgroud)

首先,这有效吗?从番石榴来源来看,似乎确实如此,但我很高兴得到某种确认,并且我在考虑对此进行单元测试时遇到了一些困难。

此外,我有点担心整个“服务在指定线程上回调(默认情况下)”模式的有用性/成本比。有人有这样的经验吗?这种方法是否存在任何隐藏的陷阱?

java future guava

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

我可以使用sbt的`apiMappings`设置来管理依赖项吗?

我想用sbt生成的ScalaDoc链接到外部库,在sbt 0.13中我们autoAPIMappings应该为声明它们的库添加这些链接apiURL.但实际上,我使用的库中都没有提供它们的pom/ivy元数据,我怀疑其中一些库永远不会这样做.

apiMappings设置应该只是帮助,但它被键入Map[File, URL],因此适合为非托管依赖项设置doc urls.托管依赖项被声明为实例,sbt.ModuleID不能直接插入该映射中.

我可以以某种方式apiMappings使用将URL与托管依赖关联的东西填充设置吗?

一个相关的问题是:sbt是否提供了File从a 获得a的惯用方法ModuleID?我想我可以尝试评估一些类路径并返回Files尝试将它们映射到ModuleIDs但我希望有更简单的东西.

注意:这与/sf/ask/1312308581/有关,但该问题的不同之处在于链接到标准库的scaladoc,有一个众所周知的File scalaInstance.value.libraryJar,在这种情况下不是这种情况.

sbt scaladoc

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

标签 统计

future ×1

guava ×1

java ×1

sbt ×1

scaladoc ×1