2010-01-21 8 views
3

J'ai créé un routeur personnalisé avec un point de terminaison. Le routeur personnalisé recherche la destination du point de terminaison en fonction des paramètres d'URL de l'URL entrante. J'en ai un exemple et je le mets à l'essai dans un navigateur. J'essaie de résoudre une dernière chose avec ça. Lorsque je fais l'appel dans le navigateur en utilisant http://localhost:8787/my-site, l'appel effectue une redirection et l'URL dans le navigateur passe à http://server2.xyz.com:8080/my-site. Je ne veux pas que l'utilisateur voie jamais http://server2.xyz.com:8080/my-site. Je veux que l'utilisateur voie toujours http://localhost:8787/my-site. Comment puis-je atteindre cet objectif? J'utilise l'édition de la communauté Mule 2.2.1 avec Java 1.6.Comment conserver l'hôte entrant avec un routeur ESB personnalisé Mule

Voici mon fichier de configuration Mule:

<?xml version="1.0" encoding="UTF-8"?> 
<mule xmlns="http://www.mulesource.org/schema/mule/core/2.2" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:spring="http://www.springframework.org/schema/beans" 
    xmlns:http="http://www.mulesource.org/schema/mule/http/2.2" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
     http://www.mulesource.org/schema/mule/core/2.2 http://www.mulesource.org/schema/mule/core/2.2/mule.xsd 
     http://www.mulesource.org/schema/mule/http/2.2 http://www.mulesource.org/schema/mule/http/2.2/mule-http.xsd"> 

    <model name="ProxyService"> 
     <service name="HttpProxyService"> 
      <inbound> 
       <http:inbound-endpoint address="http://localhost:8787" synchronous="true"/> 
      </inbound> 
      <outbound> 
       <custom-outbound-router class="com.abc.xyz.routing.LookupOutboundRouter"> 
        <outbound-endpoint name="custom" address="http://nonexistant.server.com:8080" synchronous="true"/> 
       </custom-outbound-router> 
      </outbound> 
     </service> 
    </model> 
</mule> 

Voici mon routeur personnalisé:

public class LookupOutboundRouter extends AbstractOutboundRouter { 
Logger logger = Logger.getLogger(LookupOutboundRouter.class); 

@Override 
public boolean isMatch(MuleMessage message) throws MessagingException { 
    return true; 
} 

@Override 
public MuleMessage route(MuleMessage message, MuleSession session) throws MessagingException { 
    String[] urlValues = StringUtils.split(message.getProperty("http.request").toString(), "/"); 

    String newUri = lookupServiceUri(urlValues[0]) + urlValues[1]; 
    logger.info("newUri=" + newUri); 

    DynamicURIOutboundEndpoint ep; 

    try { 
    ep = new DynamicURIOutboundEndpoint((OutboundEndpoint) getEndpoints().get(0), new MuleEndpointURI(newUri)); 

    MuleMessage message2 = send(session, message, ep); 

    return message2; 
    } catch (EndpointException e1) { 
    e1.printStackTrace(); 
    } catch (MuleException e) { 
    e.printStackTrace(); 
    } 

    return null; 
} 

/** 
    * This will call the service registry. 
    * @param id 
    * @return 
    */ 
private String lookupServiceUri(String id) { 
    if(id.equalsIgnoreCase("12345")) { 
    return "http://server.xyz.com:8080/"; 
    } else { 
    return "http://server2.xyz.com:8080/"; 
    } 
} 
} 

Répondre

1

j'ai pu réaliser dans le navigateur en mettant followRedirects true sur le connecteur HTTP. Le seul problème avec ceci maintenant est que cela ne fonctionne pas pour les redirections POST. Je fais maintenant un appel SOAP de SoapUI au lieu d'utiliser le navigateur.

Entity enclosing requests cannot be redirected without user intervention 

Message    : Failed to route event via endpoint: [email protected] Message payload is of type: PostMethod 
Type     : org.mule.api.transport.DispatchException 
Code     : MULE_ERROR-42999 
Payload    : [email protected] 
JavaDoc    : http://www.mulesource.org/docs/site/current2/apidocs/org/mule/api/transport/DispatchException.html