如何使用 Spring Batch 写入 Azure Blob?

问题描述

我正在尝试使用 Spring Batch 将逐行 csv 写入 Azure Blob。

自动装配 Azure 存储:

@Value("${azure.storage.ConnectionString}")
private String connectionString;

@Value("${azure.storage.container.name}")
private String containerName;


@Bean
@StepScope
public FlatFileItemWriter<Pojo> writer(
        @Value("#{stepExecutionContext['marketName']}") String marketName,@Value("#{jobParameters['startDate']}") String startDate,@Value("#{jobParameters['YYYY-MM']}") String yearMonth
) {
    // Create writer instance
    FlatFileItemWriter<Pojo> writer = new FlatFileItemWriter<>();

    String fullPath = yearMonth + "/" +  marketName + "/" +
            marketName + "_" + startDate;

    BlobContainerClient container = new BlobContainerClientBuilder()
            .connectionString(connectionString)
            .containerName(containerName)
            .buildClient();

    BlobClient blob = container.getBlobClient(fullPath);

    // Set output file location
    writer.setResource((Resource) blob);

    // All job repetitions should "append" to same output file
    writer.setAppendAllowed(true);

    // Name field values sequence based on object properties
    writer.setLineAggregator(new DelimitedLineAggregator<Pojo>() {
        {
            setDelimiter(",");
            setFieldExtractor(new BeanWrapperFieldExtractor<Pojo>() {
                {
                    setNames(new String[] {
                            "market","epsg","xbin","ybin","latitude","longitude","totalDownlinkVol","totalUplinkVol"
                    });
                }
            });
        }
    });
    return writer;
}

然后我得到错误

org.springframework.beans.factory.BeanCreationException:在类路径资源[com/example/dbreader/configuration/BatchConfig.class]中定义名称为“scopedTarget.writer”的bean创建错误:通过工厂方法的Bean实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.batch.item.file.FlatFileItemWriter]:工厂方法“writer”抛出异常;嵌套异常是 java.lang.classCastException: com.azure.storage.blob.BlobClient 不能转换为 org.springframework.core.io.Resource

Spring 抱怨我无法将 Blob 转换为资源。

有人知道如何在 Spring Batch Writer 中指向 Azure Blob 存储吗?

谢谢,马库斯。

解决方法

FlatFileItemWriter 需要 org.springframework.core.io.Resource 才能写入数据。如果您使用的 API 未实现此接口,则它不能与 FlatFileItemWriter 一起使用。您需要为 Azure 提供 Resource 实现或寻找实现它的库,例如 round()