欢迎使用普元产品知识库,本知识库包含普元应用开发平台EOSPlatform,流程平台BPS,企业服务总线ESB,微服务平台Microservice,运维管理平台Devops,数据集成平台DI
欢迎使用普元文档库
在ESB中做服务编排时,如果之前没有接触过,则在实现该功能的时候会遇到几个方面的问题:
1、服务编排时,会根据前一个服务调用的返回结果来进行后续逻辑的处理。
在该返回结果中,因返回的信息多种多样,所以,需要注意对这些信息进行相应的处理。针对字符串的返回方式,在此不多说,这个相对简单。但如果是返回字节流,我们就需要做进一步的判断处理。在我们产品的文档中,没有任何地方提到返回的结果是字节流的时候,会遇到哪些问题,所以,在转换时,可能会出现很多意想不到的情况。
在返回的字节流中,该字节流有可能是被压缩的,也有可能没有被压缩。要判断是否压缩,需要通过相应的属性来判断该字节流是否被压缩过。判断的方式如下:
//retMsg是服务调用后返回的ITipMessagePayload对象
String contentEncoding = (String)((Map)retMsg.getProtocolHeaders()).get("Content-Encoding");
byte[] content = null;
if("gzip".equals(contentEncoding)){
//处理压缩的逻辑
content = EncodingUtil.unGZip((byte[])retMsg.getMessagePayload());
{color:#000000}}else{{color}
//处理费压缩的逻辑
{color:#000000}}
在经过上述的处理之后, content就是能够正常处理的字节数组,将其直接转换为字符串或转换为document对象进行后续的处理。
2、在调用完第一个服务之后,如果不做任何预处理就调用第二个服务,则会出现无法正常调用的情况。
在ESB中,虽然提供了针对服务编排的功能,但需要做处理才能狗实现多个服务的调用。
1、定义两个变量,保存ESB消息的头信息。
2、在开始服务调用前,将头信息保存起来。
3、在调用完第一个服务之后,需要再调用第二个服务前,修改消息头信息。
示例代码:
public ITipMessagePayload orderCommitParse(ITipMessagePayload srcPayload ,Map protoMap,Map sysheaderMap){
ITipMessagePayload outMsg = null;
String xml = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ngc=\"http://www.gmcc.net/ngcrm/\">" +
" <soapenv:Header/>" +
" <soapenv:Body>" +
" <ngc:odcommitorderreq>" +
" <ngc:msgbody>" +
" </ngc:msgbody>" +
" </ngc:odcommitorderreq>" +
" </soapenv:Body>" +
"</soapenv:Envelope>";
SAXReader saxReader = new SAXReader();
Document doc = null;
try {
doc = saxReader.read(new ByteArrayInputStream(xml.getBytes()));
// String srcSoapBody = new String((byte[])srcPayload.getMessagePayload());
Document srcDoc = saxReader.read(new ByteArrayInputStream((byte[])srcPayload.getMessagePayload()));
Node headerNode = (Node)srcDoc.selectSingleNode("//ngc:msgreqheader").clone();
Element msgBodyElement = (Element)doc.selectNodes("//soapenv:Body").get(0);
doc.selectSingleNode("//ngc:msgbody").getParent().add(headerNode);
doc.selectSingleNode("//ngc:process_code").setText("odcommitorder");
Node custInfoNode = (Node)srcDoc.selectSingleNode("//ngc:custinfo").clone();
Node payInfoListNode = (Node)srcDoc.selectSingleNode("//ngc:payinfolist").clone();
msgBodyElement.add(custInfoNode);
msgBodyElement.add(payInfoListNode);
String soapBody = doc.asXML();
TipMessageBuilder builder = TipMessageBuilder.withPayload(soapBody);
protoMap.put("Content-Length", soapBody.length());
builder.setProtocolHeaders(protoMap);
builder.copySystemHeaders(sysheaderMap);
outMsg = builder.build();
{color:#000000}}catch (DocumentException e) {{color}
e.printStackTrace();
{color:#000000}}
return outMsg;
{color:#000000}}
上述红色字体部分是对消息包进行修改的代码。
在对上述操作完成之后,在第二个服务调用时就能够正常调用。
这里需要注意另外一点,即后续所有服务调用时,都需要做上述的操作才行,否则,还是会出现服务调用异常。