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

一般的なシリアル化ライブラリを使用していますか? 詳細については、この回答をご覧ください。 Java でシリアル化された python で逆シリアル化するライブラリはありますか

json にシリアル化してみると、Python コードで簡単に逆シリアル化できます。

于 2012-12-12T12:36:31.097 に答える
1

これの鍵は、多くの言語でエンコードおよびデコードできる標準のメッセージ形式を使用することです。多くの人がUTF-8でエンコードされた文字列でJSONを使用していますが、MessagePackはJSONとほぼ同じくらい柔軟性があり、帯域幅の効率が高いことがわかりました。http://msgpack.org/

メッセージにデータを追加して別のキューに送信するのは簡単なので、オブジェクトスタイルの形式を使用するのが好きです。エラーの処理に対処するためにこれを行いました(エラー理由コードを追加し、ハンドラーが理由を調べて再試行するか、修正して再試行するキューにメッセージをディスパッチすることによって)。また、タイムスタンプの追加は、システムの通過時間をグラフ化するのに役立ちました。メッセージ(前のいくつかのステップのタイムスタンプが含まれます)を処理した後、メッセージはグラファーに送信され、キュー内の時間と各ステップの処理時間が記録されます。

于 2013-01-13T22:47:01.937 に答える