假设我Closeable使用请求范围通过Guice注入了一个对象:
@Provides @RequestScoped
public MyCloseableResource providesMyCloseableResource(){
return new MyCloseableResourceImpl();
}
Run Code Online (Sandbox Code Playgroud)
是否有可能连接一个清理方法,该方法close()在范围存在时自动调用我的资源,而不需要求助于自定义范围实现?
查看Guice wiki上的自定义范围实现指南,它显示应该创建和清理范围,如下所示:
/**
* Runs {@code runnable} in batch scope.
*/
public void scopeRunnable(Runnable runnable) {
scope.enter();
try {
// explicitly seed some seed objects...
scope.seed(Key.get(SomeObject.class), someObject);
// create and access scoped objects
runnable.run();
} finally {
scope.exit();
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有办法finally在内置范围(特别是会话和请求范围)中连接一些自定义清理代码.
如果不可能,可能会出现阻碍这种自动清理的问题吗?
我已经找到了在servlet容器中实现相同效果的方法,通过实现Filter来为每个请求创建和清理资源,这很有效,但我很好奇它是否可能与纯Guice一起使用.
我正在尝试创建一个Zip任务,该任务将为我的项目创建一个包含项目jar文件和war(以及可能由该assemble任务生成的其他构建工件)的分发包.
所以我尝试编写这个简单的脚本
task dist(dependsOn: 'assemble', type: Zip){
into('lib'){
from 'build/libs' //contains jar and war files
}
... //other stuff
}
Run Code Online (Sandbox Code Playgroud)
任务dist取决于assemble因为它方便地包含创建jar和war文件的任务.
但是如果我尝试执行它,gradle会抱怨此错误消息:
Circular dependency between tasks. Cycle includes [task ':assemble', task ':dist'].
Run Code Online (Sandbox Code Playgroud)
我已经检查了任务的规范assemble,并且清楚地写出了assemble任务自动dependsOn执行项目中的所有存档任务,这显然包括我的dist任务.似乎没有办法绕过它.
在gradle中这样做的正确方法是什么?如何制作依赖于assemble任务的zip 任务?我可以dist明确地依赖任务jar和war任务,但我认为这有点违反了封装.
我正在使用gradle-1.0-milestone-3.
提前致谢!
是否可以在一台计算机上使用HDFS客户端从HDSF集群实现分布式读取?
我用一个由3个数据节点(DN1,DN2,DN3)组成的集群进行了实验.然后我从位于DN1的客户端程序中的10个独立文件中同时读取10个,并且它似乎只是从DN1读取数据.其他数据节点(DN2,DN3)显示零活动(从调试日志判断).
我已检查所有文件的块是否在所有3个数据节点上复制,因此如果我关闭DN1,则从DN2读取数据(仅限DN2).
增加读取的数据量没有帮助(尝试从2GB到30GB).
由于我需要读取多个大文件并从中提取少量数据(少量Kb),我想避免使用map/reduce,因为它需要设置更多服务并且还需要编写每个分割的输出任务回到HDFS.相反,将结果从数据节点直接返回到我的客户端程序会很好.
我用SequenceFile这种方式读取/写入数据(jdk7):
//Run in thread pool on multiple files simultaneously
List<String> result = new ArrayList<>();
LongWritable key = new LongWritable();
Text value = new Text();
try(SequenceFile.Reader reader = new SequenceFile.Reader(conf,
SequenceFile.Reader.file(filePath)){
reader.next(key);
if(key.get() == ID_I_AM_LOOKING_FOR){
reader.getCurrentValue(value);
result.add(value.toString());
}
}
return result; //results from multiple workers are merged later
Run Code Online (Sandbox Code Playgroud)
任何帮助赞赏.谢谢!
我想实现同一种依赖树/链的几个版本,它们对该树/链中的某些接口使用不同的实现.在这种情况下使用的最佳Guice练习/模式是什么?
这是我的问题的具体例子.
我有一个Writer可能是文件编写器或std-out编写器的接口,它将位于我的依赖层次结构的叶子中.像这样的东西:
interface Writer { ... }
class FileWriter implements Writer { ... }
class StdOutWriter implements Writer { ... }
Run Code Online (Sandbox Code Playgroud)
另一个记录器接口用于在writer上添加一个间接层.例如:
interface Logger { ... }
class LoggerImpl{
@Inject
public Logger(Writer out){ ... }
public void log(String message){ out.println(message); }
}
Run Code Online (Sandbox Code Playgroud)
然后有一个使用记录器的客户端.
class Client{
@Inject
public Client(Logger logger){ ... }
public void do(){ logger.log("my message"); }
}
Run Code Online (Sandbox Code Playgroud)
现在,我想在我的程序中使用两种类型的层次结构:
有没有一种很好的方法来连接它而不使用单独的Guice模块1和2?
理想情况下,我希望有这样一个ClientFactory类: …
我有一个任务,从这些来源(比如项目a)生成java源和一组jar .我想将这些罐子导出到依赖项目(比如项目b).所以这里大致是我现在所拥有的:
//a.gradle
configurations{
generatedJars
}
task generateJars(type: JavaExec) {
//generate jars ...
outputs.files += //append generated jars here
}
dependencies{
generatedJars generateJars.outputs.files
}
//b.gradle
dependencies{
project(path: ':a', configuration: 'generatedJars')
}
Run Code Online (Sandbox Code Playgroud)
它工作正常,除了generateJars.outputs.files作为依赖项添加并不告诉gradle generateJars当没有生成jar时它必须运行任务.我已经尝试将任务本身添加为依赖项,希望它的工作方式与将jar/zip任务添加到工件配置时的工作方式相同(例如artifacts{ myJarTask }),但它会抛出错误告诉我我不能这样做.当然,我可以generateJars在:b开始评估之前在构建过程中的某个地方注入任务,但这是笨拙和脆弱的,所以我想避免它.
我觉得我应该将生成的jar添加到artifacts{ ... }项目中,但我不确定如何使它们对依赖项目可见.有没有更好的方法来实现这一目标?
依赖项目(项目b)需要设置IntelliJ IDEA模块类路径以指向项目a生成的jar.像这样的东西(伪代码):
//b.gradle
idea{
module{
scopes.COMPILE.plus += project(path: ':a', configuration: 'generatedJars').files
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经尝试简单地增加一个项目dependecy :a的generatedJars的:b,但理念插件只是增加了模块:a作为一个模块依赖,假定它出口其产生的瓶(这可能是一个正确的假设),因此不能将所产生的罐子:b …