在IE9上意外重启

时间:2013-03-01 04:37:25

标签: java applet

我正在研究Java applet并在IE9上遇到问题。在我们的设计中,当选择/取消选择特定选项卡时,将在文档中添加和删除小程序。

1)当选项卡被选中时,applet显示正常。在java控制台中,我看到以下消息:

basic: Added progress listener
 basic: Plugin2ClassLoader.addURL parent called for XXX

basic: Applet initialized
 basic: Starting applet

basic: Applet made visible
 basic: Applet started
 basic: Told clients applet is started

2)取消选择选项卡时:在java控制台中

basic: Starting applet teardown

basic: Finished applet teardown
 basic: Removed progress listener: 

紧接着(不知道applet是谁以及为什么再次启动)

basic: Added progress listener:

basic: Plugin2ClassLoader.addURL parent called for

basic: Applet loaded.

basic: Applet resized and added to parent container

basic: PERF: AppletExecutionRunnable - applet.init() BEGIN ; jvmLaunch dt 106964 us, pluginInit dt 45402059 us, TotalTime: 45509023 us

basic: Applet initialized

basic: Starting applet

basic: completed perf rollup

当文档模式切换到IE8时,同样的小程序正常工作。此外,Firefox也可以正常工作......

BTW,我正在使用以下版本的JRE

版本:7.0.150.3

为什么这个意外重启applet的想法?

1 个答案:

答案 0 :(得分:0)

(我也在同一问题上看到了您的MSDN TechNet论坛消息。)

我刚刚用一个类似的项目来解决你的问题:我们从单页面应用程序的DOM中注入和删除applet,在那里我们不能期望永远注入它们并消耗资源,而且它是事实证明,在一个标签中长时间(天)保持applet存活时,我们支持的浏览器的所有怪癖都难以处理。由于applet生命周期的管理并没有真正实施,并且因浏览器的不同而有所不同,有些人会将其删除,并使用“短命”applet证明总体上“更安全”和“更简单”。

即IE9中的2个问题:

  • 如果不强制IE9为每个applet使用单独的JVM,在尝试重新注入和重新执行applet时,它会在某些配置下崩溃。
  • 在Windows Update之后,我怀疑是2月12日KB2792100处理我们目前正在处理的安全公告MS13-009

请注意,我并不完全确定触发IE9的行为是什么,但我会怀疑在删除applet时的内部竞争条件(或者一种奇怪的保护措施,假设删除它是一个错误,除非它没有似乎总是打扰它。)

另外,对于我提到的两个问题,我发现至少有一个工作站没有发生问题,而没有确定原因(硬件配置,win + ie版本,java插件版本......)。我的所有同事的工作站和我们的测试服务器都会一直失败,除了我的机器(使调试变得更加有趣)。

解决方法

我们解决这个问题的方式并不令人满意,但我们现在正在努力解决这个问题:我们对IE9有一个特例。希望IE10没有错误,IE8甚至IE9在IE8模式下或者在MSDN中提到IE9在不同的兼容模式下提到似乎没有触发问题。

因此,对于好的IE9,我们所做的确实是使用更传统的长寿命小程序,并使用JS与Java通信使其按需执行我们想要的操作,并且我们跳过DOM删除部分......这意味着我们可能需要通知用户他们可能偶尔需要刷新他们的标签或类似的东西,如果java插件没有行为或IE决定杀死小程序。

希望下一次更新不会让情况变得更糟。

替代解决方法

我也发现了一些奇怪的东西。通常,我们在完成时从DOM中删除applet:在完成任务后,它会触发JS回调,这反过来会从父进程中删除applet。而且,为了以防万一,我们还会在注入新applet之前删除任何现有的applet,以防前一个applet没有被正确删除。

现在这两个都会失败,因为几个星期。

但是我注意到我可以注入applet,然后用setInterval()启动一个重复的函数,并定期检查applet,然后在它看到它时可以立即删除它。奇怪的是,使用这种方法不会发生错误!!

然而,我没有沿着这条路走下去:

  • 我真的不喜欢因为特殊原因而添加这种奇怪的计时器,并且冒险将它们从未被丢弃,
  • 我担心applet在完成工作之前就会被移除并提前终止。似乎并非如此,但由于那种东西相当“未指明”,我宁愿不管它。

您可以尝试的其他事项

您可以尝试使用<object>代码而不是<applet>代码。这实际上是推荐用于IE,但我们不能这样做,因为我们希望applet在注入时自动启动,并且出于某种原因IE8(我们支持的 all 唯一的我们支持的浏览器)拒绝自动启动页面加载后注入的applet。所以你可以检查一下是否有效,如果确实如此,你不需要IE8就可能是金色的(或者不像上面这样的特殊情况,你可以为IE8和IE9使用不同的标签)。

但我还没有机会尝试(还)。

祝你好运。