0

我正在尝试从 python 生成一条 amqp 消息并使用来自 java/spring 的相同消息。

这是我的生产者代码(python):

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());

这是 Person 的 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)
4

2 回答 2

2

您是否使用通用的序列化库?看看这个答案了解更多细节是否有任何库可以用 python 反序列化,它是用 java 序列化的

您可以尝试序列化为 json,然后在您的 python 代码中反序列化它会很容易

于 2012-12-12T12:36:31.097 回答
1

这样做的关键是使用可以用多种语言编码和解码的标准消息格式。许多人只是在 UTF-8 编码的字符串中使用 JSON,但我发现 MessagePack 几乎与 JSON 一样灵活,而且带宽效率更高。http://msgpack.org/

我喜欢使用对象样式的格式,因为很容易将数据添加到消息中,然后将其发送到另一个队列。我这样做是为了处理错误(通过添加错误原因代码并将消息分派到队列中,处理程序将检查原因并重试或修复并重试)。此外,添加时间戳对于绘制系统中的运输时间非常有用。处理完一条消息(将包含前几个步骤的时间戳)后,它会被发送到记录队列中的时间和每个步骤的处理时间的绘图仪。

于 2013-01-13T22:47:01.937 回答