【问题标题】:How to get an instance of javax.imageio.spi.IIORegistry with proper scope如何获取具有适当范围的 javax.imageio.spi.IIORegistry 实例
【发布时间】:2016-07-13 15:36:38
【问题描述】:

我们有几个 webapps 部署到一个 WebSphere 应用程序服务器,两个应用程序都使用标准 Java 的 ImageIO,但一个使用额外的库来添加更多的 Readers/Writers。

现在的问题是,两个应用程序都使用IIORegistry.getDefaultInstance() 来获取服务注册表的实例,并且两个应用程序似乎都获取了相同的实例。在内部,这与 AppContext.getAppContext() 返回相同的 awt AppContext 有关。是否有任何适当的方法可以让多个 WebSphere 应用程序使用 Java 的 ImageIO 而不必关心两个应用程序使用相同的库? 我是否必须为我的 WebSphere 应用程序手动创建 awt AppContext?

【问题讨论】:

    标签: java awt websphere javax.imageio


    【解决方案1】:

    我相信应用程序上下文概念(在IIORegistry 类中使用的概念,不要与网络应用程序上下文混淆)最初是为小程序设计的(即,多个小程序在浏览器中的单个 JVM 中运行) .对于网络应用程序,这也是有道理的,但我不认为它是这样工作的。另外,我认为没有任何与创建或维护应用上下文相关的公共 API 类或方法(都在 sun.awt.* 包中),因此不建议手动创建上下文。

    我创建了一个web context listener,它将解决在网络应用程序中使用ImageIO 时遇到的一些问题,即。在加载/卸载网络应用程序时注册和取消注册网络应用程序“本地”插件(处理“陈旧”插件的发现和删除)。不幸的是,这不会隐藏在其他网络应用程序的网络应用程序插件上,如果这是您的意图(很难从问题中看出)。

    为每个 Web 应用程序设置一个 AppContext 可能是一种更简洁的方法,但如前所述,缺乏公共 API 并且没有“标准”方式这样做会使这样的解决方案不可移植,因此是不可取的。

    【讨论】:

    • 感谢您的回复,事实上,其目的是隐藏一个网络应用程序的插件。不受欢迎的 NoClassDefFoundErrors 正在阻止另一方正常工作,因此两个 webapp 必须共享同一组库(可行但有点奇怪),或者必须有某种方法以某种方式隐藏第二个 webapp。
    • @ThomasW 我认为最简单的方法是运行多个 WebSphere 实例,每个 Web 应用程序一个。
    • @ThomasW 想一想,在同一个容器中可能是可能的。但它需要某种方式来配置 WebSphere 以在每个 Web 应用程序上下文中使用 ThreadGroup。我不确定这是否可能?无论如何,我写了一个快速的 PoC 来证明不同的线程组实际上确实得到了不同的 IIORegistry 实例,如文档所述。
    • 我目前的想法是通过在自定义 IIORegistry 中强制覆盖 IIORegistry 的代理到共享的 AppContext 中,因为底层存储似乎是一个 HashMap,没有检查是否当前密钥已经在其中。并且当代理在 Webapp 上下文中被调用时,它有一个自己的 IIORegistry 注册实例,使用该实例,否则使用最初存储的实例。我不能 100% 确定这是否是一个好主意,但对我来说听起来可能,还是我错过了什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多