【问题标题】:Unexpected restart on IE9IE9 意外重启
【发布时间】:2013-03-01 04:37:24
【问题描述】:

我正在开发一个 Java 小程序,但在 IE9 上遇到了问题。 In our design applet would be added and removed from the document when a particular tab is selected/deselected.

1) 选择选项卡后,小程序显示正常。在 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: 

紧随其后的是(不知道小程序又是谁,为什么又启动了)

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 也可以正常工作...

顺便说一句,我正在使用以下版本的 JRE

版本:7.0.150.3

任何想法为什么会意外重启小程序?

【问题讨论】:

  • “在我们的设计中applet会被添加和从文档中删除”其中可能存在(触发或原因)问题。
  • @AndrewThompson:确实,这通常是自找麻烦。但是,我必须同意 OP 的观点,即有时这就是你必须要做的(无论是否愿意)。

标签: java applet


【解决方案1】:

(我还看到了您关于同一问题的 MSDN TechNet 论坛消息。)

我刚刚在一个做类似事情的项目中遇到了你的问题:我们正在从单页应用程序的 DOM 中注入和删除小程序,我们不能期望永远注入它们并消耗资源,是这样吗?事实证明,当要让小程序在选项卡中长时间(几天)保持活动状态时,处理我们支持的浏览器的所有怪癖太难了。由于对小程序生命周期的管理并未真正强制执行,并且因浏览器而异,因此有些人会杀死它们,并且使用“短命”小程序被证明总体上“更安全”和“更简单”。

也就是说,除了 IE9 中的 2 个问题:

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

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

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

解决方法

我们解决它的方式并不令人满意,但我们现在就解决这个问题:我们有一个 IE9 的特殊情况。希望 IE10 没有错误,并且 IE8 甚至 IE8 模式下的 IE9 或您在 MSDN 帖子中提到的不同兼容模式下的 IE9 似乎不会触发问题。

所以对于好的 ol' IE9,我们所做的确实是使用更传统的长寿命小程序,并使用 JS 到 Java 通信来使其按需执行我们想要的操作,并且我们跳过 DOM 删除部分......这意味着我们可能需要通知用户,如果 java 插件不正常或 IE 决定终止小程序,他们可能偶尔需要刷新选项卡或类似的东西。

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

替代解决方法

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

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

但我注意到我可以注入小程序,然后使用setInterval() 启动重复功能并让它定期检查小程序,然后在看到小程序可用时立即删除它。奇怪的是,使用这种方法不会出现错误!

但是,我没有走这条路:

  • 我真的不喜欢出于临时原因添加这种奇怪的计时器,并冒着它们永远不会被丢弃的风险,
  • 恐怕小程序在完成工作之前会被删除并提前终止。似乎并非如此,但由于这类东西相当“未指定”,我宁愿不理会它。

您可以尝试的其他方法

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

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

祝你好运。

【讨论】:

    猜你喜欢
    • 2017-06-12
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多