【问题标题】:How to set system properties dynamically via java code in tomcat 8 (not through the tomcat configuration files)如何通过tomcat 8中的java代码动态设置系统属性(而不是通过tomcat配置文件)
【发布时间】:2018-08-20 10:02:38
【问题描述】:

我已经通过以下链接浏览了 peter 提供的用于在多线程中动态设置系统属性的解决方案

System.setProperty used by a thread impacts other thread in communication to external network elements. How to resolve it?

但问题是,tomcat 没有考虑我设置的系统属性。那么如何实现呢?

我在管理站中有多个线程,通过 RMI API 连接到不同的服务器并相应地下载存根。 我指的是同名 jar 文件作为每个服务器不同位置的存根。 注意:每个位置的 jar 版本可能不同。 例如:MS --> serv1 --> stublocation (http://15.xx.xx.xx:port/myfolder/myapp.jar) MS --> serv2 --> 存根定位 (http://15.yy.yy.yy:port/myfolder/myapp.jar)

我想为这些位置中的每一个动态设置java.rmi.server.codebase 系统属性并使其成为threadLocal,这样它就不会覆盖其他设置。

通过上面链接中提供的例子,我希望能实现上述问题的解决方案。

但是为了测试分辨率,我无法在 tomcat 中设置这些属性。 Tomcat 忽略了我正在设置的系统属性。 Tomcat 正在考虑通过 catalina.bat 或 service.bat 而不是通过 system.properties 设置的 JVM 参数,因为我需要动态设置它。

这里的任何帮助都会很棒!谢谢。

【问题讨论】:

    标签: multithreading tomcat system jndi rmi


    【解决方案1】:

    java.rmi.server.codebase 属性在 JVM 上设置,导出远程对象。在客户端 JVM 中设置它完全没有任何效果,除非 JVM 也导出远程对象,即回调。您似乎不太可能在同一个 JVM 中处理自己的应用程序的多个版本。

    简而言之,你的问题没有意义。

    【讨论】:

    • 我的问题是我们使用 java.rmi.server.usecodebaseonly=false 的真实生产场景,并且此选项在客户站点被报告为 java 安全漏洞问题。因此我尝试使用 java.rmi.server.codebase 属性来解决问题。
    【解决方案2】:

    正如 EJP 指出的那样,(成功地)设置该属性不太可能达到您想要的效果。

    但您的问题中还有一些其他重要的误解。

    1. Tomcat 没有实现 RMI。 RMI 实际上是由 Java SE 自己实现的。因此,Tomcat 不应该关注那些属性设置。

    2. 使用系统属性进行配置的典型 Java 服务在 JVM 的生命周期内执行一次。这通常发生在相关子系统(例如 RMI)初始化时。以编程方式(“动态”)设置系统属性的问题在于确保在相关初始化代码使用它们之前设置它们。


    回到你想要达到的目标,好像和这个一样或相似:

    没有人能够帮助那个人,他最终以另一种方式解决了他的问题。 (我想他是说他用自定义的 readObject / writeObject 方法处理了 serialVerionId 不匹配...)

    但他的问答提供了一种解决问题的可能方法。有点复杂。

    RMI 系统允许您提供自己的类加载器供 RMI 使用。为此,您可以实现RMIClassLoaderSpi API,然后按照RMIClassLoader javadoc 中的说明注册您的提供程序。这是等式的一部分。

    问题在于 RMI 类加载器是全局的,但您希望不同线程上的 RMI 使用不同的类加载器。

    解决方案:委托!

    • 您实现自定义 RMI 类加载器以委托给多个不同类加载器之一,具体取决于上下文所需的远程 API 版本。

    • 由于您建议使用线程局部变量,您可以声明一个线程局部变量供自定义 RMI 类加载器使用,并让它使用该变量的值来决定委托给哪个类加载器。

      李>

    CAVEAT ...我还没有尝试过!

    【讨论】:

    • @Stepen C 非常感谢您的 cmets。我会仔细阅读您的建议并尝试一下。
    猜你喜欢
    • 2012-01-25
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多