2012-12-12 16 views
0

相同的消息我試圖從產生一個蟒AMQP消息和消耗消耗產生AMQP消息從Java /彈簧相同的消息。使用python並且用java

這裏是我的製片代碼(蟒蛇):

import pika, sys, pickle 

sys.path.append("trc/suivi/amqp") 

from Person import Person 

connection = pika.BlockingConnection() 
channel = connection.channel() 
me = Person("Juliano", 38) 
pickled_me = pickle.dumps(me) 
channel.basic_publish(exchange='', 
         routing_key="myqueue", 
         body=pickled_me, 
         properties=pika.BasicProperties(delivery_mode=1)) 

這裏是我的消費者代碼(JAVA):

ApplicationContext context = new GenericXmlApplicationContext("classpath:/applicationContext.xml"); 
AmqpTemplate template = context.getBean(AmqpTemplate.class); 
Person me = (Person) template.receiveAndConvert("myqueue"); 
System.out.println("Me: " + me.getName() + ":" + me.getAge()); 

這裏是人的Java類:

package trc.suivi.amqp; 


import java.io.Serializable; 

public class Person implements Serializable { 
    private static final long serialVersionUID = 1L; 
    private String name; 
    private int age; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public int getAge() { 
     return age; 
    } 

    public void setAge(int age) { 
     this.age = age; 
    } 

} 

和相應的Python類:

class Person: 
    def __init__(self, name, age): 
     self.name = name 
     self.age = age 

(位於TRC/suivi/AMQP目錄結構)

我得到類轉換異常。我敢肯定,這有做任何與包/模塊的名稱或一些序列化的問題......

編輯:我現在用JSON和我得到這個在Java的反序列化:

Exception in thread "main" org.springframework.amqp.support.converter.MessageConversionException: failed to convert Message content. Could not resolve 
__TypeId__ in header 
    at org.springframework.amqp.support.converter.DefaultJavaTypeMapper.retrieveHeader(DefaultJavaTypeMapper.java:104) 
    at org.springframework.amqp.support.converter.DefaultJavaTypeMapper.toJavaType(DefaultJavaTypeMapper.java:53) 
    at org.springframework.amqp.support.converter.JsonMessageConverter.fromMessage(JsonMessageConverter.java:118) 
    at org.springframework.amqp.rabbit.core.RabbitTemplate.receiveAndConvert(RabbitTemplate.java:425) 
    at trc.suivi.amqp.Consumer.main(Consumer.java:12) 

回答

1

這裏的關鍵是利用它可以編碼,並在許多語言解碼的標準消息格式。許多人只使用UTF-8編碼字符串中的JSON,但我發現MessagePack幾乎與JSON一樣靈活,並且帶寬效率更高。 http://msgpack.org/

我喜歡,因爲它很容易將數據添加到一個消息,然後將其發送到另一個隊列使用對象樣式的格式。我已經這樣做來處理處理錯誤(通過添加錯誤原因代碼並將消息分派到處理程序將檢查原因以及重試或修復並重試的隊列)。此外,添加時間戳對於繪製通過系統的運輸時間非常有用。處理完一條消息(其中包含前幾個步驟中的時間戳)之後,它會發送給一個記錄隊列中時間和每個步驟處理時間的繪圖器。

相關問題