我有一个用例,我在特定方法上启动一个计时器,看它是否需要超过x秒。如果是这样,我将在日志中记录致命错误,如下所示。
private boolean isDpxTimedOut(StopWatch stopWatch)
{
stopWatch.stop();
long elapsedTime = stopWatch.getNanoTime();
Double elapsedTimeInSeconds = elapsedTime/NANO_DIVISOR;
return (elapsedTimeInSeconds >= DPX_TIMEOUT_VALUE);
}
public void callDPX()
{
try{
StopWatch stopWatch = new StopWatch();
//body of the method
}
catch(Exception e)
{
e.printStackTrace();
}
finally {
//putting a check here to see if DPX timed out and then logging a FATAL.
if(isDpxTimedOut(stopWatch))
{
log.fatal("[DPX TIMEOUT] The request took more than 12 seconds.");
}
}
现在我有一个用例,我必须将这个stoip watch放在不同类的多个方法中。我该怎么设计呢?不同类的超时将是不同的,应该从Config文件中读取。有人能指出我对这个用例的好设计。
答案 0 :(得分:0)
首先更改isDpxTimedOut,调用DPX方法将时间作为参数,以便您可以从配置文件中传递不同的数字..
设计将是..创建一个基类并将你的方法放在那里。你编写的任何类扩展了该基类。在你的类中,如果你想调用timeout方法,首先从配置文件中获取相应的时间,并使用time参数调用callDPX()。
答案 1 :(得分:0)
在这种情况下,Proxy pattern可以为您提供帮助。
更好地解释了这一点代理是一种常用的设计模式。简而言之,代理是一个看起来像另一个对象的对象,但在场景后面添加了特殊功能。
这是一种结构模式,因为它定义了在类或实体之间创建关系的方式。代理设计模式用于提供代理或占位符对象,它引用基础对象。
通过充当传递实体或占位符对象,允许对象级访问控制。
Spring AOP使用相同的设计模式。
只需在实际对象调用之前和之后包装对象添加新功能。
答案 2 :(得分:0)
尝试以下方面的内容:
class Executor {
public static void execAndLogOnTimeout(Runnable runnable, long timeout) {
// Save start time
runnable.run();
// Save end time
// If time taken > timeout: log
}
}
Executor.execAndLogOnTimeout(new Runnable() {
@Override public void run() {
// The code to be clocked
}
}, Config.timeoutForThisPieceOfCode());
另一种选择是在建议中使用AOP。