3

ApacheCamel2.9.2とSpring3.0.6.RELEASEを使用しています。カスタムDataFormatを使用して、Camelメッセージをマーシャリングおよびアンマーシャリングしようとしています。Springを使用してカスタムDataFormatをルートの1つに構成したいと思います。

Apache Camelのドキュメントには、カスタムデータフォーマットをSpringのルートに接続するには、カスタムデータフォーマットをBeanとして宣言し、Springルート内で次のように参照する必要があると記載されています。

<marshal>
    <custom ref="myCustomDataFormat"/>
</marshal>

http://camel.apache.org/custom-dataformat.html

だから私は次の設定をしています:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                        http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context-3.0.xsd
">

<bean id="myCustomDataFormat" class="com.test.CustomDataFormat"/>
<!-- Camel Context -->
<camelContext xmlns="http://camel.apache.org/schema/spring">
    <route>
        <from uri="file:C:/test?initialDelay=4000&amp;delay=1000"/>
        <marshal>
            <custom ref="myCustomDataFormat"/>
        </marshal>
        <to uri="file:C:/test2"/>
    </route>
</camelContext>
</beans>

しかし、Camelを起動しようとすると、次の厄介なエラーが発生します。

org.springframework.beans.ConversionNotSupportedException:タイプ'com.test.CustomDataFormat'の値を必要なタイプ'org.apache.camel.model.DataFormatDefinition'に変換できませんでした。ネストされた例外はjava.lang.IllegalStateExceptionです:タイプ[com.test.CustomDataFormat]の値を必要なタイプ[org.apache.camel.model.DataFormatDefinition]に変換できません:一致するエディターまたは変換戦略が見つかりません

私のデータ形式は次のように定義されています。

package com.test;

import java.io.InputStream;
import java.io.OutputStream;

import org.apache.camel.Exchange;
import org.apache.camel.spi.DataFormat;

public class CustomDataFormat implements DataFormat {

/* (non-Javadoc)
 * @see org.apache.camel.spi.DataFormat#marshal(org.apache.camel.Exchange, java.lang.Object, java.io.OutputStream)
 */
@Override
public void marshal(Exchange exchange, Object graph, OutputStream stream)
        throws Exception {
    System.out.println("Marshal");
    byte[] bytes = exchange.getContext().getTypeConverter().mandatoryConvertTo(byte[].class, graph);
    stream.write(bytes);

}

/* (non-Javadoc)
 * @see org.apache.camel.spi.DataFormat#unmarshal(org.apache.camel.Exchange, java.io.InputStream)
 */
@Override
public Object unmarshal(Exchange exchange, InputStream stream)
        throws Exception {
    System.out.println("Unmarshal");
    byte[] bytes = exchange.getContext().getTypeConverter().mandatoryConvertTo(byte[].class, stream);
    return bytes;
}
}

Javaで次のテストルートを作成し、問題なく機能したため、CustomDataFormatの実装が正しいことを知っています。

package com.test;

import org.apache.camel.spring.SpringRouteBuilder;

public class TestFormatRoute extends SpringRouteBuilder {

/* (non-Javadoc)
 * @see org.apache.camel.builder.RouteBuilder#configure()
 */
@Override
public void configure() throws Exception {
    from("file:C:/test?initialDelay=4000&delay=1000").unmarshal(new CustomDataFormat()).to("file:C:/test2");
}

}

私は何が欠けていますか?

ありがとう

アップデート

このエラーを受け取った後、Camelを完全に起動させた後、自分のカスタムデータ形式が実際に作成したルートで機能することに気づきました。どのプロセスがカスタムデータ形式を解析しようとして失敗したかはわかりませんが、データ形式を解析してルートに配置するのと同じプロセスではないようです。

これにより、データ形式の機能要件は解決されますが、このエラーが発生する理由は説明されていません。

また、問題の原因はデータ形式(CustomDataFormat)の名前ではないことを確認しました。DataFormatの名前を一意の名前(MerlinDataFormat)に変更しても、エラーは修正されませんでした。

コンソールとログファイルの醜い赤いエラーの大きなブロックが正確に魅力的ではないため、なぜこのエラーが発生するのかを知りたいです。

再度、感謝します。

4

3 に答える 3

2

それは非常に単純な解決策であることが判明しました(そして私が認める解決策は見やすいはずでした)。この問題を解決するには、実際には2つの方法があります。1つはSpringのみを使用し、もう1つは追加のJavaクラスを必要とします。

解決策1

DataFormatDefinitionカスタムと同じプロパティを持つ拡張する新しいクラスを作成しますDataFormat。メソッドをオーバーライドしてconfigureDataFormat()、基になるのすべてのプロパティを設定しますDataFormat。コンストラクターを追加して、基礎DataFormatをのインスタンスとして設定しますCustomDataFormatDataFormatDefinitionこれで、春にインスタンスを作成し、マーシャリングまたはで参照できるようになりますunmarshaling

解決策2(クイック&ダーティ)

春に、新しいDataFormatDefinitionBeanを作成し、そのプロパティを春のBeandataFormatへの参照として設定します。これで、いつまたは。でBeanDataFormatを参照できるようになります。DataFormatDefinitionmarshalingunmarshaling

于 2012-08-14T18:56:04.563 に答える
0

あなたの例の何が悪いのかよくわかりませんが、それは問題ないようです。データ形式のコードを投稿できますか?org.apache.camel.spi.DataFormatを正しく実装していますか?

この例をCamel2.9.2で設定したところ、魅力のように機能します。カスタムデータ形式は、Camelのドキュメント/ソースコードからのものです。

<bean id="mySweetDf" class="com.example.MySweetDf"/>
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
<route>
        <from uri="file:C:/temp/test?initialDelay=4000&amp;delay=1000"/>
        <marshal>
            <custom ref="mySweetDf"/>
        </marshal>
        <convertBodyTo type="java.lang.String"/>
        <to uri="file:C:/temp/test2"/>
    </route>
</camelContext>

データ形式のJavaファイル:

package com.example;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.camel.Exchange;
import org.apache.camel.spi.DataFormat;

public class MySweetDf implements DataFormat {

  public void marshal(Exchange exchange, Object graph, OutputStream stream) throws Exception {
    byte[] bytes = exchange.getContext().getTypeConverter().mandatoryConvertTo(byte[].class, graph);
    String body = reverseBytes(bytes);
    stream.write(body.getBytes());
}

  public Object unmarshal(Exchange exchange, InputStream stream) throws Exception {
    byte[] bytes = exchange.getContext().getTypeConverter().mandatoryConvertTo(byte[].class, stream);
    String body = reverseBytes(bytes);
    return body;
}

  private String reverseBytes(byte[] data) {
    StringBuilder sb = new StringBuilder(data.length);
    for (int i = data.length - 1; i >= 0; i--) {
        char ch = (char) data[i];
        sb.append(ch);
    }
    return sb.toString();
}
}

アップデート

コードを試してみました。同様に機能するようです。mvn archetype 168を介して新しいCamel2.9.2プロジェクトを作成しました:remote-> org.apache.camel.archetypes:camel-archetype-spring(Spring DSLサポートが追加された新しいCamelプロジェクトを作成します)。これには、ラクダコアとラクダスプリングの依存関係のみが含まれ、他には何も含まれません。

次に、camel-context.xmlをxmlに置き換え、データ形式コードをjavaディレクトリに追加しました。「mvncamel:run」を使用して実行すると、ファイルがコピーされ、ログに「marshal」が出力されます。

[pache.camel.spring.Main.main()] SpringCamelContext             INFO  Route: route1 started and consuming from: Endpoint[file://C:/test?delay=1000&initialDelay=4000]
[pache.camel.spring.Main.main()] SpringCamelContext             INFO  Total 1 routes, of which 1 is started.
[pache.camel.spring.Main.main()] SpringCamelContext             INFO  Apache Camel 2.9.2 (CamelContext: camel-1) started in 0.808 seconds
Marshal

すべての依存関係が正しく設定されていて、データ形式を台無しにする.jarファイルがないことを確認しますか?

UPDATE2

さて、私はそれが何であるかについての考えを持っていると思います:

http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/model/dataformat/CustomDataFormat.html Camelには、データ形式として名前が付けられたクラスがすでにあります。名前を別の名前に変更してみてください。CustomDataFormatは、エラーで参照されるorg.apache.camel.model.DataFormatDefinitionを拡張します。Javaは2つの異なる名前空間であるため、これを処理する必要がありますが、プロジェクトのセットアップにこの競合の原因となる問題がある可能性があります。データ形式の名前を変更して、問題が解決するかどうかを確認してください。

于 2012-07-31T22:45:49.890 に答える
0

私もラクダ2.10.0で同じ問題に直面していました。タイプorg.apache.camel.model.DataFormatDefinitionのインスタンスをrefに指定すると、すべてが正常に機能します。xmljson変換の2つのクラス->DataFormatとDataFormatDefinitionの両方を実装するXmlJsonDataFormatを見ることができます。

私も直面していたのと同じ問題を解決しました。DataFormatDefintionを拡張するクラスを実装しました-そのconfigureDataFormatメソッドで、DataFormatを拡張するクラス(この場合はCustomDataFormat)に注入可能なプロパティを設定します。解決するためのテンプレートとしてXmlJson変換を使用しました。

于 2012-08-13T02:14:12.367 に答える