ESB文档库 ESB文档库
00 概述
01 产品安装指南
02 快速入门指南
03 ESB Studio使用指南
04 企业服务总线使用指南
05 高级配置指南
06 接口服务说明
07 升级&数据迁移指南
08 FAQ
  • 创建工程
  • 创建公共Module
  • 创建HTTP Transport
  • 创建JMS Endpoint
  • 创建业务Module
  • 创建JMS业务服务
  • 创建Java方法
  • 创建中介服务
  • 创建HTTP代理服务
  • 创建文件
  • 启动和测试

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

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

示例如附件所示:http_jms.zip

# 创建工程

  1. 启动ESB Studio。

  2. 在资源管理器中,鼠标右键选择“创建 > ESB项目”,创建ESB项目,如下图所示。

    说明

  • ESB 服务器:运行 Module 时使用的 ESB Server。通过首选项进行 ESB Server 的增加、删除等。
  • R/R 数据库:用于存储 Module 的资源数据库。该配置必须与所选 ESB Server 的数据库配置保持一致。缺省配置下,ESB Server和R/R数据库均连接 Studio 安装时配置的数据库。
  1. 在“新建ESB项目”界面,输入“项目名称”、“作者”,选择“ESB服务器”、“R/R数据库”等基本信息。如下图所示。

  2. 单击“下一步”,进入“添加项目引用库”界面,如下图所示。

    说明

  • 可以添加系统引用库、外部引用库和内部引用库。
  1. 单击“完成”,系统返回ESB开发透视图,创建的项目在"资源管理器"视图中显示,如下图所示。

# 创建公共Module

  1. 在资源管理器中,选中创建好的项目,鼠标右键选择“创建 > 公共Module”,创建公共Module,如下图所示。

  2. 在“公共Module”对话框中,填写Module名称等信息,如下图所示。

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

    参数 说明
    Module名称 Module的名称。由数字、字母、下划线(_)组成。
    显示名称 Module显示名称。由数字、字母、中文、点(.)、下划线(_)组成。
    版本 由数字和点(.)组成。
  3. 单击“完成”,公共Module创建完成,如下图所示。

# 创建HTTP Transport

  1. 在创建的ESB项目的“Transport”上,右键选择“创建 > HTTP类型Transport”,如下图所示。

  2. 在弹出的“创建HTTP类型Transport”界面,选择当前的工程、Module,并输入文件名及显示名称,如下图所示。

  3. 单击“完成”,HTTP Transport创建完成,如下图所示。

  4. 在资源管理器中,双击创建的HTTP Transport,打开HTTP Transport编辑器,修改相关参数。如下所示。

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

# 创建JMS Endpoint

  1. 在创建的ESB项目的“Endpoint”上,右键选择“创建 > JMS类型Endpoint”,如下图所示。

  2. 在弹出的“创建JMS类型Endpoint”界面,选择当前的工程、Module,并输入文件名及显示名称,如下图所示。

  3. 单击“完成”,JMS Endpoint创建完成,如下图所示。

  4. 在资源管理器中,双击创建的JMS Endpoint,打开JMS Endpoint编辑器,修改相关参数。如下所示。

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

# 创建业务Module

  1. 在资源管理器中,选中创建好的项目,鼠标右键选择“创建 > 业务Module”,创建业务Module,如下图所示。

  2. 在“业务Module”对话框中,填写Module名称等信息,如下图所示。

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

    参数 说明
    Module名称 Module的名称。由数字、字母、下划线(_)组成。
    显示名称 Module显示名称。由数字、字母、中文、点(.)、下划线(_)组成。
    版本 由数字和点(.)组成。
  3. 单击“完成”,业务Module创建完成,如下图所示。

# 创建JMS业务服务

  1. 在资源管理器中,在新建的业务Module“com.primeton.esb.project.restaurant”的“业务服务”上,鼠标右键选择“创建 > JMS业务服务”,创建JMS业务服务,如下图所示。

  2. 在打开的“创建JMS业务服务”对话框中,输入类别信息,如下图所示。

  3. 单击“完成”,在打开的“JMS业务服务”的编辑界面中,编辑生成的JMS业务服务的文件。选择刚刚创建的JMS Endpoint,填写队列名为“queue1”,如下图所示。

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

# 创建Java方法

  1. 在资源管理器中,右键单击业务Module中的Java,选择“创建 > 类”,如下图所示。

  2. 在弹出的"新建Java类"向导中输入相应信息后,点击"完成"按钮即可,如下图所示。

  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 ESB!</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”,如下图所示。

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

     package com.primeton.esb.consumer;
     import javax.jms.Connection;
     import javax.jms.ConnectionFactory;
     import javax.jms.Destination;
     import javax.jms.JMSException;
     import javax.jms.Message;
     import javax.jms.MessageConsumer;
     import javax.jms.Session;
     import javax.jms.TextMessage;
     import com.primeton.pmq.PMQConnectionFactory;
     
     public class SimpleConsumer {
     private String url;
     
         private String queueName;
      
         protected ConnectionFactory connectionFactory;
      
         protected Connection connection;
      
         protected Session session;
      
         protected Destination destination;
      
         protected MessageConsumer consumer;
      
         public SimpleConsumer(String url, String queueName) {
             this.url = url;
             this.queueName = queueName;
         }
      
         /**
          * 初始化
          *
          */
         public void init() {
             connectionFactory = new PMQConnectionFactory(this.url);
             try {
                  connection = connectionFactory.createConnection();
                  connection.start();
                  session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
                  destination = session.createQueue(this.queueName);
                  consumer = session.createConsumer(destination);
             } catch (JMSException e) {
                  // @REVIEW Auto-generated catch block
                  e.printStackTrace();
             }
         }
      
         /**
          * 接收消息
          *
          */
         public void receiveMessage() {
             try {
                  Message message = consumer.receive(2000);
                  if (message instanceof TextMessage) {
                       TextMessage textMessage = (TextMessage) message;
                       System.out.println("接收到消息 : " + textMessage.getText());
                  }
             } catch (JMSException e) {
                  // @REVIEW Auto-generated catch block
                  e.printStackTrace();
             }
         }
      
         /**
          * 释放资源
          *
          */
         public void close() {
             System.out.println("释放消费者的资源。");
             try {
                  if (consumer != null) {
                       consumer.close();
                       consumer = null;
                  }
                  if (session != null) {
                       session.close();
                       session = null;
                  }
                  if (connection != null) {
                       connection.close();
                       connection = null;
                  }
             } catch (JMSException e) {
                  // @REVIEW Auto-generated catch block
                  e.printStackTrace();
             }
         }
      
         /**
          * @param args
          */
         public static void main(String[] args) {
             // TODO 自动生成方法存根
             String url = "tcp://localhost:61616";
             String queueName = "queue1";//JMS穿透服务中业务服务的队列
             //String queueName = "dynamicQueue";//JmsToJms中介服务中动态设置的业务服务队列
      
             SimpleConsumer receive = new SimpleConsumer(url, queueName);
             receive.init();
             receive.receiveMessage();
             receive.close();
         }
     }
    
    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方法创建完成如下图所示。

# 创建中介服务

  1. 在资源管理器中,在新建的业务Module“com.primeton.esb.project.restaurant”的“中介服务”上,鼠标右键选择“创建 > 中介服务”,如下图所示。

  2. 在打开的“创建WS代理服务”对话框中,输入类别信息,如下图所示。

  3. 单击“完成”,生成中介服务,如下图所示。

  4. 在"中介服务"编辑页面单击“服务编排”链接,进入编排中介服务的界面。在"选用板"中将"JAVA方法"和"JAVA业务服务"图元拖拽到右边的编辑区,并用"连接线"依次连接,如下图所示。

  5. 双击编辑区中的"http_jms"JAVA方法图元,在"JAVA方法属性设置"窗口中,单击"浏览...",弹出"选择java方法"窗口,在"选择要打开的类型的输入框中输入类名"ConvertProtocol",在"匹配的类型"中选中ConvertProtocol,单击“下一步”再选中doHttpToJms方法,如下图所示。

  6. 在"JAVA方法属性设置"中设置"参数配置表",如下图所示。

  7. 双击编辑区中的"JMS业务服务"图元,弹出JMS业务服务的"设置对话框",单击"浏览...",如下图所示。

  8. 在弹出的"请选择JMS业务服务"窗口中,选择对应的JMS业务服务,单击“确定”,如下图所示。

  9. 在"设置对话框"中设置"参数配置表",单击“确定”,如下图所示。

  10. 双击编辑区中的"http_http"JAVA方法图元,在"JAVA方法属性设置"窗口中,单击"浏览...",弹出"选择java方法"窗口,在"选择要打开的类型的输入框中输入类名"ConvertProtocol",在"匹配的类型"中选中ConvertProtocol,单击“下一步”再选中createHttpReply方法,如下图所示。

  1. 设置"参数配置表",单击"确定",如下图所示。

  1. 中介服务创建完成,如下图所示。

# 创建HTTP代理服务

  1. 在资源管理器中,在新建的业务Module“com.primeton.esb.project.restaurant”的“代理服务”上,鼠标右键选择“创建 > HTTP代理服务”,创建HTTP代理服务,如下图所示。

  2. 在打开的“创建HTTP代理服务”对话框中,输入类别信息,如下图所示。

  3. 单击“完成”,在HTTP代理服务的编辑界面中,需要输入"URI"并设置引用的中介服务,如下图所示。

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

# 创建文件

  1. 在资源管理器中,选中创建好的项目,鼠标右键选择“创建 >文件”,如下图所示。

  2. 在“新建文件”对话框中,填写文件名,如下图所示。

  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,修改如下所示。

     String urlString = "http://127.0.0.1:9091/HttpToJms"; //HttpToJms中介服务
    
  2. 启动ESB Server,如下图所示。

  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 ESB!</ns:return> </ns:sayHiResponse> </soapenv:Body></soapenv:Envelope>
    

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

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

    接收到消息: Test Http To Jms 释放消费者的资源。

← 3.5.4 JMS穿透 3.5.6 WS-WS协议转换 →