Java RabbitMQ-如何使用DefaultConsumer从consumer标记提取消息正文?

Java RabbitMQ-如何使用DefaultConsumer从consumer标记提取消息正文?,java,scala,rabbitmq,amqp,Java,Scala,Rabbitmq,Amqp,我正在尝试使用RabbitMQ发布者和使用者编写一个简单的应用程序,生产者是用Java编写的,使用者是用Scala编写的 这是我正在使用的发布服务器,它成功地将数据插入rabbitMQ服务器中的“queue1”队列: String queue="queue1"; String exchange="queue1"; String routing_key="queue1"; Connection connection = factory.newConnection(); Channel chan

我正在尝试使用RabbitMQ发布者和使用者编写一个简单的应用程序,生产者是用Java编写的,使用者是用Scala编写的

这是我正在使用的发布服务器,它成功地将数据插入rabbitMQ服务器中的“queue1”队列:

String queue="queue1";


String exchange="queue1";
String routing_key="queue1";
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(queue, true, false, false, null);
channel.exchangeDeclare(exchange, "direct");
channel.queueBind(queue,exchange,routing_key);
channel.basicQos(1);

String msg = "Hello";

channel.basicPublish(exchange,routing_key_one, new AMQP.BasicProperties.Builder().contentType("text/plain").deliveryMode(1).priority(0).
build(),msg.getBytes());
channel.close();
connection.close();
现在的问题是,我在一个单独的脚本上有一个消费者,但我不能让它返回我从发布者发送的“msg”字符串;我只能获取消费者标签作为返回值。这是我的消费者:

import com.rabbitmq.client.{ConnectionFactory,Connection,Channel,Consumer,DefaultConsumer,Envelope,BasicProperties}

val rabbit_host="localhost"
val queue="queue1"
val exchange="queue1"
val routing_key="queue1"

val factory: ConnectionFactory = new ConnectionFactory()
factory.setHost (rabbit_host)

val connection: Connection = factory.newConnection()
val channel: Channel = connection.createChannel()

channel.queueBind(queue_name, exchange, routing_key, null)
channel.basicQos(1)

val consumer:Consumer=new DefaultConsumer(channel){
  def handleDelivery(consumerTag: String, envelope: Envelope, properties: BasicProperties, body: Array[Byte]):String ={
    new String(body,"UTF-8")
  }
}


val msg: String = channel.basicConsume(queue_name,true, consumer)


channel.close()
connection.close()
如果我然后打印“msg”,这就是我得到的值:“amq.ctag-miRiLnyTcsq9MwzHyVshZw”

所以我的问题是,有没有一种方法可以让我得到“hello”(原始值)作为basicConsume函数的返回


感谢您抽出时间。

根据文档

val msg: String = channel.basicConsume(queue_name,true, consumer)
返回

与新使用者关联的使用者代号

由于rabbitMq的异步特性,等待消息并不容易。您可以尝试使用Promise和block来获得结果

val p = Promise[String]()
val f = p.future

val consumer:Consumer=new DefaultConsumer(channel){
  def handleDelivery(consumerTag: String, envelope: Envelope, properties: BasicProperties, body: Array[Byte]):String ={
    val parsedBody = new String(body,"UTF-8")
    p.success(parsedBody)
  }
}
val msg: String = Await.result(f, 5 seconds)

您能澄清一下您在scala客户端中使用的是哪一个库吗?@CucumisSativus,当然,我已经将它添加到代码中了,它就是这个:com.rabbitmq.client