我正在开发一个名为无限的 Java 函数。此功能将调用 Web服务,返回返回结果。然后,结果解析和分析。
在Web服务返回结果之前,不应再次调用 函数 ,这些结果已分析。
我应该使用无限递归来实现这一目标吗?或者我应该使用在某些时间间隔内调用该功能的计时器吗?
也出现了一些问题:
如果网络服务的响应超时,会发生什么?如何防止应用程序崩溃或无响应地进行无限制调用?
我应该创建一个事件驱动类来处理这些请求吗?
在优化方面,哪种解决方案更有效?
- 编辑
我理解这个问题有点模糊和笼统,所以非详细的答案会很好,我会专注于实施。我只需要对这种方法提出建议。 :)
感谢任何帮助。
答案 0 :(得分:3)
你几乎肯定不应该使用递归来处理没有明确“基本情况”的进程。无限递归是一个非常糟糕的主意。每次调用都会占用越来越多的堆栈,最终你会因为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;
}
}
或者,如果您可以将任务捆绑到不同的对象中,请使用null或不作为“任务正在运行”标志。在第一个synchronized
部分中创建对象,在“执行您的操作”部分中启动它,并在finally
块中将其设置为null。 (注意,无论哪种方式,你都需要确保通过函数的所有非致命路径 - 甚至抛出异常! - “完成后清除标志。因此finally
阻止。”
无论哪种方式,您都可以设置一个计时器来调用此函数,如果它已在运行,它会立即返回。计时器方法的唯一缺点是在一个呼叫结束和下一个呼叫开始之间可能存在一些停机时间。
答案 1 :(得分:0)
我很困惑。你为什么需要一个计时器?
似乎呼叫是同步的,即下一个呼叫在您收到第一个呼叫的响应之前不会触发。
为什么不只是一个带有try / catch块的简单while循环捕获java.net.SocketTimeoutException并在一定数量的失败中突破循环?
对于这个用例,建议的递归似乎是一个坏主意。