我有一个用例,在这个用例中,我在特定方法上启动一个计时器,以查看它是否需要超过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监视放在不同类中的多个方法上。我该怎么设计呢?不同类的超时将是不同的,应该从Config文件中读取。有人能为这个用例指出一个好的设计吗?
发布于 2014-07-25 04:02:16
尝试一些类似于:
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。
发布于 2014-07-25 03:44:58
首先,将isDpxTimedOut、callDPX方法更改为以时间为参数,以便可以从配置文件传递不同的数字。
设计应该是..。创建一个基类并将您的方法放在那里。您编写的任何类都扩展了这个基类。在类中,如果要调用超时值方法,首先从配置文件中获取相应的时间,然后使用时间参数调用callDPX()。
发布于 2014-07-25 03:53:02
在这种情况下,代理模式可以帮助您。
代理是一种常用的设计模式。简单地说,代理是一个看起来像另一个对象的对象,但是在场景后面添加了特殊的功能。
最好用GOF -设计模式来解释
代理模式
这是一种结构模式,因为它定义了在类或实体之间创建关系的方式。代理设计模式用于提供代理项或占位符对象,该对象引用基础对象。 通过充当传递实体或占位符对象,允许对象级访问控制。
春季AOP使用相同的设计模式。
了解更多..。
只需包装对象,在实际对象调用之前和之后添加新功能。

https://stackoverflow.com/questions/24947561
复制相似问题