# 消息构建
ESB中传递特定格式的消息,把各种协议各异的数据转换为统一的消息格式,消息构建即是通过消息构建API创建ESB可以传递的消息。
# 消息结构
ESB中传递的消息接口为com.primeton.esb.message.ITipMessagePayload,其包含四个部分:
- ProtocolHeader:消息的协议头
- MessageHeader:消息头
- SystemHeader:系统头
- MessagePayload:消息负载
根据不同协议,四个部分放置不同的数据,下面以Http、Soap、JMS为例分别说明:
协议 | ProtocolHeader | MessageHeader | SystemHeader | MessagePayload |
---|---|---|---|---|
Http | Http协议头 Content-Type:text/html;charset=UTF-8 Host:192.168.10.10 | N/A | 消息请求类型(应答消息,业务消息) 动态路由信息(用户动态配置的IP+Port) 消息传递方向(请求回复,单向消息) | Http协议消息体,类型为字符串 |
Soap | 同Http协议头 | Soap信封的头(SoapHeader) 类型为javax.xml.soap.SOAPHeader | 同Http | Soap信封中的body体(SoapBody) 类型为javax.xml.soap.SOAPBody |
JMS | N/A | JMS协议消息属性和头 | 同Http | JMS协议消息体 |
# 消息构建
如果用户需要在中介服务中创建新的消息或是基于原有消息构建新消息,使用如下API:
public void buildeHttpMessage() {
//使用messagePayload构建TipMessageBuilder
//messagePayload为Object类型
TipMessageBuilder mBuilder = TipMessageBuilder.withPayload(messagePayload);
//放置系统头
//systemHeader为HashMap类型
mBuilder.copySystemHeaders(systemHeader);
//设置消息头
//messageHeader为Object类型
mBuilder.setMessageHeaders(messageHeader);
//设置协议头
//protocolHeaders为Object类型
mBuilder.setProtocolHeaders(protocolHeaders);
//构建出ITipMessagePayload
ITipMessagePayload message=mBuilder.build();
}
使用原有消息构建新消息
public void buildeMessage(ITipMessagePayload inMessage) {
//使用messagePayload构建TipMessageBuilder
TipMessageBuilder mBuilder = TipMessageBuilder.withPayload(inMessage.getMessagePayload());
//放置系统头
mBuilder.copySystemHeaders(inMessage.getSystemHeaders());
//设置消息头
mBuilder.setMessageHeaders(inMessage.getMessageHeaders());
//设置协议头
mBuilder.setProtocolHeaders(inMessage.getProtocolHeaders());
//构建出ITipMessagePayload
ITipMessagePayload message=mBuilder.build();
}
使用字符串构建Http消息
public void buildeMessage() {
//设置Http消息内容
String message = "<html><header><title>测试Http构建</title></header><body>http消息构建</body></html>";
//设置http协议头
Map protocolHeader = new HashMap();
protocolHeader.put("Content-Type", "text/html;charset=UTF-8");
protocolHeader.put("Host", "192.168.10.10");
//设置系统头中的动态路由,目标服务设置为192.168.10.12:9090/test/pp
Map systemHeader = new HashMap();
HttpDynamicEndpointRef dyEndpoint=new HttpDynamicEndpointRef();
dyEndpoint.setIp("192.168.10.12");
dyEndpoint.setPort("9090");
dyEndpoint.setUriPattern("/test/pp");
systemHeader.put(ITipMessagePayload.DYNAMIC_ENDPOINT_REFERENCE, dyEndpoint);
TipMessageBuilder mBuilder = TipMessageBuilder.withPayload(message);
mBuilder.copySystemHeaders(systemHeader);
mBuilder.setMessageHeaders(null);
mBuilder.setProtocolHeaders(protocolHeader);
ITipMessagePayload newMessage=mBuilder.build();
}
使用字符串构建Soap消息
public void buildeSaopMessage() {
//soap格式的消息
String message = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">"
+ "<soapenv:Header/>"
+ "<soapenv:Body>"
+ " <xsd:sayHi xmlns:xsd=\"http://quickstart.helloworld/xsd\">"
+ " <xsd:text>Tome</xsd:text>"
+ " </xsd:sayHi>"
+ "</soapenv:Body>"
+"</soapenv:Envelope>";
Map protocolHeader = new HashMap();
protocolHeader.put("Content-Type", "text/html;charset=UTF-8");
protocolHeader.put("Host", "192.168.10.10");
//在系统头中设置动态路由
Map systemHeader = new HashMap();
HttpDynamicEndpointRef dyEndpoint=new HttpDynamicEndpointRef();
dyEndpoint.setIp("192.168.10.12");
dyEndpoint.setPort("9090");
dyEndpoint.setUriPattern("/test/pp");
systemHeader.put(ITipMessagePayload.DYNAMIC_ENDPOINT_REFERENCE, dyEndpoint);
TipMessageBuilder mBuilder = TipMessageBuilder.withPayload(message);
mBuilder.setMessageHeaders(body);
mBuilder.copySystemHeaders(systemHeader);
mBuilder.setProtocolHeaders(protocolHeader);
ITipMessagePayload newMessage=mBuilder.build();
}
构建JMS消息
public void buildeSoapMessage() {
String requestText = "JMS message";
TipMessageBuilder builder = TipMessageBuilder.withPayload(requestText);
HashMap<String, Object> messageHeaders = new HashMap<String, Object>();
builder.setMessageHeaders(messageHeaders);
ITipMessagePayload jmsRequestMsg = builder.build();
}