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

时间:2018-03-12 11:37:46

标签: multithreading tomcat system jndi rmi

我已经通过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 - > stublocation(http://15.yy.yy.yy:port/myfolder/myapp.jar

我想动态地为每个位置设置docker-compose.yml系统属性,并使其成为threadLocal,以便它不会覆盖其他设置。

通过上面链接中提供的示例,我希望能够解决上述问题。

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

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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

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

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

  3. 回到你想要实现的目标,它似乎与此相同或类似:

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

    但他的Q& A提供了一种解决问题的方法。这有点复杂。

    RMI系统允许您为RMI提供自己的类加载器以供使用。您可以通过实施RMIClassLoaderSpi API,然后按RMIClassLoader javadoc中所述注册您的提供商来实现此目的。这是等式的一部分。

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

    解决方案:委托!

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

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

    CAVEAT ......我没试过这个!