【发布时间】:2017-11-04 00:15:20
【问题描述】:
我有一个使用 PlayFramework 2.6.5 和 Guice DI (libraryDependencies += guice) 构建的 Java Web 服务,只是在时间注入模式下。所有依赖都通过构造函数注入,使用@Inject 和@ImplementedBy,Guice Module 为空。
由于瞬态错误,某些依赖项可能会在构造函数中引发异常。发生这种情况时,服务将失败并显示ProvisionException(这没关系,客户端应该重试)。
我发现这些异常被缓存了,即使解决了异常的根本原因,Play 或 Guice 都不会重试实例化这些类,并一直抛出相同的异常,直到重新启动 Web 服务。
例如,考虑以下类Clock,其构造函数在午夜 (00:xx) 时失败。系统时钟一到午夜,服务就无法实例化该类。当时钟到达凌晨 1 点时,同样的异常不断被抛出。此外,异常消息始终相同(在示例中异常消息是第一次发生异常的时间)
@ImplementedBy(OddClock.class)
public interface IClock {
//...
}
public class OddClock implements IClock {
@Inject
public OddClock() throws Exception {
if (DateTime.now().hourOfDay().get() == 0) {
throw new Exception(DateTime.now().toString());
}
}
}
public class TimeController {
@Inject
public TimeController(IClock clock) {
this.clock = clock;
}
}
顺便说一句,在控制台应用程序中也使用了相同的代码库,它不会受到这个问题的影响,所以我认为 Play+Guice 集成中有一些特别之处。有什么关闭异常缓存的建议吗?
【问题讨论】:
标签: java playframework guice