我目前有一个Talend作业,它从上下文文件中读取并输入上下文变量。我有一个名为ftppassword的字段,并将硬编码密码存储在上下文文件中。然后我在作业中有一个上下文变量,并在我的工作中引用它。
使用此设置,我的作业运行良好,但如果我将上下文文件更改为包含密码文件的位置,而不是硬编码密码,则会得到以下异常:
Exception in component
tFTPConnection_1 com.enterprisedt.net.ftp.FTPException: 530 Login
incorrect. at
com.enterprisedt.net.ftp.FTPControlSocket.validateReply(FTPControlSocket
.java:1179) at
com.enterprisedt.net.ftp.FTPClient.password(FTPClient.java:1844) at
com.enterprisedt.net.ftp.FTPClient.login(FTPClient.java:1766) – **Edit-2014-12-08*“with value”"test_dn.zip“也尝试将ftppassword的数据类型更改为”文件“和”密码“,但没有结果。

发布于 2014-12-05 19:32:49
作业上的implicit tContextLoad选项相当于在作业开始时使用由2列组成的模式( key和value )放置一个tFileInputDelimited组件。然后将其读入tContextLoad (因此是选项名),以加载作业中的上下文。
如果您的密码文件不是以键值格式,那么您就不能这样使用它。
最简单的选择是坚持以前的工作方式,并使用implicit tContextLoad加载带有上下文变量键值对的分隔文件。
另一个选项是不再使用implicit tContextLoad选项执行此操作,而是显式地执行此操作。
要做到这一点,您需要使用适当的连接器(如tFileInputDelimited )读取密码文件。如果您正在阅读一些类似于/etc/passwd的内容,那么您可以在:上拆分它以获得:
然后,可以使用tMap填充以下输出模式:
然后输入"ftppassword"作为key,并将密码值连接到value列。您还需要过滤这个记录集,以便只设置一个密码,因此您可能希望在输出表的表达式筛选器中使用类似于"ftpUser".equals(row1.username)的tMap。
然后,只需将其连接到tContextLoad组件,您的作业就应该从/etc/passwd加载"ftpUser"用户帐户的密码。
如果您希望将一个文件路径传递给另一个包含密码的文件,以便可以拆分依赖项,并允许一个文件包含作业的所有其他上下文,但是要将密码文件保存在其他位置,那么您需要传递一个指向密码文件的上下文变量,但随后必须在作业中显式地使用它。
在这种情况下,您可能有一个在运行时加载的上下文文件,其中包含可以直接在文件中设置的上下文(如ftpremotepath、ftphost和ftpfilemask ),还有一个ftpusercredentials上下文变量,它是单独凭据文件的文件路径。
然后,该文件可以是另一个分隔文件,其中包含上下文名称和值的键值对,例如:
ftpuser,myuser
ftppasswd,p4ssw0rd然后,在作业开始时,您将在使用包含2列的模式的tFileInputDelimited组件( key和value )中显式地阅读这一内容。然后,您可以将它连接到一个tContextLoad组件,这也会将第二组上下文变量加载到内存中。
然后,通过将它们称为context.ftpuser和context.ftppasswd,您可以正常地使用它们。
https://stackoverflow.com/questions/27322829
复制相似问题