2016-11-25 1 views
0

Ich führe zwei Web-Anwendungen im Tomat-Host-Prozess aus, was meiner Meinung nach zwei separate Programme haben sollte, eines für jede Anwendung.Separate JVM-Eigenschaften für jedes Java-Programm auf derselben JVM

Eine andere Sache ist, beide Apps haben eine JVM-Eigenschaft verwendet, die ich App-spezifisch sein möchte.

//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); 
    } 
} 

Als ich implementieren die Kriege für jede App und sehen den Wert für key1 Eigenschaft es durch die zweite Anwendung geladen außer Kraft gesetzt wird.

Als ich hier zeigen, wenn app1 geladen wird, wird der Wert für die Eigenschaft key1

value1

wenn app2 geladen wird, wird der Wert für die Eigenschaft key1 valu2

Aber nach app2 ist geladen, es überschreibt key1 für app1.

valu1_for_app1

Der Code für oben ist ziemlich einfach,

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>"); 
    } 
} 

So scheint es, ich kann JVM nur in einzelnen JVM globale Parameter haben, aber ich habe mehrere Dienste auf meinem Server läuft, auf dem Jeder Dienst muss einen eigenen Satz von JVM-Parametern haben, auf deren Basis ein anderes API die JVM-Eigenschaft tatsächlich verwendet.

+1

nicht sicher, was Sie wirklich fragen ... aber es vielleicht würde helfen, wenn Ihre Dienste nicht die Systemeigenschaften verwenden würden, sondern sich auf unterschiedliche Eigenschaftendateien verlassen würden; vielleicht hilft das: http://stackoverflow.com/questions/12280787/reading-properties-from-tomcat? – GhostCat

+0

'Eigenschaften für jeden Java-Prozess auf derselben JVM' JVM ist ein Prozess (ohne LWP). Es gibt so etwas wie mehr Prozesse auf einer JVM – rkosegi

+0

Das ist richtig, Systemeigenschaften sind per JVM - Sie suchen etwas auf Anwendungsebene –

Antwort

2

Für Anwendungseigenschaften möchten Sie keine VM-Parameter verwenden. Wie Sie festgestellt haben, sind diese für den gesamten Container global. Stattdessen sollten Sie eine Eigenschaftendatei verwenden, die beim Laden der Anwendung geladen wird. Ein Ansatz, den ich gerne verwende, ist das Laden eines Ressourcenbündels in eine statische Map. Nehmen wir an, Sie hatten eine Datei "application.properties" im Verzeichnis WEB-INF/classes. Wie folgt aus:

//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)); 
     } 
    } 
} 

Dann, wenn Sie eine Anwendung Eigenschaft zugreifen wollen, tun Sie es in Ihrem Code wie folgt aus:

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

Nun, ich weiß was du sagst. Das Problem in meinem Fall war, dass eine dritte API erwartet, dass '-Dkey1 = valueX' gesetzt wird und auf diese Weise verarbeitet wird. Das ist seltsam und sieht schlecht aus, wenn ich meine Anwendung im selben Tomcat-Prozess laufe. Ich denke, die Systemeigenschaften würden anders sein, wenn ich 'java SomeClass' benutze. Ich glaube, ich habe das getestet. – prayagupd

Verwandte Themen