2017-08-25 11 views
0

ObjectMessageを使用しているときに、ActiveMQのクラスシリアル化/逆シリアル化を担当する側はどちらですか?ActiveMQのシリアライズ/デシリアライズは誰が担当しますか?

クラスはサーバにシリアライズされた形式で送信されなければならないと私は考えていましたが、私は自分のキューが「破損しました」というメッセージを送信しました。ObjectMessage:私のcondeの変更を逆にして、私は以前のようにTextMessageを送っています。別のキューに切り替えると、すべて正常に動作します。

ObjectMessageのインスタンスが

+1

以下の回答がありますが、同じコードベースのインスタンス間でメッセージを送信している場合を除き、ObjectMessageを避けることをおすすめします。あなたは、json/xml/protobuf/somethingnotでtext/bytesメッセージを使ってより良いコントロールを持つでしょう。 –

+0

このリンクを参照してくださいhttp://activemq.apache.org/openwire.html – Nir

答えて

1

のObjectMessageとしてメッセージを保存するためのJava直列化を使用しています...単に何もキューから読み取ることができません...サーバー側で立ち往生、私は、ログにはエラーが表示されなかったように見えます送信されたプロトコルメッセージ内のバイトペイロード。これは、送信側と受信側のクライアントがクラスパス上にクラスを持っていなければならないことを意味します。

0

「通常の」ActiveMQストレージプロバイダ(KahaDBなど)のどれも、ObjectMessageをデシリアライズする必要はありません。データはそのままの状態で保存されます。その結果、シリアライゼーションとデシリアライゼーションのみがクライアントで行われます(通常は)。それらが明示的にホワイトリストに登録されていない限り

最近ActiveMQのクライアントは、CVEの結果として、全くのObjectMessageをデシリアライズからブロックされています

-Dorg.apache.activemq.SERIALIZABLE_PACKAGES = com.acme

ありますAPIも接続ファクトリにありますが、実装されていないと感じています。

なお、「*」(すべてのパッケージ)はSERIALIZABLE_PACKAGESの正当な値ですが、シェル/コマンドプロンプトが誤ってファイル名のリストにそれを拡張していないことに注意する必要があります。

デシリアライズの制限により、メッセージがまったく消費されず、エラーや例外が発生していない場合は、別の場所にある可能性があります。

関連する問題