Multithreading 如何通过tomcat 8中的java代码(而不是通过tomcat配置文件)动态设置系统属性
我已经通过下面的链接了解了peter提供的在多线程中动态设置系统属性的解决方案 但问题是,tomcat没有考虑我正在设置的系统属性。那么如何做到这一点呢 我在一个管理站中有多个线程,通过RMIAPI连接到不同的服务器,并相应地下载存根。 我指的是相同名称的jar文件,作为每个服务器不同位置的存根。 注意:每个位置的jar版本可能不同。 例如:MS-->serv1-->存根位置() MS-->serv2-->存根位置() 我想为每个位置动态设置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系统
java.rmi.server.codebase
系统属性,并使其成为threadLocal,这样它就不会覆盖彼此的设置
通过以上链接中提供的示例,我希望实现上述问题的解决方案
但是为了测试分辨率,我无法在tomcat中设置这些属性。
Tomcat正在忽略我正在设置的系统属性。Tomcat考虑的JVM参数是通过catalina.bat或service.bat设置的,而不是通过system.properties设置的,因为我需要动态设置它
这里的任何帮助都将是巨大的!谢谢。在导出远程对象的JVM上设置了
java.rmi.server.codebase
属性。在客户机JVM中设置它完全没有任何作用,除非JVM也导出远程对象,即回调。您似乎不太可能在同一个JVM中处理自己应用程序的多个版本
简而言之,您的问题没有意义。正如EJP指出的那样,(成功地)设置该属性不太可能实现您想要的
但在你的问题中还有几个重要的误解
回到你试图实现的目标,它似乎与以下内容相同或相似:
RMIClassLoaderSpi
API,然后按照RMIClassLoader
中的描述注册提供者来实现这一点。这是方程式的一部分
问题是RMI类加载器是全局的,但是您希望不同线程上的RMI使用不同的类加载器
解决方案:委派
- 根据上下文所需的远程API版本,可以实现自定义RMI类加载器,以委托给多个不同类加载器中的一个
- 由于建议使用线程局部变量,因此可以声明一个线程局部变量供自定义RMI类加载器使用,并让它使用该变量的值来决定委托给哪个类加载器
警告。。。我没有试过这个 我的问题是我们使用java.rmi.server.usecodebaseonly=false的实际生产场景,该选项在客户站点报告为java安全漏洞问题。因此,我尝试使用java.rmi.server.codebase属性来解决这个问题。@Stepen C非常感谢您的评论。我会仔细考虑你的建议并尝试一下。