Apache Camel:Azure Blob 到 Azure Blob 路由、文件传输可行性
Apache Camel : Azure Blob to Azure Blob Route, File Transfer Feasibility
我们有一个用例从 Azure Blob 存储 #1 检索一些文件并将其上传到另一个 Azure Blob 存储 #2。是否可以通过Apache Camel实现。
我已经尝试使用下面包含的示例路线,但是它没有以预期的格式工作,最终出现以下异常。
java.lang.RuntimeException: Stream mark expired.
at com.azure.storage.common.StorageInputStream.reset(StorageInputStream.java:366) ~[azure-storage-common-12.11.1.jar:na]
at org.apache.camel.component.azure.storage.blob.BlobUtils.getInputStreamLength(BlobUtils.java:38) ~[camel-azure-storage-blob-3.12.0.jar:3.12.0]
at org.apache.camel.component.azure.storage.blob.BlobStreamAndLength.createBlobStreamAndLengthFromExchangeBody(BlobStreamAndLength.java:50) ~[camel-azure-storage-blob-3.12.0.jar:3.12.0]
at org.apache.camel.component.azure.storage.blob.operations.BlobOperations.uploadBlockBlob(BlobOperations.java:182) ~[camel-azure-storage-blob-3.12.0.jar:3.12.0]
at org.apache.camel.component.azure.storage.blob.BlobProducer.process(BlobProducer.java:89) ~[camel-azure-storage-blob-3.12.0.jar:3.12.0]
from("azure-storage-blob://storage_name/container?accessKey=xxx&blobName=int_1111.csv")
.to("azure-storage-blob://storage_name/container?accessKey=xxx&blobName=Outbound_$simple{date:now:yyyyMMdd_HHmmss}.csv&operation=uploadBlockBlob");
更新:当我将正文转换为 byte[] 时,我能够将文件内容上传到 Azure blob,但是在处理大文件时这可能会影响内存。
from("azure-storage-blob://storage_name/container?accessKey=xxx&blobName=int_1111.csv")
.convertBodyTo(byte[].class)
.to("azure-storage-blob://storage_name/container?accessKey=xxx&blobName=Outbound_$simple{date:now:yyyyMMdd_HHmmss}.csv&operation=uploadBlockBlob");
关于更好地处理文件上传的任何建议或反馈。
1) 下载 blockBlob
位于 Account1
存储帐户
中的 container1
from("azure-storage-blob:/Account1/container1?blobName=blobname&accessKey=yourAccessKey").
to("file://blobdirectory");
有关详细信息,请参阅此 document
2) 将下载的 blob 上传到 account2
存储帐户
中的另一个 container2
示例:
from("file://blobdirectory ").to("azure-blob://storage2 /container2/BLOB1?credentials=#credentials&operation=updateBlockBlob")
有关详细信息,请参阅此 document
我已向 Camel 框架团队提出申请,要求将 Azure Copy Blob 操作合并到入门包中 - https://issues.apache.org/jira/browse/CAMEL-17161。
他们已经添加了该功能,并且从 3.14.0 版本的 azure blob 入门包开始可用,如果有人有兴趣探索该功能,请随时查看文档页面以获取示例。
from("azure-storage-blob://storage_account_name/container_1?accessKey=xxxxxx&blobName=int_1111.csv")
.process(exchange -> {
exchange.getIn().setHeader(BlobConstants.BLOB_NAME, "int_1111.csv");
exchange.getMessage().setHeader(BlobConstants.SOURCE_BLOB_CONTAINER_NAME, "container_1");
exchange.getMessage().setHeader(BlobConstants.SOURCE_BLOB_ACCOUNT_NAME, "storage_account_name");
})
.to("azure-storage-blob://storage_account_name/container_2?accessKey=xxxxxx&operation=copyBlob&sourceBlobAccessKey=xxxxxx");
复制 Blob API : https://docs.microsoft.com/en-us/rest/api/storageservices/copy-blob
Maven 回购 link : https://mvnrepository.com/artifact/org.apache.camel.springboot/camel-azure-storage-blob-starter/3.14.0
示例(参考复制 blob 部分):
https://camel.apache.org/components/3.14.x/azure-storage-blob-component.html
我们有一个用例从 Azure Blob 存储 #1 检索一些文件并将其上传到另一个 Azure Blob 存储 #2。是否可以通过Apache Camel实现。
我已经尝试使用下面包含的示例路线,但是它没有以预期的格式工作,最终出现以下异常。
java.lang.RuntimeException: Stream mark expired. at com.azure.storage.common.StorageInputStream.reset(StorageInputStream.java:366) ~[azure-storage-common-12.11.1.jar:na] at org.apache.camel.component.azure.storage.blob.BlobUtils.getInputStreamLength(BlobUtils.java:38) ~[camel-azure-storage-blob-3.12.0.jar:3.12.0] at org.apache.camel.component.azure.storage.blob.BlobStreamAndLength.createBlobStreamAndLengthFromExchangeBody(BlobStreamAndLength.java:50) ~[camel-azure-storage-blob-3.12.0.jar:3.12.0] at org.apache.camel.component.azure.storage.blob.operations.BlobOperations.uploadBlockBlob(BlobOperations.java:182) ~[camel-azure-storage-blob-3.12.0.jar:3.12.0] at org.apache.camel.component.azure.storage.blob.BlobProducer.process(BlobProducer.java:89) ~[camel-azure-storage-blob-3.12.0.jar:3.12.0]
from("azure-storage-blob://storage_name/container?accessKey=xxx&blobName=int_1111.csv")
.to("azure-storage-blob://storage_name/container?accessKey=xxx&blobName=Outbound_$simple{date:now:yyyyMMdd_HHmmss}.csv&operation=uploadBlockBlob");
更新:当我将正文转换为 byte[] 时,我能够将文件内容上传到 Azure blob,但是在处理大文件时这可能会影响内存。
from("azure-storage-blob://storage_name/container?accessKey=xxx&blobName=int_1111.csv")
.convertBodyTo(byte[].class)
.to("azure-storage-blob://storage_name/container?accessKey=xxx&blobName=Outbound_$simple{date:now:yyyyMMdd_HHmmss}.csv&operation=uploadBlockBlob");
关于更好地处理文件上传的任何建议或反馈。
1) 下载 blockBlob
位于 Account1
存储帐户
container1
from("azure-storage-blob:/Account1/container1?blobName=blobname&accessKey=yourAccessKey").
to("file://blobdirectory");
有关详细信息,请参阅此 document
2) 将下载的 blob 上传到 account2
存储帐户
container2
示例:
from("file://blobdirectory ").to("azure-blob://storage2 /container2/BLOB1?credentials=#credentials&operation=updateBlockBlob")
有关详细信息,请参阅此 document
我已向 Camel 框架团队提出申请,要求将 Azure Copy Blob 操作合并到入门包中 - https://issues.apache.org/jira/browse/CAMEL-17161。
他们已经添加了该功能,并且从 3.14.0 版本的 azure blob 入门包开始可用,如果有人有兴趣探索该功能,请随时查看文档页面以获取示例。
from("azure-storage-blob://storage_account_name/container_1?accessKey=xxxxxx&blobName=int_1111.csv")
.process(exchange -> {
exchange.getIn().setHeader(BlobConstants.BLOB_NAME, "int_1111.csv");
exchange.getMessage().setHeader(BlobConstants.SOURCE_BLOB_CONTAINER_NAME, "container_1");
exchange.getMessage().setHeader(BlobConstants.SOURCE_BLOB_ACCOUNT_NAME, "storage_account_name");
})
.to("azure-storage-blob://storage_account_name/container_2?accessKey=xxxxxx&operation=copyBlob&sourceBlobAccessKey=xxxxxx");
复制 Blob API : https://docs.microsoft.com/en-us/rest/api/storageservices/copy-blob
Maven 回购 link : https://mvnrepository.com/artifact/org.apache.camel.springboot/camel-azure-storage-blob-starter/3.14.0
示例(参考复制 blob 部分): https://camel.apache.org/components/3.14.x/azure-storage-blob-component.html