IBM? WebSphere Message Broker(后面简称为 Message Broker)是针对涉及信息流的解决方案的IBM企业服务总线产品。简言之,这些信息流会获得一个输入信息,对它应用某种转换,然后使用内置Message Broker节点将它交付给终端节点(end-point)。
FileInput和FileOutput节点分别用于在文件系统与FYP服务器之间读取和写入文件。不过,这两个节点都不支持自定义FTP命令。
图 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. 信息流
运行信息流
在JavaCompute节点中,提到了包含名称-值对的文件的名称。另外,JavaCompute节点可以手动创建Properties对象并传递它。然后,在FI01中创建一个预期的文件名。现在,就可以将信息流打包成一个BAR文件,然后部署并运行它。
连接到MQInput节点
在这个信息流中,从MQInput节点的Out终端开始连接JavaCompute节点的In终端。在这个设置中,我们期望创建与要交付的文件同名的信息,然后使用该名称来实际交付文件。在课程实践中,创建信息可能会更复杂。
图 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中国
相关推荐
-
现在的云存储和ftp有什么区别?都是文件传输协议啊!区别在于哪里?
-
云整合:实用主义至上
云计算能否成为良好的集成解决方案催化剂?很多企业级软件都在云端终结了,其易用性惊人,而且能够快速部署。云计算是个魔术师吗?
-
文件传输协议(FTP)必将消亡
文件传输协议(FTP)在RFC 959中定义,于1985年10月发布。文件传输协议(FTP)被设计成为一个跨平台的、简单且易于实现的协议。
-
SOA治理:FTP未来之路
尽管SOAP和SOA开始“入侵”技企业,但文件传输协议(FTP)继续在企业中繁荣发展。这并不奇怪,因为企业需要传输文件。金融和银行都代表了FTP的堡垒。