如何使用WebSphere Message Broker定制FTP?

日期: 2011-10-26 作者:Nagesh Subrahmanyam 来源:TechTarget中国 英文

  IBM? WebSphere Message Broker(后面简称为 Message Broker)是针对涉及信息流的解决方案的IBM企业服务总线产品。简言之,这些信息流会获得一个输入信息,对它应用某种转换,然后使用内置Message Broker节点将它交付给终端节点(end-point)。

  FileInput和FileOutput节点分别用于在文件系统与FYP服务器之间读取和写入文件。不过,这两个节点都不支持自定义FTP命令。

图 1

图 1

  一个典型的FTP会话

  以下的记录显示了一个从Linux机器到z/OS服务器上的MVS系统的典型会话:

  示例 1. 从Linux到z/OS的FTP会话
    

以下是引用片段:
nsubrahm@nsubrahm:~$ ftp big.blue.server 
Connected to 0.0.0.0. 
220-TCPFTP1 IBM FTP CS V1R12 at big.blue.server, 10:03:31 on 2011-03-16. 
220 Connection will close if idle for more than 5 minutes. 
Name (0.0.0.0:nsubrahm): USERID0 
331 Send password please. 
Password: 
230 USERID0 is logged on.  Working directory is “USERID0.”. 
Remote system type is MVS. 
ftp> site RECFM=FB LRECL=100 BLKSIZE=27900 
200 SITE command was accepted 
ftp> put Messages.csv ‘A.TEST.GDG(+1)’ 
local: Messages.csv remote: ‘A.TEST.GDG(+1)’ 
200 Port request OK. 
125 Storing data set A.TEST.GDG.G0003V00 
250 Transfer completed successfully. 
336887 bytes sent in 1.17 secs (281.2 kB/s) 
ftp> bye 
221 Quit command received. Goodbye. 

  这个FTP会话使用SITE命令为目标数据集传递信息。Message Broker FileOutput节点并不具备此功能,因此本文会介绍如何实现它。

  Java解决方案

  Java解决方案基于Apache Commons Net包。如FTPClient中的javadoc所述,首先连接到FTP服务器,使用您的用户名和密码登录,然后使用get或put命令。以下是一个样例实现。

  示例 2. 使用Apache Commons Net 的FTP的样例实现
    

以下是引用片段:
package fileTransferProtocol; 
import org.apache.commons.net.ftp.*; 
import java.io.*; 
public class FileTransferProtocol { 
     public static void main (String [ ] args)  { 
     String serverName =”my.zos.mainframe”  ; 
     String userName =”userid” ; 
     String password =”********” ; 
     FTPClient ftp = new FTPClient() ; 
     //Connect to the server 
     try { ftp.connect (serverName) ; 
          String replyText =ftp.getReplyString()  ; 
          System.out.println (replyText) ; 
     } 
     catch (Exception  e)  { 
               e.printStackTrace () ; 
     } 
     //Login to the server 
     try {   ftp.login (userName, password) ; 
               String replyText = ftp.getReplyString() ; 
               System.out.println (replyText); 
     } catch (Exception e) { 
               e.printStackTrace(); 
     } 
     //Tell server that the file will have JCL records 
     try {   ftp.site (“RECFM=FB LRECL=140”) ; 
               String replyText = ftp.getReplyString() ; 
               System.out.println (replyText) ; 
     } 
     catch (Exception e) { 
               e.printStackTrace() ; 
     } 
     //Submit the job from the text file. 
     try {   FileInputStream inputStream = new FileInputStream (“/my/source/file”) ; 
               ftp.storeFile (serverName,inputStream) ; 
               String replyText = ftp.getReplyString() ; 
               System.out.println (replyText) ; 
     } 
     catch (Exception e) { 
               e.printStackTrace() ; 
     } 
     //Quit the server 
     try { ftp.quit() ; 
     } 
     catch (Exception e) { 
                e.printStackTrace() ; 
     } 
  } 

  使用JavaCompute节点

  前面的小节展示了将文件从本地发送至远程文件系统的实现样例。这一节会介绍如何在Message Broker JavaCompute节点中包装此实现。

  Message Broker信息中心有大量的JavaCompute节点资料。但有一点需要强调:前面介绍的样例实现要求Commons Net JAR文件在CLASSPATH上是可用的。同样的,使用JavaCompute节点时,您需要在外部JAR文件中添加依赖关系。

  JavaCompute节点的Java类的类型

  Message Broker Toolkit提供了基于JavaCompute节点预期功能的类模板。

  • 过滤器——过滤传入的信息
  • 修改——修改传入的信息
  • 创建——创建新的信息

  模板的选择取决于特定的信息流,例如,传入的信息在文件转换后是否会传播到后续节点,或者完成文件转换后是否不会再有进一步的动作,以至于没有信息需要传播。

  Java类的描述

  这一节将描述用来定制FTP的Java类。

  FTP会话的基本输入

  通过FTP转换文件所需的重要项目为:

  • 服务器主机名或IP地址
  • 用户ID和密码
  • 源文件和目标文件

  对于利用FTPClient将数据从Apache Commons Net传送到实际传输文件的类,此信息应该是可用的。本文中显示的类接受上述值作为java.util.Properties对象,或者将它作为“名称-值”对的文件名。在使用Properties对象时,您有动态设置这些值的优势。有了这个文件,就不再需要硬编码值。同时,通过设置适当的访问控制,只能通过broker运行所用的ID来读取该文件。

  Properties对象

  由于不同的FTP会话可能需要不同的自定义命令,Properties对象不必一直是同一个对象。本文描述了一个实现,其中需要通过指定数据集控制块(DCB)和一些空间值,使用FTP会话将某个文件提供给z/OS服务器。Properties对象的名称-值对如下所示:

  示例 3. Properties对象的名称——值对样例
    

以下是引用片段:
INTF1.server=big.blue.server 
INTF1.userid=USERID01 
INTF1.password=HeyThere 
INTF1.targetDSN=’A.DUMMY.GDG(+1)’ 
INTF1.targetDSN.RECFM=FB 
INTF1.targetDSN.LRECL=100 
INTF1.targetDSN.BLKSIZE=27900 
INTF1.targetDSN.pri=10 
INTF1.targetDSN.sec=5 
INTF1.targetDSN.unit=CYL 

  调用

  以下是调用自定义FTP类的JavaCompute节点的样例:

  示例 4. 调用自定义节点类的JavaCompute节点的代码样例
    

以下是引用片段:
package customFTP; 
import com.ibm.broker.javacompute.MbJavaComputeNode; 
import com.ibm.broker.plugin.*; 
public class FTPMessageFlow_JC01 extends MbJavaComputeNode { 
   public void evaluate(MbMessageAssembly inAssembly) throws MbException { 
      MbOutputTerminal out = getOutputTerminal(“out”); 
      MbMessage inMessage = inAssembly.getMessage(); 
      MbMessage outMessage = new MbMessage(inMessage); 
      MbMessageAssembly outAssembly = new MbMessageAssembly(inAssembly,outMessage); 
      try { 
         /** 
          * All logic for this JavaCompute node. 
          * 
          * Build Properties object here OR 
          * Provide file name here 
          * 
          * Invoke custom FTP here 
          * 
          */ 
      } catch (Exception e) { 
         /** 
          * Handle exceptions 
          */ 
   } finally { 
      outMessage.clearMessage(); 
   } 
}

  如以上代码所示,我们要先执行所需的业务逻辑,然后准备Properties对象,或者传递文件名,以便调用自定义FTP类。

  信息流样例

  以下是两个通过FTP将文件发送到目标机器的信息流样例。

  连接到FileOutput节点

  在此信息流中,从FileOutput节点中的End of data终端开始连接JavaCompute节点中的In终端。在这个设置中,在完全写入文件后,就会准备通过FTP交付它。为了简便起见,我们通过从FileInput节点中进行复制,创建了要传输的文件。在课程实践中,可能还会创建更复杂的文件。

图 2. 信息流

图 2. 信息流

  运行信息流

  在JavaCompute节点中,提到了包含名称-值对的文件的名称。另外,JavaCompute节点可以手动创建Properties对象并传递它。然后,在FI01中创建一个预期的文件名。现在,就可以将信息流打包成一个BAR文件,然后部署并运行它。

  连接到MQInput节点

  在这个信息流中,从MQInput节点的Out终端开始连接JavaCompute节点的In终端。在这个设置中,我们期望创建与要交付的文件同名的信息,然后使用该名称来实际交付文件。在课程实践中,创建信息可能会更复杂。

图 3. 信息流

图 3. 信息流

  运行信息流

  在JavaCompute节点中,提到了拥有 “名称-值” 对的文件的名称。另外,JavaCompute节点可以手动创建Properties对象并传递它。然后,为消息设置了一个与要交付的文件相同的名称。现在,可以将信息流打包成一个BAR文件,然后部署并运行它。

  可从 文章底部下载的zip文件中 有四个Message Broker项目,如上面所述,每个信息流有两个项目前。每一对项目中,其中一个项目包含信息流,另一个包含Java代码。您可以将这些zip文件导入您的工作区,然后在broker上创建并部署它们。可能需要对文件(比如MQ节点)进行一些特定于您的环境的更改。

  结束语

  本文介绍了如何使用WebSphere Message Broker JavaCompute节点中的Apache Commons Net来启用FTP的自定义命令,您可以扩展这个解决方案,以支持使用SSH FTP和FTP-SSL的安全FTP,从而支持Message Broker使用所有的FTP功能。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐