1

我正在使用 Spring MVC 开发一个 Web 应用程序。简而言之,用户上传一个可以是不同类型(.csv、.xls、.txt、.xml)的文件,应用程序会解析该文件并提取数据以进行进一步处理。问题是我的文件格式可以经常更改。因此,必须有某种方法可以快速轻松地进行定制。由于对 Talend 有点熟悉,我决定试一试并将其用作我的应用程序的 ETL 工具。这个简短的教程展示了如何在 Java 应用程序中运行 Talend 作业 - http://www.talendforge.org/forum/viewtopic.php?id=2901 但是,使用 Talend 创建的作业可以读取/写入物理文件、目录或数据库。是否可以修改 Talend 作业,以便可以将一些 Java 对象作为参数,然后像通常的 Java 方法一样返回 Java 对象?例如:

String[] param = new String[]{"John Doe"};
String talendJobOutput = teaPot.myjob_0_1.myJob.main(param);

其中teaPot.myjob_0_1.myJob 是集成到我的应用程序中的人才工作

4

3 回答 3

2

我猜我做了类似的事情。我使用 tMap 在 tallend 中创建了一个映射,并将其导出为 talend 作业(java se 程序)。如果包含该作业的库,则可以按照其他人的描述运行 talend 作业。

要传递任意 java 对象,您可以使用每个 talend 作业中存在的以下方法:

public Object getValueObject() {
    return this.valueObject;
}

public void setValueObject(Object valueObject) {
    this.valueObject = valueObject;
}

在你的工作中,你必须铸造这个物体。例如,您可以放入一个 HashMap 列表并使用 Java 反射来填充行。为此使用 tJavaFlex 或自定义组件。

使用这种方法,我可以在 Talend 中直观地调整我的数据映射,但仍将生成的代码用作我的 java 应用程序中的库。

于 2013-09-24T15:25:20.350 回答
1

现在我更好地理解了您的意愿,我认为这是不可能的,因为 Talend 的架构就像一个独立的应用程序,具有一个“主”入口点,就像 Java 的 main() 方法一样:

public String[][] runJob(String[] args) {
    int exitCode = runJobInTOS(args);
    String[][] bufferValue = new String[][] { { Integer.toString(exitCode) } };
    return bufferValue;
}

也就是说:Talend 执行入口点只接受String 数组作为输入,不返回任何内容作为输出(系统返回码除外)。

因此,您将无法将 Talend(生成的)代码作为库链接,而是作为一个孤立的工具,您只能在启动之前对其进行参数化(使用上下文变量,请参阅我的其他回复)。

您可以看到,在 Talend 帮助中心或论坛中,唯一描述的集成是作为“外部”作业执行......:

Talend 知识库“从外部 Java 应用程序调用 Talend 作业”一文

Talend 社区论坛“Java 对象到 Talend”主题

如果您想将 Talend 作为 ETL 工具用于您的目的,您可能必须重新考虑应用程序的架构。

于 2013-09-12T16:13:06.083 回答
1

现在从Talend ETL的角度来看:如果要参数化作业的执行环境(例如上传文件的物理目录),您应该使用可以在执行时从配置文件加载的上下文变量,如此处所述: https ://help.talend.com/display/TalendOpenStudioforDataIntegrationUserGuide53EN/2.6.6+Context+settings

于 2013-09-12T16:19:05.453 回答