本节讲述了HTTP-JMS协议转换场景的创建过程,包括创建工程、创建HTTP和JMS协议相关的服务和运行。通过本节你将了解到如下内容。
- 如何创建HTTP-JMS协议转换场景;
- 如何在Studio中测试开发的业务逻辑;
示例如附件所示:http_jms.zip
# 创建工程
启动ESB Studio。
在资源管理器中,鼠标右键选择“创建 > ESB项目”,创建ESB项目,如下图所示。
说明
- ESB 服务器:运行 Module 时使用的 ESB Server。通过首选项进行 ESB Server 的增加、删除等。
- R/R 数据库:用于存储 Module 的资源数据库。该配置必须与所选 ESB Server 的数据库配置保持一致。缺省配置下,ESB Server和R/R数据库均连接 Studio 安装时配置的数据库。
在“新建ESB项目”界面,输入“项目名称”、“作者”,选择“ESB服务器”、“R/R数据库”等基本信息。如下图所示。
单击“下一步”,进入“添加项目引用库”界面,如下图所示。
说明
- 可以添加系统引用库、外部引用库和内部引用库。
单击“完成”,系统返回ESB开发透视图,创建的项目在"资源管理器"视图中显示,如下图所示。
# 创建公共Module
在资源管理器中,选中创建好的项目,鼠标右键选择“创建 > 公共Module”,创建公共Module,如下图所示。
在“公共Module”对话框中,填写Module名称等信息,如下图所示。
公共Module相关填写项的填写规则如下。
参数 说明 Module名称 Module的名称。由数字、字母、下划线(_)组成。 显示名称 Module显示名称。由数字、字母、中文、点(.)、下划线(_)组成。 版本 由数字和点(.)组成。 单击“完成”,公共Module创建完成,如下图所示。
# 创建HTTP Transport
在创建的ESB项目的“Transport”上,右键选择“创建 > HTTP类型Transport”,如下图所示。
在弹出的“创建HTTP类型Transport”界面,选择当前的工程、Module,并输入文件名及显示名称,如下图所示。
单击“完成”,HTTP Transport创建完成,如下图所示。
在资源管理器中,双击创建的HTTP Transport,打开HTTP Transport编辑器,修改相关参数。如下所示。
HTTP Transport配置完成后,单击工具栏中的保存图标。
# 创建JMS Endpoint
在创建的ESB项目的“Endpoint”上,右键选择“创建 > JMS类型Endpoint”,如下图所示。
在弹出的“创建JMS类型Endpoint”界面,选择当前的工程、Module,并输入文件名及显示名称,如下图所示。
单击“完成”,JMS Endpoint创建完成,如下图所示。
在资源管理器中,双击创建的JMS Endpoint,打开JMS Endpoint编辑器,修改相关参数。如下所示。
JMS Endpoint配置完成后,单击工具栏中的保存图标。
# 创建业务Module
在资源管理器中,选中创建好的项目,鼠标右键选择“创建 > 业务Module”,创建业务Module,如下图所示。
在“业务Module”对话框中,填写Module名称等信息,如下图所示。
业务Module相关填写项的填写规则如下。
参数 说明 Module名称 Module的名称。由数字、字母、下划线(_)组成。 显示名称 Module显示名称。由数字、字母、中文、点(.)、下划线(_)组成。 版本 由数字和点(.)组成。 单击“完成”,业务Module创建完成,如下图所示。
# 创建JMS业务服务
在资源管理器中,在新建的业务Module“com.primeton.esb.project.restaurant”的“业务服务”上,鼠标右键选择“创建 > JMS业务服务”,创建JMS业务服务,如下图所示。
在打开的“创建JMS业务服务”对话框中,输入类别信息,如下图所示。
单击“完成”,在打开的“JMS业务服务”的编辑界面中,编辑生成的JMS业务服务的文件。选择刚刚创建的JMS Endpoint,填写队列名为“queue1”,如下图所示。
单击工具栏的保存,完成JMS业务服务的创建。
# 创建Java方法
在资源管理器中,右键单击业务Module中的Java,选择“创建 > 类”,如下图所示。
在弹出的"新建Java类"向导中输入相应信息后,点击"完成"按钮即可,如下图所示。
完整的“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(); } }
同样的方法创建类“SimpleConsumer”和类“TestClient”,如下图所示。
完整的“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()); } }
Java方法创建完成如下图所示。
# 创建中介服务
在资源管理器中,在新建的业务Module“com.primeton.esb.project.restaurant”的“中介服务”上,鼠标右键选择“创建 > 中介服务”,如下图所示。
在打开的“创建WS代理服务”对话框中,输入类别信息,如下图所示。
单击“完成”,生成中介服务,如下图所示。
在"中介服务"编辑页面单击“服务编排”链接,进入编排中介服务的界面。在"选用板"中将"JAVA方法"和"JAVA业务服务"图元拖拽到右边的编辑区,并用"连接线"依次连接,如下图所示。
双击编辑区中的"http_jms"JAVA方法图元,在"JAVA方法属性设置"窗口中,单击"浏览...",弹出"选择java方法"窗口,在"选择要打开的类型的输入框中输入类名"ConvertProtocol",在"匹配的类型"中选中ConvertProtocol,单击“下一步”再选中doHttpToJms方法,如下图所示。
在"JAVA方法属性设置"中设置"参数配置表",如下图所示。
双击编辑区中的"JMS业务服务"图元,弹出JMS业务服务的"设置对话框",单击"浏览...",如下图所示。
在弹出的"请选择JMS业务服务"窗口中,选择对应的JMS业务服务,单击“确定”,如下图所示。
在"设置对话框"中设置"参数配置表",单击“确定”,如下图所示。
双击编辑区中的"http_http"JAVA方法图元,在"JAVA方法属性设置"窗口中,单击"浏览...",弹出"选择java方法"窗口,在"选择要打开的类型的输入框中输入类名"ConvertProtocol",在"匹配的类型"中选中ConvertProtocol,单击“下一步”再选中createHttpReply方法,如下图所示。
- 设置"参数配置表",单击"确定",如下图所示。
- 中介服务创建完成,如下图所示。
# 创建HTTP代理服务
在资源管理器中,在新建的业务Module“com.primeton.esb.project.restaurant”的“代理服务”上,鼠标右键选择“创建 > HTTP代理服务”,创建HTTP代理服务,如下图所示。
在打开的“创建HTTP代理服务”对话框中,输入类别信息,如下图所示。
单击“完成”,在HTTP代理服务的编辑界面中,需要输入"URI"并设置引用的中介服务,如下图所示。
单击工具栏的保存,完成HTTP代理服务的创建。
# 创建文件
在资源管理器中,选中创建好的项目,鼠标右键选择“创建 >文件”,如下图所示。
在“新建文件”对话框中,填写文件名,如下图所示。
单击“完成”。
在“http.txt”文件中输入文本消息“Test Http To Jms”,作为HTTP的请求消息。
# 启动和测试
在业务 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中介服务
启动ESB Server,如下图所示。
右键单击 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代理服务调用成功。
打开业务Module(com.primeton.esb.project.restaurant)中java类“SimpleConsumer.java”,执行main方法后,控制台打印信息如下所示。
接收到消息: Test Http To Jms 释放消费者的资源。