本节讲述了FTP协议场景的创建过程,包括创建工程、创建FTP协议相关的服务、并测试运行。通过本节你将了解到如下内容:

  1. 如何创建完整的FTP协议场景;
  2. 如何在Studio中测试运行开发的业务逻辑;
  3. 如何通过Server运行日志查看运行结果;

本示例中通过FTP模拟一个FTP调用者,用SOAP消息格式作为FTP服务器上的文件内容,从该服务器上下载该文件,通过FTP_WS协议转换,请求远程webservice服务,将返回内容通过WS_FTP协议转换,上传到指定服务器指定文件。

项目源码如附件所示:ftp.zip (opens new window)

# 创建工程

  1. 启动APIGateway Studio。

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

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

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

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

# 创建公共Module

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

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

  3. 单击“完成”,公共Module创建完成,如下图所示。
    image2018-10-11 10:45:18.png

# 创建FTP Transport

  1. 在创建的ESB项目的“Transport”上,右键选择“创建 > FTP类型Transport”,如下图所示。
    image2019-2-19 11:20:6.png

  2. 在弹出的“创建FTP类型Transport”界面,选择当前的工程、Module,并输入文件名及显示名称,如下图所示。
    image2019-2-19 11:20:42.png

  3. 单击“完成”,HTTP Transport创建完成,如下图所示。
    image2019-2-19 11:29:4.png

  4. 在资源管理器中,双击创建的FTP Transport,打开FTP Transport编辑器,修改相关参数。如下所示。
    image2019-4-10 16:21:2.png

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

# 创建FTP Endpoint

  1. 在创建的ESB项目的“Endpoint”上,右键选择“创建 > FTP类型Endpoint”,如下图所示。
    image2019-2-19 11:41:13.png

  2. 在弹出的“创建Ftp类型Endpoint”界面,选择当前的工程、Module,并输入文件名及显示名称,如下图所示。
    image2019-2-19 11:41:28.png

  3. 单击“完成”,FTP Endpoint创建完成,如下图所示。
    image2019-2-19 16:17:24.png

  4. 在资源管理器中,双击创建的FTP Endpoint,打开FTP Endpoint编辑器,修改相关参数。如下所示。
    image2019-4-10 16:43:55.png

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

# 创建业务Module

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

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

  3. 单击“完成”,业务Module创建完成,如下图所示。
    image2018-10-16 15:28:7.png

# 创建FTP业务服务

  1. 在资源管理器中,在新建的业务Module“com.primeton.esb.project.restaurant”的“业务服务”上,鼠标右键选择“创建 > FTP业务服务”,如下图所示。
    image2019-2-19 16:37:40.png

  2. 在打开的“创建FTP业务服务”对话框中,输入类别信息,如下图所示。
    image2019-2-19 16:50:40.png

  3. 单击“完成”,在打开的“FTP业务服务”的编辑界面中,需要选择Endpoint和填写URI信息,如下图所示。
    image2019-2-19 16:53:14.png

  4. 单击工具栏中的图标保存。

# 创建FTP代理服务

  1. 在资源管理器中,在新建的业务Module“com.primeton.esb.project.restaurant”的“代理服务”上,鼠标右键选择“创建 > FTP代理服务”,如下图所示。
    image2019-2-19 16:22:3.png

  2. 在打开的“创建FTP代理服务”对话框中,输入类别信息,如下图所示。
    image2019-2-19 16:23:2.png

  3. 单击“完成”,在FTP代理服务的编辑界面中,需要如下信息,如下图所示。
    image2019-4-10 17:39:9.png

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

# 创建ws业务服务

  1. 在资源管理器中,在新建的业务Module“com.primeton.esb.project.restaurant”的“业务服务”上,鼠标右键选择“创建 > WS业务服务”,创建WS业务服务,如下图所示。
    image2018-10-16 10:37:56.png

  2. 在打开的“创建WS业务服务”对话框中,输入类别信息,如下图所示。
    image2018-10-16 10:38:54.png

  3. 单击“完成”,在打开的“WS业务服务”的编辑界面中,需要选择Endpoint和填写URI信息,如下图所示。
    image2018-10-16 10:50:52.png

  4. 在“WS业务服务”的编辑界面,单击“Endpoint*”后面的“选择...”,弹出“Http Endpoint”对话框,选择之前创建的HTTP Endpoint,单击“确定”。如下图所示。
    image2018-10-16 11:5:32.png

  5. 在“WS业务服务”的编辑界面,单击“URI*”下面的“导入WSDL”链接,弹出"导入WSDL"对话框。
    在“WSDL地址”的输入框中输入WSDL地址:http://127.0.0.1:8080/wsdemo/services/CustMgrService?wsdl (opens new window),然后单击后面的“导入”,Studio会自动导入WSDL的相关信息,勾选操作列表的操作,最后单击“完成”,完成WSDL的导入步骤,如下图所示。
    image2018-10-16 11:12:25.png

  6. 单击工具栏的保存,完成WS业务服务的创建,如下图所示。
    image2018-10-16 11:25:16.png

# 创建Java方法

  1. 创建java类,在资源管理器中,右键单击业务Module中的Java,选择“创建 > 类”,如下图所示。
    image2019-4-9 15:9:59.png
    image2019-2-21 15:2:32.png

  2. 完整的“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();
      }
    }
    
  3. 同样的方法创建“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中介服务

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

  2. 在打开的“创建中介服务”对话框中,输入类别信息,如下图所示。
    image2019-2-19 16:31:22.png

  3. 单击“完成”,进入右侧的“中介服务”的编辑界面中,如下图所示。
    image2019-2-21 14:56:6.png

  4. 在“中介服务”编辑界面,单击“服务编排”,从左侧面板拖入图元到右侧编辑界面,并用连线连接,如下图所示。
    image2019-4-10 17:23:35.png

  5. 双击编辑区中的"JAVA方法"JAVA方法图元,在"JAVA方法属性设置"窗口中,单击"浏览...",弹出"选择java方法"窗口,在"选择要打开的类型的输入框中输入类名"FTP_Http",在"匹配的类型"中选中FTP_Http,单击“下一步”再选中方法,如下图所示。
    image2019-4-11 15:9:8.png
    image2019-4-11 15:9:58.png

  6. 在"JAVA方法属性设置"中设置"参数配置表",如下图所示。
    image2019-4-11 15:10:41.png

  7. 双击编辑区中的"WS业务服务"图元,弹出WS业务服务的"设置对话框",单击"浏览...",如下图所示。
    image2019-4-11 15:13:6.png

  8. 在弹出的"请选择WS业务服务"窗口中,选择对应的WS业务服务,单击“确定”,如下图所示。
    image2020-4-8 16:47:25.png

  9. 在"设置对话框"中设置"参数配置表",单击“确定”,如下图所示。
    image2019-4-11 15:15:2.png

  10. 双击编辑区中的“JAVA方法1”图元,在"JAVA方法属性设置"窗口中,单击"浏览...",弹出"选择java方法"窗口,在"选择要打开的类型的输入框中输入类名"Http_Ftp",在"匹配的类型"中选中Http_Ftp,单击“下一步”再选中方法,如下图所示。
    image2019-4-11 15:16:17.png
    image2019-4-11 15:16:58.png

  11. 设置"参数配置表",单击"确定",如下图所示。
    image2019-4-11 15:17:35.png

  12. 双击编辑区中的"FTP业务服务"图元,弹出FTP业务服务的"设置对话框",单击"浏览...",如下图所示。
    image2019-4-11 15:20:38.png

  13. 在弹出的"请选择WS业务服务"窗口中,选择对应的WS业务服务,单击“确定”,如下图所示。
    image2019-4-11 15:20:3.png

  14. 在"设置对话框"中设置"参数配置表",单击“确定”,如下图所示。
    image2019-4-11 15:21:12.png

  15. 中介服务创建完成,如下图所示。
    image2019-4-11 15:21:39.png

# 创建HTTP Endpoint

  1. 在创建的ESB项目的“Endpoint”上,右键选择“创建 > HTTP类型Endpoint”,如下图所示。
    image2018-10-11 17:36:52.png

  2. 在弹出的“创建HTTP类型Endpoint”界面,选择当前的工程、Module,并输入文件名及显示名称,如下图所示。
    image2018-10-11 17:53:41.png

  3. 单击“完成”,HTTP Endpoint创建完成,如下图所示。
    image2018-10-16 10:11:20.png

  4. 在资源管理器中,双击创建的HTTP Endpoint,打开HTTPEndpoint编辑器,修改相关参数。如下所示。
    image2019-4-10 17:46:28.png

# 部署

1.右击项目名称,选择部署。
image2020-4-3 11:22:12.png

# 测试

  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>
    
  2. 保证 FTP 可以正常访问,启动 APIGateway ESBServer 后,间隔 20s,就会发现从 ftp 上将/test/soapmsg.txt 文件下载到 E:/test/soapmsg.txt,并根据其中的 soap 消息,调用了CustMgrService 中的 getCustByID,将响应的 soap 消息作为文件内容,上传到了 ftp 上/test/responst.txt 文件中,该文件内容如下图所示。
    image2019-4-11 16:55:53.png