规格
该Web应用程序是tiparlo。它用于记录和组织口语,并主要用于学校培训语言并存储以供以后评估。该应用程序由HTML界面组成,由JavaScript管理。声音播放和录制通过内部开发的Java小程序完成。正如您在测试页面上看到的那样,小程序本身处于工作状态。
但是,在tiparlo中,小程序(以下称为soundrecorder)没有预加载的声音文件。由于tiparlo由多个声音文件组成,JavaScript告诉soundrecorder播放哪个文件。例如,如果您想播放foo.ogg,javascript会告诉soundrecorder播放http://url/path/foo.ogg。
这已经工作了几年,但现在不行了。
缺陷跟踪
问题在于它在某些条件下确实可以工作。例如,它可以在我们的本地开发机器和公共测试环境中工作。但对于我们的客户来说,它停止工作了。
工作示例:http://test.s2.olefa.com/cgi-bin/apps/tiparlo?projectid=3&mode=viewer
不工作的示例:http://www.ecoles-dudelange.lu/cgi-bin/apps/tiparlo?projectid=1594&mode=viewer
一些有用的事实:
两个示例都在同一台服务器上运行
Java小程序、JS代码、HTML解析器和源代码都是共享资源。因此,这两个示例运行的是完全相同的代码。
与问题相关的文件是:soundrecorder.js和jrecord.jar。
play
命令在 soundrecorder.js 的第 112 行。
我们现在知道了什么
浏览器对于不工作的示例有不同的反应。Safari/Mac可以正常播放。然而,Safari/Win在播放时会冻结。Firefox 4则根本无法播放。Firefox 3.5/Mac又可以正常播放。然而,Firefox3.5/Win则根本无法播放。IE9也有同样的问题。Chrome也是一样。Opera直接崩溃并需要重新启动。我们还没有找到在Linux上可以正常播放不工作示例的浏览器。需要澄清的是:在所有平台上,工作示例都可以在所有浏览器上正常运行,除了Safari/Win(呃)。更新:这取决于Java版本。使用Java 6.20,所有不工作的示例都可以在所有浏览器上运行。使用Java 6.24,只有工作示例可以运行。
我们尝试使用非工作示例的替代服务器URL(webX.sX.olefa.com),该URL与工作示例类似。但这次尝试失败了。
我们尝试使用soundrecorder的相对路径(例如/path/foo.ogg)。
我们尝试将Java更新到最新版本。
我们尝试以不同的方式访问小程序。
6个月前,我们遇到了类似的问题,那是由Java更新引起的。我们尝试在拥有较旧Java版本的VM上运行不工作的示例。这次可以正常运行。然而,我们怀疑仅仅是Java导致问题,因为相同的Java版本/浏览器可以在工作示例上正常运行。
soundrecorder只会拒绝通过JS动态加载的文件。如果在初始化时加载文件,则没有错误。
小程序本身已被加载。您可以通过给它设置宽度/高度来使其可见。我怀疑Java/JS之间存在问题(JS告诉Java要播放什么,但通信出现了故障?)。然而,目前还无法确认。
一般来说,我们无法找出在完全相同的条件下运行相同代码为什么在一个网站上可以工作,而在另一个网站上不行。
解决方案
解决方案在评论中。问题和解决方案可以在这里找到。感谢Ryan指出正确的方向。