【问题标题】:adding partitions dynamically in WebSphere JSR 352在 WebSphere JSR 352 中动态添加分区
【发布时间】:2016-06-10 17:43:55
【问题描述】:

我的源表有 10 条记录,我需要读取 10 条记录并需要处理这些记录,并且需要将处理过的记录写入目标表。对于这 10 条记录,我创建了 2 个分区。但是在我的实际项目中,我们不知道每天需要处理多少条记录,那么我如何确定我需要多少个分区? 是否可以动态添加分区? 请在 JSR 352 with Liberty Profile - how to implement checkpointing when ItemReader does a DB query 找到我的 poc 代码。

【问题讨论】:

    标签: websphere-liberty jsr352


    【解决方案1】:

    使用 PartitionMapper 动态定义分区步骤中的分区数。

    这在步骤的开始运行并构建一个PartitionPlan,它定义了分区的数量和每个分区的属性。

    在 XML 中,您的 <partition> 元素应包含子 <mapper> 元素,而不是您的子 <plan> 元素'd 用来静态定义分区的数量。

    但您也可以使用 partitionPlan 属性替换类似地执行替换。

    例如

        <step id="mappedStep">
            <batchlet ref="MyBatchlet">
                <properties>
                    <property name="xx" value="#{partitionPlan['xx']}" />
                </properties>
            </batchlet>
            <partition>
                <mapper ref="MyMapper">
                    <properties>
                        <property name="mapperProp" value="#{jobProperties['mapperProp']}" />
                    </properties>
                </mapper>
            </partition>
        </step>
    

    您的 PartitionMapper 可以使用以下内容构建 PartitionPlan

    import javax.batch.api.partition.PartitionMapper;
    import javax.batch.api.partition.PartitionPlan;
    import javax.batch.api.partition.PartitionPlanImpl;
    
    // ...
    @Named("MyMapper")
    public class MyPartitionMapper implements PartitionMapper {
    
        @Inject @BatchProperty
        String mapperProp;      // FROM JSL, USE IF YOU WANT, NOT USED HERE
    
        @Override
        public PartitionPlan mapPartitions() throws Exception {
    
            numPartitions = calculateNumPartitions() // YOUR LOGIC HERE
    
            Properties[] props = new Properties[numPartitions];
    
            Integer i;
             for (i = 0; i < numPartitions; i++) {
                props[i] = new Properties();
                props[i].setProperty("xx", "xxVal" + i);  // SUPPLY PER-PARTITION PROPERTY 'xx'
                props[i].setProperty("yy", "yyVal" + i);  // SUPPLY PER-PARTITION PROPERTY 'yy'
            }
    
            PartitionPlan partitionPlan = new PartitionPlanImpl();
            partitionPlan.setPartitions(numPartitions);
            partitionPlan.setPartitionProperties(props);
            partitionPlan.setPartitionsOverride(false);
    
            return partitionPlan;       
        }
    }
    

    【讨论】:

    • 感谢 Scott 的帮助。实际上我找不到任何示例代码来实现分区映射器。你能帮我在哪里找到示例吗?还有一个问题,比如我需要向每个分区传递不同的参数来获取数据,因为我的源表只有时间戳,所以我需要将 12AM 到 6 PM 时间戳行传递到第一个分区和 6PM 到 12AM 分区到另一个分区。
    • 感谢您的快速帮助。我会试试这个例子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 2014-11-14
    • 2021-05-31
    • 2014-04-13
    • 1970-01-01
    相关资源
    最近更新 更多