本节讲述了HTTP-JMS协议转换场景的创建过程,包括创建工程、创建HTTP和JMS协议相关的服务和运行。通过本节你将了解到如下内容。

  1. 如何创建HTTP-JMS协议转换场景;
  2. 如何在Studio中测试开发的业务逻辑;

示例如附件所示:http_jms.zip (opens new window)

# 创建工程

  1. 启动APIGateway Studio。

  2. 在资源管理器中,鼠标右键选择“创建 > ESB项目”,创建ESB项目,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2018-10-10 17:56:4.png

  3. 在“新建ESB项目”界面,输入“项目名称”、“作者”,选择“ESB服务器”、“R/R数据库”等基本信息。如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2018-10-10 17:52:40.png

  4. 单击“下一步”,进入“添加项目引用库”界面,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2018-10-10 17:59:15.png

  5. 单击“完成”,系统返回ESB开发透视图,创建的项目在"资源管理器"视图中显示,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2018-10-11 10:29:42.png

# 创建公共Module

  1. 在资源管理器中,选中创建好的项目,鼠标右键选择“创建 > 公共Module”,创建公共Module,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2018-10-11 10:32:27.png

  2. 在“公共Module”对话框中,填写Module名称等信息,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2018-10-11 10:34:49.png

    公共Module相关填写项的填写规则如下。

    参数 说明
    Module名称 Module的名称。由数字、字母、下划线(_)组成。
    显示名称 Module显示名称。由数字、字母、中文、点(.)、下划线(_)组成。
    版本 由数字和点(.)组成。
  3. 单击“完成”,公共Module创建完成,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2018-10-11 10:45:18.png

# 创建HTTP Transport

  1. 在创建的ESB项目的“Transport”上,右键选择“创建 > HTTP类型Transport”,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2018-10-11 11:32:35.png

  2. 在弹出的“创建HTTP类型Transport”界面,选择当前的工程、Module,并输入文件名及显示名称,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2018-10-11 11:44:45.png

  3. 单击“完成”,HTTP Transport创建完成,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2018-10-11 11:46:43.png

  4. 在资源管理器中,双击创建的HTTP Transport,打开HTTP Transport编辑器,修改相关参数。如下所示。  3.3.5 HTTP-JMS协议转换 > image2020-7-20 14:8:42.png

  5. HTTP Transport配置完成后,单击工具栏中的图标保存。

# 创建JMS Endpoint

  1. 在创建的ESB项目的“Endpoint”上,右键选择“创建 > JMS类型Endpoint”,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2019-4-9 14:55:31.png

  2. 在弹出的“创建JMS类型Endpoint”界面,选择当前的工程、Module,并输入文件名及显示名称,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2019-4-9 14:55:52.png

  3. 单击“完成”,JMS Endpoint创建完成,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2019-4-9 14:57:11.png

  4. 在资源管理器中,双击创建的JMS Endpoint,打开JMS Endpoint编辑器,修改相关参数。如下所示。
     3.3.5 HTTP-JMS协议转换 > image2020-6-28 9:44:59.png

  5. JMS Endpoint配置完成后,单击工具栏中的图标保存。

# 创建业务Module

  1. 在资源管理器中,选中创建好的项目,鼠标右键选择“创建 > 业务Module”,创建业务Module,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2018-10-16 10:33:12.png

  2. 在“业务Module”对话框中,填写Module名称等信息,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2018-10-16 10:35:7.png

    业务Module相关填写项的填写规则如下。

    参数 说明
    Module名称 Module的名称。由数字、字母、下划线(_)组成。
    显示名称 Module显示名称。由数字、字母、中文、点(.)、下划线(_)组成。
    版本 由数字和点(.)组成。
  3. 单击“完成”,业务Module创建完成,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2018-10-16 15:28:7.png

# 创建JMS业务服务

  1. 在资源管理器中,在新建的业务Module“com.primeton.esb.project.restaurant”的“业务服务”上,鼠标右键选择“创建 > JMS业务服务”,创建JMS业务服务,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2019-4-9 15:2:4.png

  2. 在打开的“创建JMS业务服务”对话框中,输入类别信息,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2019-4-9 15:3:19.png

  3. 单击“完成”,在打开的“JMS业务服务”的编辑界面中,编辑生成的JMS业务服务的文件。选择刚刚创建的JMS Endpoint,填写队列名为“queue1”,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2019-4-9 15:5:3.png

  4. 单击工具栏的保存,完成JMS业务服务的创建。

# 创建Java方法

  1. 在资源管理器中,右键单击业务Module中的Java,选择“创建 > 类”,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2019-4-9 15:9:59.png

  2. 在弹出的"新建Java类"向导中输入相应信息后,点击"完成"按钮即可,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2019-4-9 15:22:4.png

  3. 完整的“ConvertProtocol”类代码如下所示。

    package com.primeton.esb.httpToJms.httpToJms;
     
    import java.util.HashMap;
     
    import com.primeton.esb.message.ITipMessagePayload;
    import com.primeton.esb.message.MessageConstants;
    import com.primeton.esb.message.TipMessageBuilder;
     
    public class ConvertProtocol {
        private static String httpReplyText ="<soapenv:Envelope xmlns:soapenv=\"http://www.w3.org/2003/05/soap-envelope\">"
                +"<soapenv:Body>"
                +"    <ns:sayHiResponse xmlns:ns=\"http://quickstart.helloworld/xsd\">"
                    +"      <ns:return>Hello Primeton APIGateway!</ns:return>"
                    +"    </ns:sayHiResponse>"
                    +" </soapenv:Body>"
                    +"</soapenv:Envelope>";
     
          /**
           * 根据HTTP请求消息构建JMS消息的消息体
           *
           * @param httpRequestMsg
           * @return
           * @throws Exception
           */
          public static ITipMessagePayload doHttpToJms(
                           ITipMessagePayload httpRequestMsg) throws Exception {
     
                  String requestText = (String) httpRequestMsg.getMessagePayload();
                  //根据messagePayload构建TipMessageBuilder
                  TipMessageBuilder builder = TipMessageBuilder.withPayload(requestText);
                  //定义消息头
                  HashMap<String, Object> messageHeaders = new HashMap<String, Object>();
                  //设置系统头-消息传递方向为单向消息
                  builder.setSystemHeader(MessageConstants.MESSAGE_INVOKE_TYPE,
                                    MessageConstants.ONE_WAY);
                  //设置消息头
                  builder.setMessageHeaders(messageHeaders);
                  //构建出JMS请求消息
                  return  builder.build();
          }
     
          /**
           * 自定义返回HTTP响应消息
           *
           * @param httpRequestMsg
           * @return
           * @throws Exception
           */
          public static ITipMessagePayload createHttpReply(ITipMessagePayload httpRequestMsg)
                           throws Exception {
                  String replyText = httpReplyText;
                  //根据messagePayload构建TipMessageBuilder
                  TipMessageBuilder builder = TipMessageBuilder.withPayload(replyText);
                  //根据HTTP请求消息得到系统头
                  builder.copySystemHeaders(httpRequestMsg.getSystemHeaders());
                  //根据HTTP请求消息得到协议头
                  builder.setProtocolHeaders(httpRequestMsg.getProtocolHeaders());
                  //构建出HTTP响应消息
                  return builder.build();
          }
     
    }
    
  4. 同样的方法创建类“SimpleConsumer”和类“TestClient”,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2019-4-9 15:26:30.png
     3.3.5 HTTP-JMS协议转换 > image2019-4-9 15:29:13.png

  5. 完整的“SimpleConsumer”类和“TestClient”类代码如下所示。

    package com.primeton.esb.httpClient;
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    public class TestClient {
    	public static void main(String[] args) throws FileNotFoundException, IOException {
    		//请求URL地址:httpTransport上的ip端口+代理服务上配的Uri
    	//	String urlString = "http://127.0.0.1:9090/RequestInfo"; //Http穿透服务
    		
    	String urlString = "http://127.0.0.1:9091/HttpToJms"; //HttpToJms中介服务
    
    //		String urlString = "http://127.0.0.1:8088/servletdemo/servlet/jsonCustServlet";//HTTP+JSON的Servlet
    //		String urlString = "http://192.168.10.78:9090/com.primeton.esb.provider.custsystem.custJsonService";//HTTP+JSON服务
    //		String urlString = "http://192.168.10.78:9090/com.primeton.esb.provider.custsystem.CustMgrService?wsdl";//HTTP+SOAP服务
    		
    		//请求消息所在文件
            String requestFile  = "http.txt";//Test Http To Jms,当测试HTTP+JSON的Servlet时,内容为:{"custid":1}
    //		String requestFile  = "soap.xml";//HTTP+SOAP服务
            
            URL url = new URL(urlString);
            HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
            File fileToSend=new File(requestFile);
            byte[] buf=new byte[(int)fileToSend.length()];
            new FileInputStream(requestFile).read(buf);
                 
            httpConn.setRequestProperty("Content-Length",String.valueOf( buf.length ) );
            
            httpConn.setRequestProperty("Content-Type","text/plain; charset=utf-8");  
    //        httpConn.setRequestProperty("Content-Type","text/xml; charset=utf-8"); //HTTP+SOAP服务 
                   
    //		httpConn.setRequestProperty("ClientId","com.primeton.esb.consumer.custclient");//SAM中“服务消费者域”中“调用客户系统”的应用编码
    //		httpConn.setRequestProperty("OperationCode","com.primeton.esb.provider.custsystem.CustMgrService.getCustByID");//SAM中HTTP+SOAP服务的getCustByID操作编码
    //		httpConn.setRequestProperty("OperationCode","com.primeton.esb.provider.custsystem.custJsonService.getCust");//SAM中HTTP+JSON服务的getCust操作编码      
            
            httpConn.setRequestMethod( "POST" );
            httpConn.setDoOutput(true);
            httpConn.setDoInput(true);
            
            OutputStream out = httpConn.getOutputStream();
            out.write( buf );
            out.close();
                   
            InputStreamReader isr = new InputStreamReader(httpConn.getInputStream(),"utf-8");      
            BufferedReader in = new BufferedReader(isr);       
            String inputLine;
            StringBuffer sb =new StringBuffer();
            while ((inputLine = in.readLine()) != null){
            	sb.append(inputLine);
            }
            in.close();
            System.out.println(sb.toString());
    	}	
    }
    
  6. Java方法创建完成如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2019-4-9 15:33:13.png

# 创建中介服务

  1. 在资源管理器中,在新建的业务Module“com.primeton.esb.project.restaurant”的“中介服务”上,鼠标右键选择“创建 > 中介服务”,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2019-4-9 15:34:37.png

  2. 在打开的“创建WS代理服务”对话框中,输入类别信息,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2019-4-9 15:36:47.png

  3. 单击“完成”,生成中介服务,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2019-4-9 15:45:55.png

  4. 在"中介服务"编辑页面单击“服务编排”链接,进入编排中介服务的界面。在"选用板"中将"JAVA方法"和"JAVA业务服务"图元拖拽到右边的编辑区,并用"连接线"依次连接,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2019-4-9 16:17:20.png

  5. 双击编辑区中的"http_jms"JAVA方法图元,在"JAVA方法属性设置"窗口中,单击"浏览...",弹出"选择java方法"窗口,在"选择要打开的类型的输入框中输入类名"ConvertProtocol",在"匹配的类型"中选中ConvertProtocol,单击“下一步”再选中doHttpToJms方法,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2019-4-9 15:50:20.png
     3.3.5 HTTP-JMS协议转换 > image2019-4-9 15:50:49.png

  6. 在"JAVA方法属性设置"中设置"参数配置表",如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2019-4-9 16:19:54.png

  7. 双击编辑区中的"JMS业务服务"图元,弹出JMS业务服务的"设置对话框",单击"浏览...",如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2019-4-9 16:4:59.png

  8. 在弹出的"请选择JMS业务服务"窗口中,选择对应的JMS业务服务,单击“确定”,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2019-4-9 16:7:29.png

  9. 在"设置对话框"中设置"参数配置表",单击“确定”,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2019-4-11 17:15:41.png

  10. 双击编辑区中的"http_http"JAVA方法图元,在"JAVA方法属性设置"窗口中,单击"浏览...",弹出"选择java方法"窗口,在"选择要打开的类型的输入框中输入类名"ConvertProtocol",在"匹配的类型"中选中ConvertProtocol,单击“下一步”再选中createHttpReply方法,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2019-4-9 16:14:33.png
     3.3.5 HTTP-JMS协议转换 > image2019-4-9 16:15:0.png

  11. 设置"参数配置表",单击"确定",如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2019-4-9 16:21:33.png

  12. 中介服务创建完成,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2019-4-9 16:23:17.png

# 创建HTTP代理服务

  1. 在资源管理器中,在新建的业务Module“com.primeton.esb.project.restaurant”的“代理服务”上,鼠标右键选择“创建 > HTTP代理服务”,创建HTTP代理服务,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2019-4-9 16:28:5.png

  2. 在打开的“创建HTTP代理服务”对话框中,输入类别信息,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2019-4-9 16:28:44.png

  3. 单击“完成”,在HTTP代理服务的编辑界面中,需要输入"URI"并设置引用的中介服务,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2019-4-9 16:32:33.png

  4. 单击工具栏的保存,完成HTTP代理服务的创建。

# 创建文件

  1. 在资源管理器中,选中创建好的项目,鼠标右键选择“创建 >文件”,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2019-4-9 16:40:13.png

  2. 在“新建文件”对话框中,填写文件名,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2019-4-9 16:42:19.png

  3. 单击“完成”。

  4. 在“http.txt”文件中输入文本消息“Test Http To Jms”,作为HTTP的请求消息。

# 启动和测试

  1. 在业务 Module(com.primeton.esb.project.restaurant)中点击“Java > com.primeton.esb.httpClient > TestClient,将 main 方法中 urlString 的值改为该示例中 HTTP 代理服务的 URL,修改如下所示。

  2. 启动APIGateway ESBServer,如下图所示。
     3.3.5 HTTP-JMS协议转换 > image2019-4-9 16:46:33.png

  3. 右键单击 TestClient.java 的空白处,在弹出来的菜单中选择“运行方式 > Java 应用程序”,运行该类的 main 方法后将返回信息打印在控制台中,如下所示。

    <soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">> <ns:sayHiResponse xmlns:ns="http://quickstart.helloworld/xsd"> <ns:return>Hello Primeton APIGateway!</ns:return> </ns:sayHiResponse> </soapenv:Body></soapenv:Envelope>
    

    返回的信息就是在“ConvertProtocol.java”中定义的“httpReplyText”响应消息内容,说明HTTP代理服务调用成功。

  4. 打开业务Module(com.primeton.esb.project.restaurant)中java类“SimpleConsumer.java”,执行main方法后,控制台打印信息如下所示。