talend如何在运行时处理作业的修改?

时间:2014-12-02 11:31:53

标签: java xml talend

据我所知,当我们在talend中创建项目时,它会创建三个文件,即project_name.item,project_name.properties和project_name.java。当我们向项目添加组件时,该组件的参数取自component_java.xml文件。当我们为该组件指定参数值并保存作业时,它将自动添加到项目文件中。例如,tMap组件的典型_java.xml文件如下所示。

<COMPONENT>
   <HEADER PLATEFORM="ALL"
    SERIAL="" 
    VERSION="2.1" 
    STATUS="ALPHA" 
    COMPATIBILITY="WIN32" 
    AUTHOR="Talend" 
    RELEASE_DATE="20070703A" 
    STARTABLE="false" 
    EXTENSION="org.talend.designer.mapper" 
    SCHEMA_AUTO_PROPAGATE="false" 
    DATA_AUTO_PROPAGATE="false" 
    HAS_CONDITIONAL_OUTPUTS="true"
    PARTITIONING="AUTO" 
    >
      <SIGNATURE></SIGNATURE>
   </HEADER>

  <FAMILIES>
    <FAMILY>Processing</FAMILY>
  </FAMILIES>
   <DOCUMENTATION>
      <URL/>
   </DOCUMENTATION>
    <CONNECTORS>
        <CONNECTOR BUILTIN="true" CTYPE="FLOW" MIN_INPUT="1" MIN_OUTPUT="1"/>
        <CONNECTOR CTYPE="LOOKUP" COMPONENT="tAdvancedHash"/>
        <CONNECTOR CTYPE="ITERATE" MAX_OUTPUT="0" MAX_INPUT="0"/>
        <CONNECTOR CTYPE="SUBJOB_OK" MAX_INPUT="0"/>
        <CONNECTOR CTYPE="SUBJOB_ERROR" MAX_INPUT="0"/>
        <CONNECTOR CTYPE="COMPONENT_OK" MAX_OUTPUT="0"/>
        <CONNECTOR CTYPE="COMPONENT_ERROR" MAX_OUTPUT="0"/>
        <CONNECTOR CTYPE="RUN_IF" MAX_OUTPUT="0"/>
    </CONNECTORS>
   <PARAMETERS>
      <PARAMETER NAME="MAP" FIELD="EXTERNAL" NUM_ROW="1">
         <DEFAULT/>  
      </PARAMETER>
      <PARAMETER
        NAME="LINK_STYLE"
        FIELD="CLOSED_LIST"
        NUM_ROW="1"
      >
        <ITEMS DEFAULT="">
          <ITEM NAME="AUTO"   VALUE="AUTO" />
          <ITEM NAME="BEZIER_CURVE"   VALUE="BEZIER_CURVE" />
          <ITEM NAME="LINE"   VALUE="LINE" />
        </ITEMS>
      </PARAMETER>

      <PARAMETER NAME="TEMPORARY_DATA_DIRECTORY" FIELD="DIRECTORY"
            NUM_ROW="2" GROUP="STORE_ON_DISK"
      >
            <!--<DEFAULT>"__COMP_DEFAULT_FILE_DIR__/temp"</DEFAULT>
      --></PARAMETER>

      <PARAMETER NAME="PREVIEW" FIELD="IMAGE" SHOW="true" NUM_ROW="4">
         <DEFAULT/>
      </PARAMETER>

       <PARAMETER
      NAME="DIE_ON_ERROR"
      FIELD="CHECK"
      NUM_ROW="100"
      SHOW="false"
         >
      <DEFAULT>true</DEFAULT>
    </PARAMETER>
    <PARAMETER
      NAME="LKUP_PARALLELIZE"
      FIELD="CHECK"
      NUM_ROW="100"
      SHOW="false"
         >
      <DEFAULT>false</DEFAULT>
    </PARAMETER>
   </PARAMETERS>

    <ADVANCED_PARAMETERS>
      <PARAMETER NAME="ROWS_BUFFER_SIZE" FIELD="TEXT"
            REQUIRED="true" NUM_ROW="1" SHOW="true" GROUP="STORE_ON_DISK"
      >
            <DEFAULT>2000000</DEFAULT>
      </PARAMETER>

      <PARAMETER
        NAME="CHANGE_HASH_AND_EQUALS_FOR_BIGDECIMAL"
        FIELD="CHECK"
        NUM_ROW="10"
      >
        <DEFAULT>false</DEFAULT>
      </PARAMETER>
    </ADVANCED_PARAMETERS>

   <CODEGENERATION>
    <TEMPLATES INPUT="TMAP_OUT" OUTPUT="TMAP_IN">

      <TEMPLATE NAME="TMAP_OUT" COMPONENT="tMapOut">
        <LINK_TO NAME="TMAP_IN" CTYPE="ROWS_END"/>
      </TEMPLATE>

      <TEMPLATE NAME="TMAP_IN" COMPONENT="tMapIn"/>

    </TEMPLATES>
  </CODEGENERATION>
  <RETURNS/>

   <PLUGINDEPENDENCIES>
    <PLUGINDEPENDENCY ID="org.talend.designer.abstractmap" />
   </PLUGINDEPENDENCIES>

</COMPONENT>

project_name.item文件看起来像这样(我只显示组件部分)

<node componentName="tMap" componentVersion="2.1" offsetLabelX="0" offsetLabelY="0" posX="352" posY="64">
    <elementParameter field="TEXT" name="UNIQUE_NAME" value="tMap_1"/>
    <elementParameter field="EXTERNAL" name="MAP" value=""/>
    <elementParameter field="CLOSED_LIST" name="LINK_STYLE" value="AUTO"/>
    <elementParameter field="DIRECTORY" name="TEMPORARY_DATA_DIRECTORY" value=""/>
    <elementParameter field="IMAGE" name="PREVIEW" value="_xpwnoHOoEeSkDJ1bbi1FTg-tMap_1-PREVIEW.bmp"/>
    <elementParameter field="CHECK" name="DIE_ON_ERROR" value="true"/>
    <elementParameter field="CHECK" name="LKUP_PARALLELIZE" value="false"/>
    <elementParameter field="TEXT" name="ROWS_BUFFER_SIZE" value="2000000"/>
    <elementParameter field="CHECK" name="CHANGE_HASH_AND_EQUALS_FOR_BIGDECIMAL" value="false"/>
    <elementParameter field="TEXT" name="CONNECTION_FORMAT" value="row"/>
    <elementParameter field="CHECK" name="INFORMATION" value="false"/>
    <elementParameter field="MEMO" name="COMMENT" value=""/>
    <elementParameter field="CHECK" name="VALIDATION_RULES" value="false"/>
    <metadata connector="FLOW" label="out1" name="out1">
      <column comment="" key="false" name="newColumn_1" nullable="true" originalDbColumnName="newColumn" pattern="" sourceType="" type="id_String" usefulColumn="true"/>
      <column comment="" key="false" name="newColumn" nullable="true" pattern="" sourceType="" type="id_String" usefulColumn="true"/>
    </metadata>
    <nodeData xsi:type="MapperData">
      <uiProperties shellMaximized="true"/>
      <varTables sizeState="INTERMEDIATE" name="Var"/>
      <outputTables sizeState="INTERMEDIATE" name="out1">
        <mapperTableEntries name="newColumn_1" expression="row1.newColumn " type="id_String" nullable="true"/>
        <mapperTableEntries name="newColumn" expression="row1.newColumn1 " type="id_String" nullable="true"/>
      </outputTables>
      <inputTables sizeState="INTERMEDIATE" name="row1" matchingMode="UNIQUE_MATCH" lookupMode="LOAD_ONCE">
        <mapperTableEntries name="newColumn" type="id_String" nullable="true"/>
        <mapperTableEntries name="newColumn1" type="id_String" nullable="true"/>
      </inputTables>
    </nodeData>
  </node>

如果我们清楚地看到.item文件中的所有参数都取自tMap_java.xml文件,除了在运行时生成的元数据,nodedata(因此是inputTables,outputTables等)。我需要知道的是talend如何生成此部分并在运行时在.item文件中填充相同内容?实际上,我需要知道如何在任何组件的.item文件中生成元数据。我的要求是我想使用组件的_java.xml文件生成.item文件。我只是通过查看组件的_java.xml文件,无法在.item文件中生成元数据部分。

1 个答案:

答案 0 :(得分:4)

TOS项目(存储库,元数据,项目......)仅用于设计作业(即图形gui和向导),而不是用于执行它们。

执行或导出作业时,会执行参数化的javajet文件的反弹。 Javajet代码输出常规的.java文件,其中组件参数已经解析。这个.java代码依次编译并打包在.jar文件中,然后执行该文件。

换句话说,javajet端的所有内容都不能在运行时设置,而只能在编译时设置。

此外,您不能将参数* _java.xml用于低级别设置项目属性,因为这是代码生成器将参数提供给javajet的元数据架构。它是组件的属性文件,而不是作业本身。