2016-11-25 7 views
0

Я запускаю два веб-приложения в процессе хоста tomat, что означает, по-моему, должно быть два отдельных программы, по одному для каждого приложения.Отдельные свойства JVM для каждой java-программы на одном JVM

Другое дело, что оба приложения имеют свойство 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

value1

когда app2 загружается значение для имущества key1 valu2

Но после app2 загружен, он переопределяет key1 для приложения 1.

valu1_for_app1

код является довольно простым для выше,

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 параметров глобальными только в одной виртуальной машине Java, но у меня есть несколько сервисов, работающие на моем сервере, где каждая служба должна иметь свой собственный набор параметров JVM, на основе которых есть еще один api, который фактически использует это свойство JVM.

+1

Не уверен, что вы действительно просят ... но, возможно, это поможет, если ваши службы не будут использовать свойства System, но полагаются на разные файлы свойств; возможно, это помогает: http://stackoverflow.com/questions/12280787/reading-properties-from-tomcat? – GhostCat

+0

'свойства для каждого java-процесса на одном JVM JVM - это один процесс (не считая LWP). Нет такой вещи, как больше процессов на одном JVM – rkosegi

+0

Правильно, системные свойства на JVM - вы что-то ищете на уровне приложения –

ответ

2

Для свойств приложения вы не хотите использовать параметры VM. Как вы обнаружили, они являются глобальными для всего контейнера. Вместо этого вы должны использовать файл свойств, который загружается при загрузке приложения. Один из подходов, который мне нравится использовать, заключается в загрузке пакета ресурсов в статическую карту. Допустим, у вас был файл application.properties в каталоге WEB-INF/classes. Как это:

//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"); 
+0

Хорошо, я знаю, что вы говорите. Проблема в моем случае заключалась в том, что какой-то третий API ожидал, что '-Dkey1 = valueX' будет установлен и обрабатывается таким образом, что является странным, и выглядит плохой дизайн, когда я запускаю свое приложение внутри одного и того же процесса tomcat. Я думаю, что свойства System были бы разными, когда я запускаю с помощью java SomeClass'. Я считаю, что проверял это. – prayagupd