Java WebService-Client: Endpunkt-URL dynamisch setzen basierend auf der Adresse des WLS Managed Servers

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:

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

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

Dieser Beitrag wurde unter Software Engineering abgelegt und mit , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s