我正在研究一个Java函数,应该无限地调用。该函数将调用web服务,该服务将返回返回结果。然后对进行解析,并对进行分析。
函数不应该再被调用直到web服务返回结果,并且这些结果被分析
我应该使用无限递归来实现这个吗?或者我应该使用一个计时器,以特定的间隔调用函数?
也出现了一些问题:
-
如果web服务的响应超时怎么办?如何防止应用程序崩溃或无限制地调用而没有响应?
-
我应该创建一个事件驱动类来处理这些请求吗?
-
在优化方面,哪个解决方案效率更高?
——编辑
我知道这个问题有点模糊和笼统,所以不详细的答案就可以了,我将专注于实现。我只是需要你的建议。:)
你几乎可以肯定不应该在没有明确的"基本情况"的过程中使用递归。无限递归是一个非常糟糕的想法。每次调用都会消耗越来越多的堆栈,最终您将因OOM错误(或堆栈溢出,如果Java区分这两种情况)而死亡。
你可以试试
private Object mutex = new Object();
private boolean yourTaskIsRunning = false;
protected void yourTask()
{
synchronized(mutex)
{
if (yourTaskIsRunning) return;
yourTaskIsRunning = true;
}
try
{
// do your thing
}
finally
{
yourTaskIsRunning = false;
}
}
或者,如果您可以将任务绑定到一个不同的对象中,则使用其为空或不为空作为"任务正在运行"标志。在第一个synchronized
部分创建对象,在"做你的事情"部分启动它,并在finally
块中将其设置为null。(注意,无论哪种方式,您都需要确保通过函数的所有非致命路径——甚至抛出异常!——当他们结束时,"清除旗帜"。因此finally
块。)
无论哪种方式,你都可以设置一个计时器来调用这个函数,如果它已经在运行,它会立即返回。计时器方法的唯一缺点是在一个调用结束和下一个调用开始之间可能会有一些停机时间。
我很困惑。你为什么需要计时器?
似乎调用是同步的,即下一个不触发,直到你收到第一个的响应。
为什么不只是一个简单的while循环与try/catch块捕获java.net.SocketTimeoutException和打破循环在一定数量的失败?
对于这个用例,递归似乎是个坏主意。