Java接收Python发送的RabbitMQ消息全是byte数组

最近遇到一个好玩的bug,主要源自于对pika的不了解,业务场景是这样的:在构建应用时,需要使用sonarqube进行静态扫描,并且需要将扫描结果反馈到构建服务中,因为SonarQube扫描任务使用的Sonar-Scanner脚本进行操作的,CI服务分散在二十多台机器上,主要的架构图是这样的:

pika代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 身份验证
auth = pika.PlainCredentials(mq_username, mq_password)
# 身份验证之后连接mq
connection = pika.BlockingConnection(
pika.ConnectionParameters(mq_host, mq_port, mq_virtual_host, auth, heartbeat=9999)
)

channel = connection.channel()

channel.basic_publish(
exchange=mq_ack_exchange,
routing_key=mq_ack_routing_key,
body=json.dumps(json_body),
properties=pika.BasicProperties(
# make message persistent
delivery_mode=2,
)
)

java代码

1
2
3
4
@RabbitListener(queues = "#{'${external.mq.queue.deploy}'}")
public void process(@Payload String message) {
System.out.println(message);
}

这里输出的内容变成了ASCII码12 34 56 87,然后报错了,思前想后,也到mq控制台检查了,消息报文正常,然后心想用new String()转一下呢?辗转反侧,最后的解决方案是:

1
2
3
4
5
6
import org.springframework.amqp.core.Message;

@RabbitListener(queues = "#{'${external.mq.queue.deploy}'}")
public void process(@Payload Message message) {
System.out.println(new String(message.getBody()));
}

注意Message类不要import错了。