2016-07-13 22 views
0

Wir haben mehrere Webapps auf einem WebSphere-Anwendungsserver implementiert, wobei beide Anwendungen den ImageIO von Standard-Java verwenden, aber eine zusätzliche Bibliothek, um weitere Leser hinzuzufügen/Schriftsteller.Wie Sie eine Instanz von javax.imageio.spi.IIORegistry mit korrektem Gültigkeitsbereich erhalten

Die Frage ist jetzt, verwenden beide Anwendungen IIORegistry.getDefaultInstance(), um die Instanz der Service-Registrierung zu erhalten, und beide Anwendungen scheinen die gleiche Instanz zu erhalten. Intern ist dies mit AppContext.getAppContext() verbunden, die denselben awt AppContext zurückgeben. Gibt es eine geeignete Möglichkeit, mehrere WebSphere-Anwendungen mit ImageIO of Java zu betreiben, ohne sich um beide Apps kümmern zu müssen, die dieselben Bibliotheken verwenden? Muss ich manuell einen AppContext für meine WebSphere-Anwendungen erstellen?

Antwort

0

Ich glaube, das App-Kontext-Konzept (das in der Klasse IIORegistry verwendet, nicht mit einem Web-App-Kontext zu verwechseln) war ursprünglich für Applets (dh mehrere Applets in einer einzigen JVM in einem Browser) gedacht. Für Web-Apps wäre das auch sinnvoll, aber ich glaube nicht, dass es so funktioniert. Außerdem glaube ich nicht, dass es öffentliche API-Klassen oder Methoden gibt, die mit dem Erstellen oder Pflegen von App-Kontexten zusammenhängen (es ist alles in den Paketen sun.awt.*), daher wird das manuelle Erstellen von Kontexten nicht empfohlen.

Ich habe eine web context listener gemacht, die einige der Probleme mit der Verwendung von ImageIO in Web-Anwendungen lösen wird, dh. Registrieren und Aufheben der Registrierung von "lokalen" Plugins der Webanwendung, wenn die Webanwendung geladen/entladen wird (sowohl Erkennung als auch Entfernung von "veralteten" Plugins). Leider wird dies nicht auf Web-App-Plugins aus anderen Web-Apps versteckt, wenn dies Ihre Absicht ist (schwer zu sagen von der Frage). Ein AppContext per Web-App wäre wahrscheinlich ein sauberer Ansatz, aber wie bereits erwähnt, würde das Fehlen von öffentlichen API und keine "Standard" Art, dies zu tun, eine solche Lösung nicht tragbar und damit unerwünscht machen.

+0

Danke für die Antwort, und in der Tat, die Absicht wäre, die Plugins einer Web-App von der anderen zu verstecken. Unerwünschte NoClassDefFoundErrors verhindern, dass die andere Seite richtig funktioniert, also müssen beide Webapps den gleichen Satz von Bibliotheken teilen (machbar, aber irgendwie seltsam) oder es muss eine Möglichkeit geben, eine zweite Webanwendung von einer anderen zu verstecken. –

+0

@ThomasW Ich denke, der einfachste Weg, dies zu erreichen, besteht darin, einfach mehrere WebSphere-Instanzen auszuführen, eine für jede Webanwendung. – haraldK

+0

@ThomasW Wenn ich darüber nachdenke, könnte es innerhalb desselben Containers möglich sein. Es erfordert jedoch eine Möglichkeit, WebSphere so zu konfigurieren, dass eine 'ThreadGroup' pro Web-App-Kontext verwendet wird. Ich bin mir nicht sicher, ob das möglich ist? In jedem Fall habe ich einen schnellen PoC geschrieben, um zu beweisen, dass verschiedene Thread-Gruppen tatsächlich unterschiedliche "IIORegistry" -Instanzen wie dokumentiert erhalten. – haraldK