如何从调用程序隔离到一个“坏”的API?
-
10-07-2019 - |
题
当我开发一块使用Java(学术)软件,我被迫使用已相当差实现的API。这意味着,调用此API用于特定的一组输入数据有时会一去不复返。这一定是在软件中的错误为它提供了确定性的,有时它会终止于一组数据的算法,有时会碰到同一组数据的无限循环......
然而,固定所述API或重新实现它只是超出范围。我甚至有来源,但主要依赖于它是由无证的时间,没有源和有其他API的API从网上消失了(或者从来没有去过那里?)。在另一方面,这种“坏” API是唯一一个在那里,解决具体的问题,我有,所以我真的不得不坚持下去。
现在的问题是:什么是处理与表现,好吧,我讨厌一个API的干净的方式?当我面对这个问题,我决定把对API的调用到一个单独的线程。然后另一个线程偶尔会检查该线程已经终止了。如果一定时间已经过去了,我会用Thread#stop()
杀处理线程并再次开始处理,希望它会返回下一次。现在,我知道(而且知道吧),此方法已过时,不能使用。但在这种学术语境它是可以接受的具有软件的潜在碰上未定义的状态,而不是具有其崩溃的。
这也是不能接受的只是忽略,因为它做了一些相当的CPU密集型操作,将显著减缓用户的机器已经运行到一个无限循环的处理线程。
这是我没有尝试另一种方式是在一个单独的处理的,而不是一个线程的处理开始,因为一个子进程可以干净地没有把软件处于不一致的状态被杀死。或者可以在新SwingWorker
类(这是尚未公布),已做的工作?它有一个cancel()
方法,但该文档说,它的“试图取消对此任务的执行” 的,所以它看起来并不像一个可靠的方法无论是。
解决方案
我建议使用单独的过程。有本质上是一个线程杀了第二个线程在Java中,除非第二个线程定期检查,看它是否已被中断没有安全的方式。
在理想的解决方案将是使用分离物。一个isolate本质上是一个Java应用程序可以创建,管理和沟通的私人虚拟机。特别地,该父应用程序可以安全地杀死的分离和它的所有线程。
参考: JSR-000121应用程序隔离API规范 - 最终版本一>
问题是要找到支持菌株一个JVM。
其他提示
我是单独的进程对这种事情的忠实粉丝。
生成一个子过程并等待结果。
如果该API是非确定性的,把计时器线程在一个封装器,使得坏API到主程序。
这样一来,子进程总是在给定的时间内结束。它要么产生一个有用的结果或者指示失败的系统退出代码。
两者@美国洛特和@Stephen C'S答案是当场就关于如何处理这种情况,但我想补充一点,在非学术环境中,你也应该寻找到替代API根据实际情况尽快。在我们已经锁定到一个坏的API,通常是通过选择其他原因贩卖的解决方案的情况下,我工作过一段时间,以取代与我自己的功能。你的客户不会是因为你的教授的宽容,因为他们实际上必须使用你的软件(或不!),而不是仅仅档次呢。
有一定其中使用胶带是适当的选择,以解决问题的情况。当它导致这样恶劣的行为,如你所说,不过,最好不要依赖它太长,开始真正的修复工作。
在最佳的事情是重新实现有问题的API。但是,正如你所说,这是一个非常沉重的重量,可能超出范围的解决方案。
的下一个最好的强>的事情是如果可能的话以包裹API。基本上,如果你能提前确定它是什么数据集导致失败你可以的拒绝的要求,以保证确定性。这听起来并不这样会为你工作,要么,你认为重复使用相同的数据集的通话将终止有时,当它在之前调用了无限循环。
鉴于以上上述选项不可用:结果 我觉得你的当前线程解决方案的是最好的错误的选择即可。方法调用旋转起来的过程似乎太沉重的重量是从性能角度的视图可以接受的,即使它比使用线程安全的。 使用Thread.stop()是很危险的,但如果你虔诚地防止任何锁定,你可以逃脱它。