Camel-Azure BlobServiceProducer IllegalArgumentException:不支持的blob类型:o​​rg.apache.camel.component.file.GenericFile

时间:2017-09-26 11:19:32

标签: apache-camel

我编写了一个用于轮询文件夹并将其发送到Azure Blob容器

的camel路由

我按照Azure文档页面中提到的示例进行操作 https://github.com/apache/camel/blob/master/components/camel-azure/src/main/docs/azure-blob-component.adoc

我正在改变这条路线。我使用Azure Blob Producer而不是消费者。 这是我的路线。我使用过Java DSL。

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");

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

1 个答案:

答案 0 :(得分:1)

是的,这是一个小虫子。我已经记录了一张票:https://issues.apache.org/jira/browse/CAMEL-11844

您可以执行您所做的解决方法,也可以添加.convertBodyTo并转换为FileInputStream,String等。

try
{
    String query = "INSERT INTO Articolo(CodArt,Descrizione,Prezzo,PrezzoListino,Fornitore,Importato,TipoArticolo) VALUES(@CodArt,@Descrizione,@Prezzo,@PrezzoListino,@Fornitore,@Importato,@TipoArticolo)";
    String Importato = "CSV";
    String TipoArticolo = "A";

    using(SqlConnection conn = db.apriconnessione())
    using(SqlCommand cmd = new SqlCommand(query, conn))
    {
        // -1 indicates you used MAX like nvarchar(max), otherwise use the maximum number of characters in the schema
        cmd.Parameters.Add(new SqlDbParameter("@CodArt", SqlDbType.NVarChar, -1)).Value = CodiceArticolo.ToString();
        cmd.Parameters.Add(new SqlDbParameter("@Descrizione", SqlDbType.NVarChar, -1)).Value = Descrizione.ToString();

        /*
          Rest of your parameters created in the same manner
        */

        cmd.ExecuteNonQuery();
        db.chiudiconnessione();               
    }
    return true;
}
catch (Exception ex)
{
    Console.WriteLine("Errore nell'inserimento dell'articolo " + ex);
    //MessageBox.Show("Errore nel inserimento dell'articolo:  " + ex);
    return false;
}