背景
毕业课题是做某种通信框架和ESB总线的集成,其中ESB的选型是ServiceMix,它的路由机制是借助Camel实现的。Camel提供了RouteBuilder抽象类,只要在其configure方法中,以from、to等方法描述路由,然后通过CamelContext的addRoute方法,就能将路由插入到Camel中。
现在想实现,对外发布一个WebService,用户调用该服务后,总线内部将SOAP消息,转换为自定义协议的报文,然后发送出去。
简单实现
Camel路由中,有一个process方法,可传入一个处理器,对消息进行处理,由于是做SOAP消息的转换,所以在Camel-cxf的基础上试验,路由代码类似:
CxfEndpoint from = new CxfEndpoint();
from.setDataFormat(DataFormat.RAW);
from.setCamelContext(getContext());
from.setAddress(address);
from.setServiceName(new QName(ns,service));
from.setPortName(new QName(ns,port));
from.setWsdlURL(wsdlUrl);
from(from).convertBodyTo(String.class).process(new MyProtocolProcessor());
MyProtocolProcessor负责SOAP消息的处理,这里以将消息打印到标准输出为例:
public class MyProtocolProcessor implements Processor {
@Override
public void process(Exchange exchange) throws Exception {
System.out.println(exchange.getIn().getBody().toString());
}
}
也可以在构造Processor时初始化自定义协议的客户端,然后在process方法调用客户端完成消息发送。代码运行后控制台输出如下:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:hnu="省略">
<soapenv:Header/>
<soapenv:Body>
// 省略
</soapenv:Body>
</soapenv:Envelope>