Automatische Proxywahl für Mule ESB Webservices

Wenn man Services in Mule konfiguriert wird man einige benutzen, welche externe Services aufrufen. Allerdings hängt es von der Umgebung ab, ob und für welche Hosts ein Proxy Server verwendet werden muss. Um die Rekonfiguration von Mule je Umgebung zu vermeiden benutzen wir einen automatischen Proxy Connector. Da ich den ganz nett finde möchte ich Ihn Euch gerne näher bringen. Vielleicht ist er auch für Euch nutzbar

<https:connector name="autoProxy">
  <spring:property name="proxyHostname">
    <spring:bean class="org.springframework.jndi.JndiObjectFactoryBean">
      <spring:property name="jndiName" value="/jndi/config/proxyHost" />
      <spring:property name="defaultObject" value="" />
    </spring:bean>
  </spring:property>
  <spring:property name="proxyPort">
    <spring:bean class="org.springframework.jndi.JndiObjectFactoryBean">
      <spring:property name="jndiName" value="/jndi/config/proxyPort" />
      <spring:property name="defaultObject" value="0" />
    </spring:bean>
  </spring:property>
  <service-overrides dispatcherFactory="de.codecentric.mule.HttpAutoProxyMessageDispatcherFactory" />
  <https:tls-key-store path="/mule.keystore" keyPassword="changeit" storePassword="changeit"/>
  <https:tls-server path="/mule.keystore" storePassword="changeit"/>
</https:connector>

Wie man leicht sieht verwenden wir eine eigene MessageDispatcherFactory, welche die Parameter ProxyHost und ProxyPort aus JNDI ausliest und einen SSL Keystore mit dem berühmten changeit Passwort übergibt.
Diesen Connector verwendet man dann einfach über connector-ref

  <outbound-endpoint address="https://external.service/endpoint" synchronous="true" connector-ref="autoProxy">

Die Factory selbst ist supereinfach:

public class HttpAutoProxyMessageDispatcherFactory
  extends AbstractMessageDispatcherFactory {
  public MessageDispatcher create(OutboundEndpoint endpoint) throws MuleException {
    return new HttpAutoProxyMessageDispatcher(endpoint);
  }
}

Die Implementierung des HttpAutoProxyMessageDispatcher ist auch einfach, enthält hier aber zwei hardcodierte Hosts welche nicht geproxied werden sollen. Hier kann man gerne noch Verbesserungen einfließen lassen.

public class HttpAutoProxyMessageDispatcher
  extends HttpClientMessageDispatcher {
 
  private final boolean hasProxy;
  private final String proxyHost;
  private final int proxyPort;
 
  public HttpAutoProxyMessageDispatcher(OutboundEndpoint endpoint) {
    super(endpoint);
    this.proxyHost = ((HttpConnector) endpoint.getConnector()).getProxyHostname();
    this.proxyPort = ((HttpConnector) endpoint.getConnector()).getProxyPort();
    this.hasProxy = StringUtils.isNotBlank(proxyHost);
  }
 
  @Override
  protected HostConfiguration getHostConfig(URI uri) throws URISyntaxException {
    String host = uri.getHost();
    HostConfiguration config = new HostConfiguration();
    config.setHost(host, uri.getPort(), Protocol.getProtocol(uri.getScheme().toLowerCase()));
    if (hasProxy && !isLocalhost(host)) {
      config.setProxy(proxyHost, proxyPort);
    }
    return config;
  }
 
  private boolean isLocalhost(String host) {
    return "localhost".equals(host) || "127.0.0.1".equals(host);
  }
 
}

Setzt man die Konfiguration so um, muss lediglich im JNDI jeder Umgebung der Proxy eingestellt sein. Mule wird dann automatisch den Proxy verwenden falls gesetzt und die Konfiguration selbst kann unangetastet bleiben.

Update: Mule 3.2

Kürzlich erschienene Versionen von Mule erleichtern das Implementieren des HttpAutoProxyMessageDispatchers:

public class HttpAutoProxyMessageDispatcher extends
    HttpClientMessageDispatcher implements MessageDispatcher {
 
  public HttpAutoProxyMessageDispatcher(OutboundEndpoint endpoint) {
    super(endpoint);
  }
 
  @Override
  protected HostConfiguration getHostConfig(URI uri) throws Exception {
    Protocol protocol = Protocol.getProtocol(uri.getScheme().toLowerCase());
    String host = uri.getHost();
    int port = uri.getPort();
    HostConfiguration config = new HostConfiguration();
    config.setHost(host, port, protocol);
    if (!isLocalhost(host) && StringUtils.isNotBlank(connector.getProxyHostname())) {
      config.setProxy(connector.getProxyHostname(), connector.getProxyPort());
    }
    return config;
  }
 
  private boolean isLocalhost(String host) {
    return "localhost".equals(host) || "127.0.0.1".equals(host); 
  }
}
  • Facebook
  • Delicious
  • Digg
  • StumbleUpon
  • Reddit
  • Blogger
  • LinkedIn
Fabian Lange

2 Antworten auf Automatische Proxywahl für Mule ESB Webservices

  1. Chris sagt:

    Hi there… first of all thank you very much for this information!

    I am very curious about a topics kinda related to this as well. I am basically trying to figure out if by default the community open source edition of Mule allows you to create multiple headless mule servers on different cloud servers and then write a mule script which can then be deployed through those headless servers.

    I am next to positive that the enterprise version of Mule provides a web based management interface and allows for multiple servers but I don’t know if this is possible through the open source version.

    Also, are you aware of anyone who has created an open source or cheap management interface to monitor such Mule servers.

    I just can’t afford the enterprise version but would like to create a script which can be run on multiple mule servers.

    Thanks in advance!

  2. Sagnik sagt:

    Hi how to use autoproxy in mule-flow….
    can u describe with example??

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>