本节讲述了FTP协议场景的创建过程,包括创建工程、创建FTP协议相关的服务、并测试运行。通过本节你将了解到如下内容:
- 如何创建完整的FTP协议场景;
- 如何在Studio中测试运行开发的业务逻辑;
- 如何通过Server运行日志查看运行结果;
本示例中通过FTP模拟一个FTP调用者,用SOAP消息格式作为FTP服务器上的文件内容,从该服务器上下载该文件,通过FTP_WS协议转换,请求远程webservice服务,将返回内容通过WS_FTP协议转换,上传到指定服务器指定文件。
项目源码如附件所示:ftp.zip
# 创建工程
启动ESB Studio。
在资源管理器中,鼠标右键选择“创建 > ESB项目”,创建ESB项目,如下图所示。
在“新建ESB项目”界面,输入“项目名称”、“作者”,选择“ESB服务器”、“R/R数据库”等基本信息。如下图所示。
单击“下一步”,进入“添加项目引用库”界面,如下图所示。
单击“完成”,系统返回ESB开发透视图,创建的项目在"资源管理器"视图中显示,如下图所示。
# 创建公共Module
在资源管理器中,选中创建好的项目,鼠标右键选择“创建 > 公共Module”,创建公共Module,如下图所示。
在“公共Module”对话框中,填写Module名称等信息,如下图所示。
单击“完成”,公共Module创建完成,如下图所示。
# 创建FTP Transport
在创建的ESB项目的“Transport”上,右键选择“创建 > FTP类型Transport”,如下图所示。
在弹出的“创建FTP类型Transport”界面,选择当前的工程、Module,并输入文件名及显示名称,如下图所示。
单击“完成”,HTTP Transport创建完成,如下图所示。
在资源管理器中,双击创建的FTP Transport,打开FTP Transport编辑器,修改相关参数。如下所示。
FTP Transport配置完成后,单击工具栏中的保存图标。
# 创建FTP Endpoint
在创建的ESB项目的“Endpoint”上,右键选择“创建 > FTP类型Endpoint”,如下图所示。
在弹出的“创建Ftp类型Endpoint”界面,选择当前的工程、Module,并输入文件名及显示名称,如下图所示。
单击“完成”,FTP Endpoint创建完成,如下图所示。
在资源管理器中,双击创建的FTP Endpoint,打开FTP Endpoint编辑器,修改相关参数。如下所示。
HTTP Endpoint配置完成后,单击工具栏中的保存图标。
# 创建业务Module
在资源管理器中,选中创建好的项目,鼠标右键选择“创建 > 业务Module”,创建业务Module,如下图所示。
在“业务Module”对话框中,填写Module名称等信息,如下图所示。
单击“完成”,业务Module创建完成,如下图所示。
# 创建FTP业务服务
在资源管理器中,在新建的业务Module“com.primeton.esb.project.restaurant”的“业务服务”上,鼠标右键选择“创建 > FTP业务服务”,如下图所示。
在打开的“创建FTP业务服务”对话框中,输入类别信息,如下图所示。
单击“完成”,在打开的“FTP业务服务”的编辑界面中,需要选择Endpoint和填写URI信息,如下图所示。
单击工具栏中的保存图标。
# 创建FTP代理服务
在资源管理器中,在新建的业务Module“com.primeton.esb.project.restaurant”的“代理服务”上,鼠标右键选择“创建 > FTP代理服务”,如下图所示。
在打开的“创建FTP代理服务”对话框中,输入类别信息,如下图所示。
单击“完成”,在FTP代理服务的编辑界面中,需要如下信息,如下图所示。
单击工具栏的保存,完成FTP代理服务的创建。
# 创建ws业务服务
在资源管理器中,在新建的业务Module“com.primeton.esb.project.restaurant”的“业务服务”上,鼠标右键选择“创建 > WS业务服务”,创建WS业务服务,如下图所示。
在打开的“创建WS业务服务”对话框中,输入类别信息,如下图所示。
单击“完成”,在打开的“WS业务服务”的编辑界面中,需要选择Endpoint和填写URI信息,如下图所示。
在“WS业务服务”的编辑界面,单击“Endpoint*”后面的“选择...”,弹出“Http Endpoint”对话框,选择之前创建的HTTP Endpoint,单击“确定”。如下图所示。
在“WS业务服务”的编辑界面,单击“URI*”下面的“导入WSDL”链接,弹出"导入WSDL"对话框。
在“WSDL地址”的输入框中输入WSDL地址:http://127.0.0.1:8080/wsdemo/services/CustMgrService?wsdl (opens new window) ,然后单击后面的“导入”,Studio会自动导入WSDL的相关信息,勾选操作列表的操作,最后单击“完成”,完成WSDL的导入步骤,如下图所示。单击工具栏的保存,完成WS业务服务的创建,如下图所示。
# 创建Java方法
创建java类,在资源管理器中,右键单击业务Module中的Java,选择“创建 > 类”,如下图所示。
完整的“FTP_Http”类代码如下所示,该类方法中涉及到ESB内部消息的封装,FTP协议转换成HTTP协议,http协议所需的参数都已列出。具体属性值,根据自己的情况而定。
package com.simple; import com.primeton.esb.message.ITipMessagePayload; import com.primeton.esb.message.TipMessageBuilder; import java.util.HashMap; import java.util.Map; public class FTP_Http { public ITipMessagePayload get(ITipMessagePayload in) { Map protocolHeaders = new HashMap(); protocolHeaders.put("$tip_method", "POST"); protocolHeaders.put("Host", "192.168.16.168:9094"); protocolHeaders.put("Content-Length", "242"); protocolHeaders.put("User-Agent", "Apache-HttpClient/4.1.1 (java 1.5)"); protocolHeaders.put("Connection", "/wsdemo/services/CustMgrService"); protocolHeaders.put("remote.addr", "192.168.16.57:8666"); protocolHeaders.put("SOAPAction", "getCustByID"); protocolHeaders.put("Accept-Encoding", "gzip,deflate"); protocolHeaders.put("$tip_protocol", "HTTP/1.1"); protocolHeaders.put("Content-Type", "text/xml*/"); protocolHeaders.put("$tip_consumer.message.req.encoding", "UTF-8"); protocolHeaders.put("$tip_consumer.message.resp.encoding", "UTF-8"); in.getSystemHeaders().put("$tip_message_encoding", "UTF-8"); in.getSystemHeaders().put("$tip_message_invoke_type", Integer.valueOf(3)); TipMessageBuilder msgBuilder = TipMessageBuilder.withPayload(new String((byte[])in.getMessagePayload())); msgBuilder.setMessageHeaders(in.getMessageHeaders()); msgBuilder.setProtocolHeaders(protocolHeaders); in.getSystemHeaders().put("$tip_message_invoke_type", Integer.valueOf(3)); msgBuilder.copySystemHeaders(in.getSystemHeaders()); return msgBuilder.build(); } }
同样的方法创建“Http_Ftp”类,完整的类代码如下所示。
package com.simple; import com.primeton.esb.message.ITipMessagePayload; import com.primeton.esb.message.TipMessageBuilder; import java.io.PrintStream; import java.util.HashMap; import java.util.Map; public class Http_Ftp { public ITipMessagePayload httpToFtp(ITipMessagePayload in) { Map protocolHeaders = new HashMap(); protocolHeaders.put("targetPath", "/test"); protocolHeaders.put("rename", "response.txt"); protocolHeaders.put("sameNameHandle", "1"); in.getSystemHeaders().put("$tip_message_invoke_type", Integer.valueOf(2)); TipMessageBuilder msgBuilder = null; System.out.println(new String((byte[])in.getMessagePayload())); if ((in.getMessagePayload() instanceof byte[])) msgBuilder = TipMessageBuilder.withPayload((byte[])in.getMessagePayload()); else { msgBuilder = TipMessageBuilder.withPayload(((String)in.getMessagePayload()).getBytes()); } msgBuilder.setMessageHeaders(in.getMessageHeaders()); msgBuilder.setProtocolHeaders(protocolHeaders); msgBuilder.copySystemHeaders(in.getSystemHeaders()); return msgBuilder.build(); } }
# 创建FTP中介服务
在资源管理器中,在新建的业务Module“com.primeton.esb.project.restaurant”的“中介服务”上,鼠标右键选择“创建 > 中介服务”,如下图所示。
在打开的“创建中介服务”对话框中,输入类别信息,如下图所示。
单击“完成”,进入右侧的“中介服务”的编辑界面中,如下图所示。
在“中介服务”编辑界面,单击“服务编排”,从左侧面板拖入图元到右侧编辑界面,并用连线连接,如下图所示。
双击编辑区中的"JAVA方法"JAVA方法图元,在"JAVA方法属性设置"窗口中,单击"浏览...",弹出"选择java方法"窗口,在"选择要打开的类型的输入框中输入类名"FTP_Http",在"匹配的类型"中选中FTP_Http,单击“下一步”再选中方法,如下图所示。
在"JAVA方法属性设置"中设置"参数配置表",如下图所示。
双击编辑区中的"WS业务服务"图元,弹出WS业务服务的"设置对话框",单击"浏览...",如下图所示。
在弹出的"请选择WS业务服务"窗口中,选择对应的WS业务服务,单击“确定”,如下图所示。
在"设置对话框"中设置"参数配置表",单击“确定”,如下图所示。
双击编辑区中的“JAVA方法1”图元,在"JAVA方法属性设置"窗口中,单击"浏览...",弹出"选择java方法"窗口,在"选择要打开的类型的输入框中输入类名"Http_Ftp",在"匹配的类型"中选中Http_Ftp,单击“下一步”再选中方法,如下图所示。
- 设置"参数配置表",单击"确定",如下图所示。
- 双击编辑区中的"FTP业务服务"图元,弹出FTP业务服务的"设置对话框",单击"浏览...",如下图所示。
- 在弹出的"请选择WS业务服务"窗口中,选择对应的WS业务服务,单击“确定”,如下图所示。
- 在"设置对话框"中设置"参数配置表",单击“确定”,如下图所示。
- 中介服务创建完成,如下图所示。
# 创建HTTP Endpoint
在创建的ESB项目的“Endpoint”上,右键选择“创建 > HTTP类型Endpoint”,如下图所示。
在弹出的“创建HTTP类型Endpoint”界面,选择当前的工程、Module,并输入文件名及显示名称,如下图所示。
单击“完成”,HTTP Endpoint创建完成,如下图所示。
在资源管理器中,双击创建的HTTP Endpoint,打开HTTPEndpoint编辑器,修改相关参数。如下所示。
# 部署
1.右击项目名称,选择部署。
# 测试
利用SOAPUI测试http://127.0.0.1:8080/wsdemo/services/CustMgrService?wsdl (opens new window) 中的getCustByID操作,可以得到SOAP请求消息,即为 ftp 上/test/soapmsg.txt 中的内容,如下所示。
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://ws.apache.org/axis2/samples/Cust/xsd/"> <soap:Header/> <soap:Body> <xsd:getCustByID> <xsd:custid>1</xsd:custid> </xsd:getCustByID> </soap:Body> </soap:Envelope>
保证 FTP 可以正常访问,启动 ESB Server 后,间隔 20s,就会发现从 ftp 上将/test/soapmsg.txt 文件下载到 E:/test/soapmsg.txt,并根据其中的 soap 消息,调用了CustMgrService 中的 getCustByID,将响应的 soap 消息作为文件内容,上传到了 ftp 上/test/responst.txt 文件中,该文件内容如下图所示。