RabbitMQ Python側はJava側にメッセージを送信してメッセージの全デジタル問題を受け入れる

13023 ワード

文書ディレクトリ
  • RabbitMQ受信デジタルBug
  • 参照
  • RabbitMQは数字Bugの山を受け入れた
    Python送信側はpikaでメッセージを送信
    送信コードは次のとおりです.
    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    import pika
    import json
    
    credentials = pika.PlainCredentials('ding', 'ding')
    connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.0.200',5672,'/',credentials))
    channel = connection.channel()
    
    channel.queue_declare(queue='test queue')
    
    msg = 'GG next'
    
    channel.basic_publish(exchange='',
            routing_key='test queue',
            body=msg)
    connection.close()
    

    Java受信側はSpring bootプロジェクトで、RabbitMQのパッケージを統合しています.
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-amqpartifactId>
    dependency>
    

    受信コードは次のとおりです.
    @RabbitListener(queues = "test queue")
    public void process2(String message) {
        System.out.println(message);
    }
    

    Pythonスクリプトを実行すると、Java側の結果は次のようになります.
    71,71,32,110,101,120,116
    

    結局ASCIIコードだらけ!以前はJavaでRabbitMQを統合していましたが、JavaとJavaの間にはこの問題はありません.そこでJava側でASCIIコードを文字列に変換しようと考え、次のコードを書きました.
    @RabbitListener(queues = "test queue")
    public void process2(String message) {
        System.out.println(arrayToStr(ascToArray(message)));
    }
    
    private String arrayToStr(int[] arr) {
        String res = "";
        for (int i = 0; i < arr.length; i++) {
            res += Character.toString((char)arr[i]);
        }
        return res;
    }
    
    private int[] ascToArray(String str) {
        String[] arr = str.split(",");
        int[] resArr = new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            resArr[i] = Integer.parseInt(arr[i]);
        }
        return resArr;
    }
    

    結果は正常になりました.
    GG next
    

    ちょうど少し楽しい时、1つの问题を思いついて、中国语の文字はどのようにしますか?1つの漢字の2つのバイト、ASCIIコードは表すことができませんか?
    そこでPython側の送信を試してみました
    msg = 'GG    '
    

    Java側はやはり問題が発生しました.
    GG ¦ᄌヒ¦ᄌタ₩ハハ
    

    RabbitMQが送ってくれたものが何なのかを見ることができます.Java側のコードはこうなります.
    @RabbitListener(queues = "test queue")
    public void process2(Object message) {
        System.out.println(message);
    }
    

    Pythonの送信元からは、
    (Body:'[B@49d1204c(byte[12])' MessageProperties [headers={}, contentLength=0, redelivered=false, receivedExchange=, receivedRoutingKey=test queue, deliveryTag=1, consumerTag=amq.ctag-Q4Oy_yC5qRoLoxAdu50zaw, consumerQueue=test queue])
    

    Java送信側から送られてきたのは、
    (Body:'GG    ' MessageProperties [headers={}, contentType=text/plain, contentEncoding=UTF-8, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, redelivered=false, receivedExchange=, receivedRoutingKey=queue, deliveryTag=1, consumerTag=amq.ctag-o1v48tbAr8mu-pT7HZHvHA, consumerQueue=queue])
    

    なんとbyte[]配列一つがStringだったのですがどうすればいいですか?解決コードは次のとおりです.
    import org.springframework.amqp.core.Message;
    @RabbitListener(queues = "test queue")
    public void process2(Message message) {
        String messageBody = new String(message.getBody());
        System.out.println(messageBody);
    }
    

    Java側でもPython側でも正しく表示されます.
    GG    
    

    リファレンス
    簡書rabbitはJSONを受け入れて受け取ったのはすべて数字です