我们的应用程序有许多实现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.transform
Executor
Executor
Executor
所以,现在我一直以这种方式实现服务的方法:
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)
首先,这有效吗?从番石榴来源来看,似乎确实如此,但我很高兴得到某种确认,并且我在考虑对此进行单元测试时遇到了一些困难。
此外,我有点担心整个“服务在指定线程上回调(默认情况下)”模式的有用性/成本比。有人有这样的经验吗?这种方法是否存在任何隐藏的陷阱?
我想用sbt生成的ScalaDoc链接到外部库,在sbt 0.13中我们autoAPIMappings
应该为声明它们的库添加这些链接apiURL
.但实际上,我使用的库中都没有提供它们的pom/ivy元数据,我怀疑其中一些库永远不会这样做.
该apiMappings
设置应该只是帮助,但它被键入Map[File, URL]
,因此适合为非托管依赖项设置doc urls.托管依赖项被声明为实例,sbt.ModuleID
不能直接插入该映射中.
我可以以某种方式apiMappings
使用将URL与托管依赖关联的东西填充设置吗?
一个相关的问题是:sbt是否提供了File
从a 获得a的惯用方法ModuleID
?我想我可以尝试评估一些类路径并返回File
s尝试将它们映射到ModuleID
s但我希望有更简单的东西.
注意:这与/sf/ask/1312308581/有关,但该问题的不同之处在于链接到标准库的scaladoc,有一个众所周知的File
scalaInstance.value.libraryJar
,在这种情况下不是这种情况.