tree 1a95a05638443ced43b852f576f5086d7872daa6
parent 9e682392d79aa607b68856cc93f761aedeb32dd4
author wudi <676366545@qq.com> 1699259228 +0800
committer GitHub <noreply@github.com> 1699259228 +0800
gpgsig -----BEGIN PGP SIGNATURE-----
 
 wsBcBAABCAAQBQJlSKNcCRBK7hj4Ov3rIwAAZ9EIAIH/sopw227Aaij8+8/qsEWC
 jU53Dq/ZwIqrz+QU99zdJI3eDYl36l2D+2A376YrMMSM5K8SHklQwa1WfG+WjMlR
 bGMDx6z9vCLE4Jr2aYrkB7QvyWUrOZ7R+h55If0mdXNvZcwQtvjg4HRffaJNUVed
 dM2Pt31dxM9zebxegWEZo1ikEQ/nAAh3N/CslZn3jLI5k5zlSo5lf31A5ltWtqzf
 YJ1V/hUsk2/On1Uu93KY9bENEL8ZuUM+CiMpsW2+lvWJ6HtBTWDphKNDWy+3im8O
 NkgCLMGkbq+RZL6pbbyT1LYf+cpJV+shREKEQvQBaobFQQ78kKbXBGj47kPnZF0=
 =c5oW
 -----END PGP SIGNATURE-----
 

add multisink to DorisBatchSink (#223)

Support multi-table writing on DorisBatchSink
Example：
```java
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);

        DorisBatchSink.Builder<RecordWithMeta> builder = DorisBatchSink.builder();
        final DorisReadOptions.Builder readOptionBuilder = DorisReadOptions.builder();

        Properties properties = new Properties();
        properties.setProperty("column_separator", ",");
        properties.setProperty("line_delimiter", "\n");
        properties.setProperty("format", "csv");
        DorisOptions.Builder dorisBuilder = DorisOptions.builder();
        dorisBuilder.setFenodes("127.0.0.1:8030")
                .setTableIdentifier("")
                .setUsername("root")
                .setPassword("");

        DorisExecutionOptions.Builder executionBuilder = DorisExecutionOptions.builder();

        executionBuilder.setLabelPrefix("label")
                .setStreamLoadProp(properties)
                .setDeletable(false)
                .setBufferFlushMaxBytes(8 * 1024)
                .setBufferFlushMaxRows(10)
                .setBufferFlushIntervalMs(1000 * 10);

        builder.setDorisReadOptions(readOptionBuilder.build())
                .setDorisExecutionOptions(executionBuilder.build())
                .setDorisOptions(dorisBuilder.build());

       //Multiple table writing
       RecordWithMeta record = new RecordWithMeta("test", "test_flink_tmp1", "wangwu,1");
       RecordWithMeta record1 = new RecordWithMeta("test", "test_flink_tmp", "wangwu,1");           
       DataStreamSource<RecordWithMeta> source = env.fromCollection(Arrays.asList(record, record1));
       source.sinkTo(builder.build());

```