Apache camel Camel Azure BlobServiceProducer IllegalArgumentException:不支持的blob类型:org.apache.Camel.component.file.GenericFile

Apache camel Camel Azure BlobServiceProducer IllegalArgumentException:不支持的blob类型:org.apache.Camel.component.file.GenericFile,apache-camel,Apache Camel,我已经编写了一个camel路由,它轮询一个文件夹并将其发送到Azure Blob容器 我遵循Azure文档页面中提到的示例 我正在倒车。我使用的不是消费者,而是Azure Blob生产者。 这是我的路线。我使用了JavaDSL from("file://C:/camel/source1").to("azure-blob://datastorage/container1/BLOB1?credentials=#credentials&operation=updateBlockBlob")

我已经编写了一个camel路由,它轮询一个文件夹并将其发送到Azure Blob容器

我遵循Azure文档页面中提到的示例

我正在倒车。我使用的不是消费者,而是Azure Blob生产者。 这是我的路线。我使用了JavaDSL

from("file://C:/camel/source1").to("azure-blob://datastorage/container1/BLOB1?credentials=#credentials&operation=updateBlockBlob")
当我放置一个文件时,我得到了以下错误

**java.lang.IllegalArgumentException: Unsupported blob type:org.apache.camel.component.file.GenericFile
    at org.apache.camel.component.azure.blob.BlobServiceProducer.getInputStreamFromExchange(BlobServiceProducer.java:474) ~[camel-azure-2.19.2.jar:2.19.2]
    at org.apache.camel.component.azure.blob.BlobServiceProducer.updateBlockBlob(BlobServiceProducer.java:143) ~[camel-azure-2.19.2.jar:2.19.2]
    at org.apache.camel.component.azure.blob.BlobServiceProducer.process(BlobServiceProducer.java:79) ~[camel-azure-2.19.2.jar:2.19.2]**
我能解决这个问题。我把我的路线改写为

    from("file://C:/camel/source1")
            .process(new Processor() {
                @Override
                public void process(Exchange exchange) throws Exception {
                    Object file = exchange.getIn().getMandatoryBody();

                    exchange.getOut().setBody(
                            GenericFileConverter.genericFileToInputStream(
                                    (GenericFile<?>) file, exchange));
                }
            })
            .to("azure-blob://datastorage/container1/BLOB1?credentials=#credentials&operation=updateBlockBlob")
            .to("mock:Result");

我的问题是,我真的需要编写处理器吗?camel组件不应该接收流或文件对象吗?

是的,这是一个小错误。我已经登记了一张票:

您可以做您所做的工作,或者您可以添加一个.convertBodyTo并转换为一个FileInputStream、String等

 from("file://C:/camel/source1")
     .convertBodyTo(String.class)
     ...

有没有办法通过拦截器来实现这一点?我试过了,但我有多条路线,我列出了blob,也更新了blob。仅当它是azure blob且操作=更新时才要执行此操作。猜测可能需要使用一些正则表达式来完成,因此您可以使用interceptSendToEndpointazure*然后将covertBodyTo添加到。有关更多详细信息,请参阅:这会导致性能问题吗?因为我需要将其发送到azure,所以我认为使用拆分器不会有任何帮助。很抱歉,我要离开Topict。interceptSendToEndpoint不会导致性能问题,它将在创建路由时进行拦截并将其添加。convertBodyTo作为内联,就像您自己键入的一样。但是对于任何与性能相关的事情,请让计算机进行测试和比较。