【问题标题】:Separate JVM properties for each java program on same JVM同一 JVM 上每个 java 程序的单独 JVM 属性
【发布时间】:2016-11-25 11:42:50
【问题描述】:

我在 tomat 主机进程中运行两个 Web 应用程序,这意味着我认为应该有两个独立的程序,每个应用程序一个。

另一件事是两个应用程序都使用了一个 JVM 属性,我希望它是特定于应用程序的。

//common-service library used in both web-apps
public class CommonService {

    private static Logger logger = LogManager.getLogger(CommonService.class);

    static {
        String uuid = UUID.randomUUID().toString();
        logger.debug("CommonService initialization for {}" , uuid);
        System.setProperty("key1", "value1-"+ uuid);
    }
}

当我为每个应用程序部署战争并查看 key1 属性的值时,它会被加载的第二个应用程序覆盖。

正如我在这里展示的那样, 加载 app1 时,属性 key1 的值

当app2被加载时,属性key1的值

但是app2加载后,它会覆盖app1的key1

上面的代码很简单,

public class Service1Servlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        CommonService commonService = new CommonService();
        System.out.println("Service1 key1= " + System.getProperty("key1"));
        PrintWriter out = resp.getWriter();
        out.println("<html>");
        out.println("<body>");
        out.println("<h1>" + System.getProperty("key1")+ "</h1>");
        out.println("</body>");
        out.println("</html>");
    }
}

所以,似乎我只能在单个 JVM 中使用全局 JVM 参数,但是我的服务器上运行着多个服务,每个服务都需要有自己的一组 JVM 参数,基于这些参数还有另一个实际使用的 api那个 JVM 属性。

【问题讨论】:

  • 不确定您真正要求的是什么……但如果您的服务不使用系统属性,而是依赖不同的属性文件,这可能会有所帮助;也许这有帮助:stackoverflow.com/questions/12280787/…?
  • properties for each java process on same JVM JVM 是一个进程(不包括 LWP)。一个 JVM 上没有更多进程这样的事情
  • 没错,系统属性是每个 JVM 的 - 您正在查看应用程序级别的内容
  • 您只能在命令行上全局设置系统属性。您可以将它们设为本地应用程序,但您将如何设置它们?

标签: java jvm jvm-arguments


【解决方案1】:

对于应用程序属性,您不想使用 VM 参数。正如您所发现的,这些对于整个容器都是全局的。相反,您应该使用在应用程序加载时加载的属性文件。我喜欢使用的一种方法是将资源包加载到静态 Map 中。假设您在 WEB-INF/classes 目录中有一个“application.properties”文件。像这样:

//common-service library used in both web-apps
public class CommonService {

    public static Map< String, String > APPLICATION_PROPERTIES = new HashMap<>();

    static {
        ResourceBundle bundle = ResourceBundle.getBundle( "application" );
        for( String key : bundle.keySet() ) {
          APPLICATION_PROPERTIES.put( key, ( String )bundle.getObject( key ) );
        }
    }
}

然后,当您想要访问应用程序属性时,您可以在代码中执行如下操作:

String key1Value = CommonService.APPLICATION_PROPERTIES.get( "key1" );

【讨论】:

  • 好吧,我知道你在说什么。在我的情况下,问题是第三个 API 期望 -Dkey1=valueX 以这种方式设置和处理,这很奇怪,并且当我在同一个 tomcat 进程中运行我的应用程序时看起来很糟糕。我认为当我使用java SomeClass 运行时系统属性会有所不同。我相信我已经测试过了。
猜你喜欢
  • 2011-08-22
  • 2020-07-18
  • 2011-09-09
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
  • 2013-04-02
  • 2020-07-16
相关资源
最近更新 更多