欢迎使用普元产品知识库,本知识库包含普元应用开发平台EOSPlatform,流程平台BPS,企业服务总线ESB,微服务平台Microservice,运维管理平台Devops,数据集成平台DI

页面树结构

欢迎使用普元文档库

Skip to end of metadata
Go to start of metadata

在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}}
         上述红色字体部分是对消息包进行修改的代码。
    在对上述操作完成之后,在第二个服务调用时就能够正常调用。
    这里需要注意另外一点,即后续所有服务调用时,都需要做上述的操作才行,否则,还是会出现服务调用异常。

  • 无标签