我有一个客户端连接到Web服务以获取一些信息。我有一个要求,我必须使用不同的端口将相同的信息发送到多个服务。为了在不修改客户端代码的情况下解决这个问题,我发现了MULE ESB,它应该完全符合我的需要。
我找到了一个指南,我可以使用MULE ESB和一个端口将一个客户端连接到一个服务,但我找不到链接服务的方法,所以他们都听一个端口但是自己有不同。
这应该是这样的:
更新:
这是我当前的Mule Applications配置:
<mule xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:spring="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="CE-3.2.1" xsi:schemaLocation="
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd ">
<flow name="flows1Flow1" doc:name="flows1Flow1">
<http:inbound-endpoint exchange-pattern="request-response" address="http://localhost:4433/miniwebservice" mimeType="text/xml" doc:name="HTTP"/>
<http:outbound-endpoint exchange-pattern="request-response" address="http://localhost:4434/miniwebservice?wsdl" mimeType="text/xml" doc:name="HTTP"/>
</flow>
</mule>
这是WebService:
客户:
package miniwebservice;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
public class TestWsClient
{
public static void main( final String[] args ) throws Throwable
{
String url = ( args.length > 0 ) ? args[0] : "http://localhost:4434/miniwebservice";
Service service = Service.create(
new URL( url + "?wsdl" ),
new QName( "http://miniwebservice/", "HalloWeltImplService" ) );
HalloWelt halloWelt = service.getPort( HalloWelt.class );
System.out.println( "\n" + halloWelt.hallo( args.length > 1 ? args[1] : "" ) );
}
}
服务器:
package miniwebservice;
import javax.xml.ws.Endpoint;
public class TestWsServer
{
public static void main( final String[] args )
{
String url = ( args.length > 0 ) ? args[0] : "http://localhost:4434/miniwebservice";
Endpoint.publish( url, new HalloWeltImpl() );
}
}
InterfaceImpl:
package miniwebservice;
import javax.jws.WebService;
@WebService( endpointInterface="miniwebservice.HalloWelt" )
public class HalloWeltImpl implements HalloWelt
{
public String hallo( String wer )
{
return "Hallo " + wer;
}
}
界面:
package miniwebservice;
import javax.jws.*;
@WebService
public interface HalloWelt
{
public String hallo( @WebParam( name = "wer" ) String wer );
}
如果我启动服务器和Mule应用程序并尝试访问http://localhost:4434/miniwebservice?wsdl ower http://localhost:4433/miniwebservice我在浏览器中获得了以下异常(FireFox 8.0):
由于异常而无法创建SOAP消息:XML reader错误:javax.xml.stream.XMLStreamException:[row,col]处的ParseError:[1,1] 消息:prolog中不允许使用内容。
我刚开始和骡子一起工作,所以我觉得这样做是为了让重定向骡子到服务部来获得wsdl,但它看起来有点复杂。
答案 0 :(得分:1)
免责声明:
由于您要将HTTP GET请求转发到?wsdl处理器并将HTTP POST SOAP请求转发给Web服务,因此您需要自己处理目标HTTP方法并请求URI传播:
<flow name="flows1Flow1">
<http:inbound-endpoint exchange-pattern="request-response"
address="http://localhost:4433/miniwebservice" />
<message-properties-transformer scope="outbound">
<add-message-property key="http.method" value="#[header:INBOUND:http.method]" />
</message-properties-transformer>
<logger level="INFO" category="ddo" />
<http:outbound-endpoint exchange-pattern="request-response"
address="http://localhost:4434#[header:INBOUND:http.request]" />
</flow>
(使用TestWsClient和TestWsServer测试和验证)