2016-09-15 43 views
2

我正在使用版本2.0.0的Java Spring AMQP的快照。我創建了AMQP消息,發送它。在另一個服務中,我正確接收消息,除了頭部而不是接收類型Object,每個頭部都是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"); 

當我運行上面的代碼,我將與錯誤的消費者在最後一行代碼失敗:不能投字符串寵物。消息通過OK,除了在消費者代碼中接收到的每個頭都是String類型。

USAGE: MessageBuilder.setHeader(String Key, Object Value); 

USAGE: Properties.getHeaders() returns Map<String,Object> 

每個頭都有鍵入字符串/對象的鍵/值對。周圍的工作也在序列化一個頭,我想傳遞非字符串/整數值,但這似乎是除了標題點之外。我錯過了什麼嗎?

回答

1

你需要序列化你的寵物的字符串,和反序列化它,當你在其他服務中獲得它。例如。您可以使用fasterxml Jackson並將其序列化爲JSON字符串

+0

它在哪裏明確地說我的「字符串」真的是一隻寵物?我正在填充標題。標題只是一個地圖條目。此映射條目是此鍵值對的類型 - KEY是STRING,VALUE是OBJECT。 - ,headers.put(「MyNewPet」,myDog); - 但另一方面,當我拉出標題時,突然地圖現在是 - 對象發生了什麼? – Aerith

+0

我想這是因爲amqp不會將您的對象序列化爲字節,很可能它只是調用toString()並通過代理傳遞字符串。據我所知,這些隊列只傳遞字符串 –

0

您正在告訴編譯器您的String確實是一個寵物。但是,Pet不是Stringsubclass。有兩個可能的解決方案:

解決方法1:您確保Pet extends String,像這樣:

public class Pet extends String { 
    //... 
} 

,然後你就可以投StringPet

溶液2:您可以實現的Pet一個構造函數,需要一個String作爲參數:

public class Pet { 
    //... 
    Public Pet(String name) { 
     //... 
    } 
    //... 
} 
+1

它在哪裏明確地說我的「String」確實是一個寵物?我正在填充標題。標題只是一個地圖條目。此映射條目是此鍵值對的類型 - KEY是STRING,VALUE是OBJECT。 - ,headers.put(「MyNewPet」,myDog); - 但另一方面,當我拉出標題時,突然地圖現在是 - 對象發生了什麼? – Aerith