Während man die Zieladressen von Service-Referenzen innerhalb eines Composites komfortabel per Config-Plan ändern kann, funktioniert dieses Vorgehen nicht für Java Web-Service Clients – selbst wenn diese Teil eines Composites sind (z.B. innerhalb eines Mediator Callouts).

Oft hat man mehrere Umgebungen, z.B. Test, Integration und Produktion, und es soll jeweils so konfiguriert werden, dass die Services auf demselben Host aufgerufen werden. Der offensichtliche Weg wäre, als Adresse einfach „localhost“ zu verwenden. Das bringt allerdings ein paar Probleme mit sich, etwa dass man dann aus der Entwicklungsumgebung heraus nicht testen kann oder, dass es nicht funktioniert, weil der Weblogic gar nicht auf dem Loopback-Interface „lauscht“.

Eine Möglichkeit zur Lösung des Problems ist, jeweils dynamisch die Endpunkt-Adresse zu setzen, basierend auf der im Weblogic hinterlegten Listen Address. Dies passiert, nachdem man den Port des Webservices geholt hat, jedoch bevor man den Call auf dem Port ausführt. Die „DefaultURL“ des lokalen WLS bekommt man aus einem MBean. Sobald man diese hat, setzt man auf dem Port die entsprechende Property für die Endpoint Adresse.

Ein Beispiel für eine entsprechende Java-Methode:

[sourcecode language=“java“]
private void setEndpointAddressToLocal(MeinService_ptt port) throws Exception {
// Obtain local listen address
ObjectName service = new ObjectName(
„com.bea:Name=RuntimeService,Type=weblogic.management.mbeanservers.runtime.RuntimeServiceMBean“);

InitialContext ctx = new InitialContext();
MBeanServer mBeanServer = (MBeanServer) ctx.lookup(„java:comp/env/jmx/runtime“);

ObjectName rt = (ObjectName) mBeanServer.getAttribute(service, „ServerRuntime“);
String defaultUrl = (String) mBeanServer.getAttribute(rt, „DefaultURL“);
String newAddress = defaultUrl.replaceAll(„t3://“, „http://“);
newAddress += „/soa-infra/services/default/MeinServiceComposite/MeinService“;

log.info(„Setting endpoint address to “ + newAddress);

// Set new address
BindingProvider bp = (BindingProvider)port;
Map context = bp.getRequestContext();
context.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, newAddress);
}
[/sourcecode]

Vielen Dank an folgende Quellen, die bei der Lösungssuche sehr hilfreich waren:

Schreibe einen Kommentar