【问题标题】:Developing custom Talend component : how to create something REALLY custom that doesn't require input or output?开发自定义 Talend 组件:如何创建不需要输入或输出的真正自定义的东西?
【发布时间】:2019-11-18 04:51:31
【问题描述】:

为了连接到肥皂 API 以获取一些分析数据,我必须使用自定义库和自定义代码来触发请求并将结果下载为 CSV 文件。

PoC 在 Talend 之外完成,一切正常。

现在我需要将这些东西整合到 Talend 工作中。在不重新开发 Talend 中已包含的流程的情况下开发出尽可能简单的东西。

例如,我想开发一个简单的组件,它在参数中获取基本凭据,然后执行查询并下载 csv 结果。 然后我将能够使用 tFileInputDelimited 解析 csv 文件并继续我的 Talend 工作。 它在某些时候有效,但我无法清除我为第二个 PoC 工作所做的黑客攻击......因为 Talend 阻止我这样做。


阅读所有(少数)文档(

)

我发现你只能创建 3 种类型的组件。

  • 一个不接受任何输入的输入组件 [I] =>,如果不依赖于某个父作业,它会自动触发,并且它必须后跟另一个组件来处理它的结果。

    [I] --> (...)
    
  • 输出组件 [O] => 接受输入,但没有输出(例如行记录器)。由于它依赖于一个父组件,它不能自己运行。

    (...) --> [O]
    
  • 一个称为处理器 [P] 的混合组件,它只不过是一个输出组件,它也可以产生一些结果,因此它可以与另一个链接(但这不是强制性的)。但由于它只是输出组件的替代版本,它必须依赖于父组件

    (...) --> [P] --> (...)
    

好吧,让我列出我需要我的组件做什么,看看最适合什么:

  1. 它必须能够自行触发,因为它不需要任何输入
  2. 它必须在工作完成时发送一个“onComponentOk”事件
  3. 它一定不需要任何输出组件,因为结果不是链接到下一个的东西,而只是一个信号,说“嘿,csv 文件已准备好,在你知道的地方找到它”

是的!完美的。现在让我们找出适合每个要求的组件类型:

  1. => 输入组件
  2. => 输入、输出和处理器组件
  3. => 输出和处理器组件

那么哪一个符合所有这些要求?没有人...


(为简化起见,让我们认为输出和处理器组件在本文的其余部分是相同的。)

所以我尝试了两种可能的实现方式:

  • 使用输入组件,它会正常工作。但是,如果我不在我之后连接另一个组件,Talend 就不会编译我的工作。所以这很糟糕,但我必须有一个组件(不要)使用我的(非)结果来构建工作...... 它让我发疯。

  • 使用处理器组件,它会正常工作,这一次我不必在之后连接另一个组件。但是,如果它没有收到任何数据,我的组件初始化例程将永远不会运行。所以我必须连接一个假组件,将(无)数据输入我的组件(不需要任何东西)才能启动。哇哇哇哇哇哇!!!

所以我阅读了我能找到的关于这个主题的所有内容,甚至尝试了一些神秘的仪式。但我找不到任何(干净的)解决方案!

我还尝试使用 Talend 工具包 Java 注释来禁用输入或输出。

求助,如果有人知道有关 Talend 工具包的秘密提示,我会大开眼界。

但我认为答案是重新考虑问题。 因为它来自我不符合 Talend 可能性的要求。 我知道我应该产生一个结果数据。但是为什么要重新开发 tFileInputDelimited ???我将不得不维护更多代码,并且我不想重复。

在完美的世界中,一个解决方案就是将输出的 csv 文件路径发送到下一个组件。但不幸的是, tFileInputDelimited 似乎无法从以前的组件输出中设置其配置。 但我可能错了。老实说,我两周前才开始使用 Talend。我只知道其中的 1%。

有人知道吗?

【问题讨论】:

  • Talend 似乎用他们的新组件套件改变了很多东西。我已经为 TOS 6.x 开发了自定义组件,其中一些如您所述,不需要任何输入,也不需要产生输出,而且做起来并不复杂。
  • 看看他们是如何实现的:tJava 或 tDbConnection 那些没有输入/输出链接,只是触发输入/触发输出
  • @BalazsGunics 是的,这就是我最先研究的内容......但我从来没有找到一种干净的方法来要求和导入我需要的库:/

标签: java components talend


【解决方案1】:

可能有一些变通方法使用 globalMap 在跨作业的组件之间传递文件名并重用 tFileDelimited。

但是,听起来您的组件只是一个输入,应该使用 commons-csv 或其他库“即时”读取文件并避免临时文件 - 重用,不重复;)。 为什么要封装它?因为它使封装在组件中的格式和作业更加稳定。您也不想在组件之间传播本地文件路径,但记录已经加载到内存中,这将使您能够在 Talend Pipeline Designer 中部署您的组件,并在以后根据需要直接在云中运行。请注意,即使在工作室中,它也可以减少由于作业的副作用而导致的潜在问题(文件不属于作业,而是属于您的文件系统)。

如果您不想构建输出、数据集和数据存储,唯一的小技巧是禁用一些验证,因为默认情况下插件鼓励良好的做法,但工作室允许禁用这些让您只进行输入的验证。也就是说,数据存储和数据集对这个组件很有价值,因为您可以在工作室中将它们用作模板/元数据。

最后,它只需要更改作业中的输入,而不是使用 pre-job 重新连接它们。因此,从长远来看,使用输入恕我直言,这听起来可能更简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 2013-01-22
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 2019-09-23
    • 1970-01-01
    相关资源
    最近更新 更多