Automatische Proxywahl für Mule ESB Webservices
29.3.2010 | 2 Minuten Lesezeit
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
1<https:connector name="autoProxy"> 2 <spring:property name="proxyHostname"> 3 <spring:bean class="org.springframework.jndi.JndiObjectFactoryBean"> 4 <spring:property name="jndiName" value="/jndi/config/proxyHost" /> 5 <spring:property name="defaultObject" value="" /> 6 </spring:bean> 7 </spring:property> 8 <spring:property name="proxyPort"> 9 <spring:bean class="org.springframework.jndi.JndiObjectFactoryBean"> 10 <spring:property name="jndiName" value="/jndi/config/proxyPort" /> 11 <spring:property name="defaultObject" value="0" /> 12 </spring:bean> 13 </spring:property> 14 <service-overrides dispatcherFactory="de.codecentric.mule.HttpAutoProxyMessageDispatcherFactory" /> 15 <https:tls-key-store path="/mule.keystore" keyPassword="changeit" storePassword="changeit"/> 16 <https:tls-server path="/mule.keystore" storePassword="changeit"/> 17</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
1<outbound-endpoint address="https://external.service/endpoint" synchronous="true" connector-ref="autoProxy">
Die Factory selbst ist supereinfach:
1public class HttpAutoProxyMessageDispatcherFactory
2 extends AbstractMessageDispatcherFactory {
3 public MessageDispatcher create(OutboundEndpoint endpoint) throws MuleException {
4 return new HttpAutoProxyMessageDispatcher(endpoint);
5 }
6}
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.
1public class HttpAutoProxyMessageDispatcher
2 extends HttpClientMessageDispatcher {
3
4 private final boolean hasProxy;
5 private final String proxyHost;
6 private final int proxyPort;
7
8 public HttpAutoProxyMessageDispatcher(OutboundEndpoint endpoint) {
9 super(endpoint);
10 this.proxyHost = ((HttpConnector) endpoint.getConnector()).getProxyHostname();
11 this.proxyPort = ((HttpConnector) endpoint.getConnector()).getProxyPort();
12 this.hasProxy = StringUtils.isNotBlank(proxyHost);
13 }
14
15 @Override
16 protected HostConfiguration getHostConfig(URI uri) throws URISyntaxException {
17 String host = uri.getHost();
18 HostConfiguration config = new HostConfiguration();
19 config.setHost(host, uri.getPort(), Protocol.getProtocol(uri.getScheme().toLowerCase()));
20 if (hasProxy && !isLocalhost(host)) {
21 config.setProxy(proxyHost, proxyPort);
22 }
23 return config;
24 }
25
26 private boolean isLocalhost(String host) {
27 return "localhost".equals(host) || "127.0.0.1".equals(host);
28 }
29
30}
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:
1public class HttpAutoProxyMessageDispatcher extends
2 HttpClientMessageDispatcher implements MessageDispatcher {
3
4 public HttpAutoProxyMessageDispatcher(OutboundEndpoint endpoint) {
5 super(endpoint);
6 }
7
8 @Override
9 protected HostConfiguration getHostConfig(URI uri) throws Exception {
10 Protocol protocol = Protocol.getProtocol(uri.getScheme().toLowerCase());
11 String host = uri.getHost();
12 int port = uri.getPort();
13 HostConfiguration config = new HostConfiguration();
14 config.setHost(host, port, protocol);
15 if (!isLocalhost(host) && StringUtils.isNotBlank(connector.getProxyHostname())) {
16 config.setProxy(connector.getProxyHostname(), connector.getProxyPort());
17 }
18 return config;
19 }
20
21 private boolean isLocalhost(String host) {
22 return "localhost".equals(host) || "127.0.0.1".equals(host);
23 }
24}
Weitere Beiträge
von Fabian Lange
Dein Job bei codecentric?
Jobs
Agile Developer und Consultant (w/d/m)
Alle Standorte
Weitere Artikel in diesem Themenbereich
Entdecke spannende weiterführende Themen und lass dich von der codecentric Welt inspirieren.
Gemeinsam bessere Projekte umsetzen.
Wir helfen deinem Unternehmen.
Du stehst vor einer großen IT-Herausforderung? Wir sorgen für eine maßgeschneiderte Unterstützung. Informiere dich jetzt.
Hilf uns, noch besser zu werden.
Wir sind immer auf der Suche nach neuen Talenten. Auch für dich ist die passende Stelle dabei.
Blog-Autor*in
Fabian Lange
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.