Multithreading 如何通过tomcat 8中的java代码(而不是通过tomcat配置文件)动态设置系统属性

Multithreading 如何通过tomcat 8中的java代码(而不是通过tomcat配置文件)动态设置系统属性,multithreading,tomcat,system,jndi,rmi,Multithreading,Tomcat,System,Jndi,Rmi,我已经通过下面的链接了解了peter提供的在多线程中动态设置系统属性的解决方案 但问题是,tomcat没有考虑我正在设置的系统属性。那么如何做到这一点呢 我在一个管理站中有多个线程,通过RMIAPI连接到不同的服务器,并相应地下载存根。 我指的是相同名称的jar文件,作为每个服务器不同位置的存根。 注意:每个位置的jar版本可能不同。 例如:MS-->serv1-->存根位置() MS-->serv2-->存根位置() 我想为每个位置动态设置java.rmi.server.codebase系统

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

但问题是,tomcat没有考虑我正在设置的系统属性。那么如何做到这一点呢

我在一个管理站中有多个线程,通过RMIAPI连接到不同的服务器,并相应地下载存根。 我指的是相同名称的jar文件,作为每个服务器不同位置的存根。 注意:每个位置的jar版本可能不同。 例如:MS-->serv1-->存根位置() MS-->serv2-->存根位置()

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

通过以上链接中提供的示例,我希望实现上述问题的解决方案

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


这里的任何帮助都将是巨大的!谢谢。

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

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

正如EJP指出的那样,(成功地)设置该属性不太可能实现您想要的

但在你的问题中还有几个重要的误解

  • Tomcat不实现RMI。RMI实际上是由JavaSE本身实现的。因此,Tomcat不需要关注这些属性设置

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


  • 回到你试图实现的目标,它似乎与以下内容相同或相似:

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

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

    RMI系统允许您提供自己的类加载器供RMI使用。您可以通过实现
    RMIClassLoaderSpi
    API,然后按照
    RMIClassLoader
    中的描述注册提供者来实现这一点。这是方程式的一部分

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

    解决方案:委派

    • 根据上下文所需的远程API版本,可以实现自定义RMI类加载器,以委托给多个不同类加载器中的一个

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


    警告。。。我没有试过这个

    我的问题是我们使用java.rmi.server.usecodebaseonly=false的实际生产场景,该选项在客户站点报告为java安全漏洞问题。因此,我尝试使用java.rmi.server.codebase属性来解决这个问题。@Stepen C非常感谢您的评论。我会仔细考虑你的建议并尝试一下。