2016-08-31 13 views
1

ActiveMQキューにメッセージを送信しようとしていますが、java.lang.ClassCastException: java.util.UUID cannot be cast to java.lang.Stringが表示されています。私はこの問題を解決する方法を見出そうとしていますが、本当の答えはオンラインではありません。CamelでActiveMQメッセージを送信するとClassCastExceptionが発生する

ここでcamelContextはスプリングを使用して注入されており、実行中であることがわかります。

私はこのメソッドに入る唯一の方法として、ActiveMQが適切にセットアップされていることを知っています。別のキューからメッセージを受信し、上記のいくつかの方法を実行した後にこのメッセージを中継しようとしています。どのような方法でもメッセージ。

メッセージにはMap<UUID,Object>というメッセージが含まれています。これは疑問の根本的な問題です。 部分的なスタックトレース:

とjava.lang.ClassCastException:java.util.UUIDは org.apache.activemq.util.MarshallingSupport.marshalPrimitiveMapで java.lang.Stringでにキャストすることはできません(MarshallingSupport.java:61 ) でorg.apache.activemq.util.MarshallingSupport.marshalPrimitive(MarshallingSupport.java:151) org.apache.activemq.util.MarshallingSupport.marshalPrimitiveMap(MarshallingSupport.java:64) org.apacheで ました。 activemq.command.ActiveMQMapMessage.storeContent(ActiveMQMapMessage.java:150) at org.apache.activemq.ActiveMQSessionでorg.apache.activemq.command.ActiveMQMapMessage.copy org.apache.activemq.command.ActiveMQMapMessage.copy(ActiveMQMapMessage.java:116)で(ActiveMQMapMessage.java:121) .send でorg.apache.activemq.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:224)で org.apache.activemq.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:289)で(ActiveMQSession.java:1773) org.apache.activemq.pool.PooledProducer.send(PooledProducer.java:79) at org.apache.activemq.pool.PooledProducer.send(PooledProducer.java:62) at org.springframework.jms.core.JmsTemplate.doSend(JmsTemplate.java:635) でorg.apache.camel.component.jms.JmsConfiguration $ CamelJmsTemplate.doSend(JmsConfiguration.java:343)

誰かがこれに遭遇した後、ClassCastExceptionを回避する方法を見つけましたか?マーシャリングするときにはMap<String,Object>と期待しており、Map<Object,Object>をサポートしていないのは奇妙です。

私は100%が同様のメッセージでMap<UUID,Object>を必要とする、私は道をUUID以降であるためにそれを必要とHibernateでいくつかのものをやっているように、String表現にUUIDを変換する必要はありません。

答えて

3

詳しい情報はここで見つけることができます:

  • ストリーム - StreamMessageのオブジェクトの:http://camel.apache.org/jmsまたはここhttp://docs.oracle.com/javaee/7/api/javax/jms/Message.html

    メッセージ本文

    JMS APIは、メッセージ本文の5つのタイプを定義しますメッセージ本文にはJavaプログラミング言語のプリミティブ値のストリームが含まれています( "Java
    プリミティブ ")。それは連続して満たされ、読み込まれます。

  • マップ - MapMessageのオブジェクトのメッセージ本文は名前がStringオブジェクトで名前と値のペアのセットが含まれており、値が Javaのプリミティブです。エントリーには連続してアクセスするか、名前によってランダムに にアクセスできます。エントリの順序は未定義です。

  • テキスト - TextMessageオブジェクトのメッセージ本文には、java.lang.Stringオブジェクトが含まれています。このメッセージタイプは、
    プレーンテキストメッセージとXMLメッセージの転送に使用できます。

  • Object - ObjectMessageオブジェクトのメッセージ本文には、シリアライズ可能なJavaオブジェクトが含まれています。

  • バイト - BytesMessageオブジェクトのメッセージ本文には、未解釈バイトのストリームが含まれています。このメッセージタイプは、実際に
    の本文を既存のメッセージフォーマットと一致させるためにエンコードします。多くの場合、使用しやすい他のボディタイプの1つを使用することが可能です(
    )。 JMS APIでは、
    バイトのメッセージプロパティを使用できますが、通常は使用されません。
    のプロパティが含まれていると、フォーマットに影響する場合があります。

私は、あなたがStringUUIDを変換することがあると思います。

+0

JMS MapMessageはオブジェクトの制限付きでMap です。送信前にコード内でこれを処理する必要があります –

+0

メッセージのメソッドハンドラを送信したのではなく、終了しました'RouteBuilder'の' multicast() 'メソッドを使用してメッセージを送信し、' Predicate'を使用してメッセージを必要なものとしてフィルタリングしました。私は方法の外でそれをやっているので、魅力のように働く。 – Orin

関連する問題