バージョン2.0.0のJava Springを使用しています。AMQPのスナップショット。 AMQPメッセージを作成して送信します。別のサービスでは、メッセージを正しく受け取っていますが、Typeオブジェクトを受け取る代わりにヘッダーを除いて、すべてのヘッダーはString型です。Spring AMQPヘッダーは文字列として返されます
出版社コード:
Message responseMessage = MessageBuilder
.withBody(SerializationUtils.serialize(person))
.setContentType(MessageProperties.CONTENT_TYPE_SERIALIZED_OBJECT)
.setHeader("STUDENT_TYPE", "New") // Not part of person object but related
.setHeader("PET", getPet()) // This is a pet object
.build();
rabbitTemplate.send(responseMessage);
コンシューマコード:
Object messageBody = SerializationUtils.deserialize(amqpMessage.getBody());
Person person = (Person)messageBody;
MessageProperties properties = amqpMessage.getMessageProperties();
String type = properties.getHeaders().get("STUDENT_TYPE").toString();
Pet pet = (Pet)properties.getHeaders().get("PET");
私は上記のコードを実行すると、私はエラーと消費者のコードの最後の行に失敗しますが:に文字列をキャストすることはできませんペット。このメッセージは、すべてのヘッダーがコンシューマーコードで受信されたときにString型であることを除いて、okになります。
USAGE: MessageBuilder.setHeader(String Key, Object Value);
USAGE: Properties.getHeaders() returns Map<String,Object>
すべてのヘッダーにString/Object型のキーと値のペアがあります。私の周りの仕事は、私は非文字列/整数値を渡したいヘッダーをシリアル化していますが、これはヘッダーのポイント以外にあるようです。何か不足していますか?
私の "String"は本当にペットなのですか?私はヘッダを設定しています。ヘッダーは単なるマップエントリです。このマップエントリは、このキー値のペアで、タイプはKEYでSTRING、VALUEはOBJECTです。 -、headers.put( "MyNewPet"、myDog); - しかし、もう一方の側では、ヘッダーを抜いて、突然マップがになっています - オブジェクトには何が起こったのですか? –
Aerith
amqpはあなたのオブジェクトをバイト列にシリアライズしないので、おそらくtoString()を呼び出してブローカーを通して文字列を渡す可能性が高いです。私が知っている限り、これらのキューは文字列だけを渡します –