我正在尝试从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)
答案 0 :(得分:2)
您使用的是通用序列化库吗?请查看此答案以获取更多详细信息Is there any library to deserialize with python which is serialized with java。
您可以尝试序列化为json,然后在python代码中反序列化很容易
答案 1 :(得分:1)
关键是使用标准的消息格式,可以用多种语言进行编码和解码。许多人只是在UTF-8编码的字符串中使用JSON,但我发现MessagePack几乎和JSON一样灵活,并且带宽效率更高。 http://msgpack.org/
我喜欢使用对象样式格式,因为很容易将数据添加到邮件中,然后将其发送到另一个队列。我已经这样做来处理错误处理(通过添加错误原因代码并将消息分派给队列,其中处理程序将检查原因并重试或修复并重试)。此外,添加时间戳对于绘制通过系统的传输时间非常有用。在处理了一条消息(它将包含前几个步骤的时间戳)之后,它将被发送到一个grapher,它记录队列中的时间和每个步骤的处理时间。