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功能。 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功能。
-
扫码下载安卓APP
-
微信扫一扫关注我们
微信扫一扫打开小程序
手Q扫一扫打开小程序
-
返回顶部
发表评论