كيفية الحفاظ على المضيف الوارد مع جهاز توجيه مخصص بغل ESB
سؤال
لقد قمت بإنشاء جهاز توجيه مخصص بنقطة نهاية واحدة. يبحث جهاز التوجيه المخصص عن وجهة نقطة النهاية استنادًا إلى معلمات URL لعنوان URL الوارد. لدي مثال على هذا الأمر ، وأنا أختبره في متصفح. أحاول حل شيء أخير بهذا. عندما أقوم بإجراء المكالمة في المتصفح باستخدام http: // localhost: 8787/my-site, ، تقوم المكالمة بإعادة توجيه ويتغير عنوان URL في المتصفح http://server2.xyz.com:8080/my-site. لا أريد أن يرى المستخدم من أي وقت مضى http://server2.xyz.com:8080/my-site. أريد أن يرى المستخدم دائمًا http: // localhost: 8787/my-site. كيف يمكنني تحقيق ذلك؟ أنا أستخدم Mule 2.2.1 Community Edition مع Java 1.6.
هنا ملف تكوين البغل الخاص بي:
<?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>
ها هو جهاز التوجيه المخصص الخاص بي:
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/";
}
}
}
المحلول
لقد تمكنت من تحقيق ذلك في المتصفح عن طريق تعيين متابعين إلى صواب على موصل HTTP. المشكلة الوحيدة في هذا الآن هي أنها لا تعمل مع إعادة توجيه النشر. أقوم بإجراء مكالمة صابون من Soapui الآن بدلاً من استخدام المتصفح.
Entity enclosing requests cannot be redirected without user intervention
Message : Failed to route event via endpoint: org.mule.endpoint.DynamicURIOutboundEndpoint@fd285ee0. Message payload is of type: PostMethod
Type : org.mule.api.transport.DispatchException
Code : MULE_ERROR-42999
Payload : org.apache.commons.httpclient.methods.PostMethod@9fa8f
JavaDoc : http://www.mulesource.org/docs/site/current2/apidocs/org/mule/api/transport/DispatchException.html