在我的应用程序中,我有类扩展wicket模型并覆盖最终方法(只删除异步生成的文件)。问题是在第一次加载wicket页面之后立即调用finalized方法,然后再次加载
public class TournamentFileReadOnlyModel<I> extends AbstractReadOnlyModel<File> {
private static final long serialVersionUID = 1L;
private CallableService callableService;
private String uuid;
public TournamentFileReadOnlyModel(CallableService callableService, I input,
Class<? extends AbstractPdfCallable<I>> callableClass) {
this.uuid = UUID.randomUUID().toString();
this.callableService = callableService;
callableService.createFile(uuid, WicketApplication.getFilesPath(), input, callableClass);
}
@Override
public File getObject() {
return callableService.getFile(uuid);
}
@Override
protected void finalize() throws Throwable {
super.finalize();
callableService.finalizeFile(uuid);
}
}
我创建了这个模型的链接:
private void addPrintGroupButton() {
add(new DownloadModelLink("printGroup", new TournamentFileReadOnlyModel<GroupPageDto>(callableService,
groupPageDto, GroupPdfCallable.class)));
}
日志:
我没有理由为我打电话,因为我只是加载网页而且还有模型参考
17:50:45.493 [Finalizer] INFO org.tahom.processor.service.callable.CallableService - 使用uuid从缓存清理文件:61286bf6-da4c-4905-b65d-d6061eb1466f
时间对我而言是好的,因为我加载了另一个网页并且已经丢失了此模型的参考资料
17:51:10.913 [Finalizer] INFO org.tahom.processor.service.callable.CallableService - 使用uuid从缓存清除文件时出错:61286bf6-da4c-4905-b65d-d6061eb1466f 显示java.lang.NullPointerException at org.tahom.processor.service.callable.CallableService.finalizeFile(CallableService.java:65)[tahom-processor-0.2.0-SNAPSHOT.jar:?] 在WICKET_org.tahom.processor.service.callable.CallableService $$ FastClassByCGLIB $$ 82eb5c9b.invoke()[cglib-3.1.jar:?] 在net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)[cglib-3.1.jar:?] 在org.apache.wicket.proxy.LazyInitProxyFactory $ AbstractCGLibInterceptor.intercept(LazyInitProxyFactory.java:350)[wicket-ioc-7.1.0.jar:7.1.0] 在WICKET_org.tahom.processor.service.callable.CallableService $$ EnhancerByCGLIB $$ 41212df1.finalizeFile()[cglib-3.1.jar:?] 在org.tahom.web.model.TournamentFileReadOnlyModel.finalize(TournamentFileReadOnlyModel.java:33)[classes /:?] at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method)〜[?:1.7.0_25] 在java.lang.ref.Finalizer.runFinalizer(Finalizer.java:101)[?:1.7.0_25] at java.lang.ref.Finalizer.access $ 100(Finalizer.java:32)[?:1.7.0_25] 在java.lang.ref.Finalizer $ FinalizerThread.run(Finalizer.java:190)[?:1.7.0_25]
更新
你是对的。还有另一种模型。但后来我不知道如何将不同的模型共享为同一个uuid。但这是另一个问题21:08:55.980 [qtp13530976-43] DEBUG org.tahom.processor.service.callable.CallableService - 创建文件 与uuidb485a4d1-ef67-4255-af64-4d7df6001b09 21:08:55.980 [qtp13530976-43] DEBUG org.tahom.web.model.TournamentFileReadOnlyModel - 为classorg.tahom.web.model.TournamentFileReadOnlyModel@1ba03be生成的UUID b485a4d1-ef67-4255-af64-4d7df6001b09
21:08:56.794 [Finalizer] DEBUG org.tahom.web.model.TournamentFileReadOnlyModel - Class org.tahom.web.model.TournamentFileReadOnlyModel@14be425 21:08:56.907 [Finalizer] INFO org.tahom.processor.service.callable.CallableService - 使用uuid从缓存中清除文件:b485a4d1-ef67-4255-af64-4d7df6001b09
21:09:23.696 [Finalizer]警告 org.tahom.processor.service.callable.CallableService - 何时出错 使用uuid从缓存中清除文件: b485a4d1-ef67-4255-af64-4d7df6001b09 21:09:23.696 [Finalizer] DEBUG org.tahom.web.model.TournamentFileReadOnlyModel - Class org.tahom.web.model.TournamentFileReadOnlyModel@1d76f52
答案 0 :(得分:3)
您正在处理(代码的其他区域)两个TournamentFileReadOnlyModel
实例的可能性。
许多框架创建和销毁实例而不是保留它们。有些人将一个实例与另一个实例隔离开来(例如,Web服务隔离连接)其他实例用于验证类是否具有正确的继承链(例如,SWT的服务接口),有些只是为了验证细节。
在任何情况下,在finalize块中放置所需的逻辑是一个已知的&#34;非常糟糕的模式&#34;,虽然你可能想找到你的类被构造两次的原因,但请考虑不使用最终确定。
这可能意味着使用不同的方法来管理您谈到的临时文件;但是,使用不同的方法,您可以明确详细说明策略,而不是希望JVM(无法保证这样做)遵循您的策略。