美文网首页
RabbitMQ Python端发送消息给Java端

RabbitMQ Python端发送消息给Java端

作者: Murray66 | 来源:发表于2019-03-23 17:57 被阅读0次

使用 RabbitMQ ,让Python程序向Java程序传送字符串消息,遇到了一些问题,在此记录。

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.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</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

正有点开心之际,想到一个问题,中文字符怎么办?一个汉字两个字节,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

这可怎么办?

不知在哪里看到一个方法,试了一下,代码如下:

@RabbitListener(queues = "test queue")
public void process2(Message message) {
    String messageBody = new String(message.getBody());
    System.out.println(messageBody);
}

不论是Java端还是Python端发来的,都能正确显示了。

GG 下一把

相关文章

  • RabbitMQ Python端发送消息给Java端

    使用 RabbitMQ ,让Python程序向Java程序传送字符串消息,遇到了一些问题,在此记录。 Python...

  • rabbitmq 给H5端发送消息

    docker安装rabbitmq rabbitmq打开插件stomp H5端订阅mq 测试给客户端发送消息

  • RabbitMQ学习:安装RabbitMQ及RabbitMQ的初

    RabbitMQ基础含义 RabbitMQ是一种消息中间件,用于处理来自客户端的异步消息。服务端将要发送的消息放入...

  • RabbitMQ学习:RabbitMQ的基本概念及RabbitM

    1、RabbitMQ的基本概念 RabbitMQ是一种消息中间件,用于处理来自客户端的异步消息。服务端将要发送的消...

  • RabbitMQ消息推送(二)

    生产端和消费端的代码实现,创建一个辅助类,用以配置RabbitMQ和发送消息,代码如下: 代码中已经给了详细的注释...

  • 基于socket的进程通信

    实现目标实现服务端与客户端的连接实现多个客户端向服务端发送消息,并由服务端将消息发送给每个客户端 涉及的Java类...

  • 常见面试

    1.消息重复可能的原因 1.1第一类原因 消息 发送端 应用的消息重复发送,有以下几种情况: 消息发送端发送消息给...

  • rabbitMQ使用

    Java客户端概览 RabbitMQ的Java客户端包为amqp-client-.jar,可以从RabbitMQ官...

  • 模版消息代码

    微信端发送模版消息MessageController.java MessageForm.java model T...

  • vue3.0 前端和客户端混合开发

    1.客户端发送消息 iOS给前端发送消息 vue3.0中接收客户端发送消息(在index.html中) 前端接收客...

网友评论

      本文标题:RabbitMQ Python端发送消息给Java端

      本文链接:https://www.haomeiwen.com/subject/lbnsvqtx.html