rabbitmq direct类型中,生产者端无法接收应答

来源:互联网 发布:华云数据许广彬 编辑:程序博客网 时间:2024/06/04 17:55

研究了一下rabbitmq,做了一个测试,出现的问题,这里记录一下,以便下次查看

下面的代码为生产者


import java.util.UUID;

import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;

public class EmitLogDirect {
    private static final String EXCHANGE_NAME = "direct_logs";

    public static void main(String[] argv) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
        String replyToQueueName = channel.queueDeclare().getQueue();
        channel.exchangeDeclare(EXCHANGE_NAME, "direct");
        QueueingConsumer consumer = new QueueingConsumer(channel);
        channel.basicConsume(replyToQueueName, true, consumer);
        String severity ="error";
        String[] abc = {"a",".","b","c",".",".",".",".","d",".","g"};
        String message = getMessage(abc);
        for(int i= 0 ; i < 10;i++){
            String correlationId = UUID.randomUUID().toString();
            BasicProperties bp = new BasicProperties.Builder().correlationId(correlationId).replyTo(replyToQueueName).build();
            channel.basicPublish(EXCHANGE_NAME, severity, bp, message.getBytes());
            QueueingConsumer.Delivery delivery = consumer.nextDelivery(10000);
            if(delivery != null && correlationId.equals(delivery.getProperties().getCorrelationId())){
                 String reply = new String(delivery.getBody(), "utf-8");
                 System.out.println("reply="+reply);
            }else{
                System.out.println("do not receive response");
            }
            Thread.sleep(1000*6);
        }
        System.out.println(" [x] Sent '" + severity + "':'" + message + "'");
        channel.close();
        connection.close();
    }


下面的代码为消费者


package direct;

import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;

public class ReceiveLogsDirect {
    private static final String EXCHANGE_NAME = "direct_logs";

    public static void main(String[] argv) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
        channel.exchangeDeclare(EXCHANGE_NAME, "direct");
        String queueName = channel.queueDeclare().getQueue();
        /*if (argv.length < 1) {
            System.err
                    .println("Usage: ReceiveLogsDirect [info] [warning] [error]");
            System.exit(1);
        }*/
        String[] aa={"error"};
        for (String severity : aa) {
            channel.queueBind(queueName, EXCHANGE_NAME, severity);
        }
        System.out.println(" [*] Waiting for messages error. To exit press CTRL+C");
        QueueingConsumer consumer = new QueueingConsumer(channel);
        channel.basicConsume(queueName, true, consumer);
        while (true) {
            QueueingConsumer.Delivery delivery = consumer.nextDelivery();
            String message = new String(delivery.getBody());
            String routingKey = delivery.getEnvelope().getRoutingKey();
            BasicProperties bp = new BasicProperties().builder().correlationId(delivery.getProperties().getCorrelationId()).build();
            //channel.basicPublish(EXCHANGE_NAME, "direct", bp, "this is respose".getBytes());
            System.out.println("replyTo="+delivery.getProperties().getReplyTo());
            channel.basicPublish(EXCHANGE_NAME, delivery.getProperties().getReplyTo(), bp, "this is respose".getBytes());(1)
            System.out.println(" [x] Received '" + routingKey + "':'" + message
                    + "'");
        }
    }
}

在(1)的标志处,我把第一个参数的交换机名给写上了,可是生产者一直接收不到应答,一直不理解是什么。当把它改成""时,就可以收到。一直不知其理。

查看了一下rabbitmq官网的说明,如果第一个参数为“”,那代表的是默认或是无名字的交换机,这时消息是发送的队列就直接由第二个参数来决定了

这时才想起在生产者端时,我对应答的队列声明的是一个临时队列,而这个队列是没有与任何交换机绑定的。而我的写法中,把应答临时队列与一个具体的交换机

绑定起来了,那当然在生产者端接收不到应答了。


0 0