1.7 RabbitMQ-Direct Exchange demo

demo的前置条件和1.5-RabbitMQ-速入门demo 一样。
1.0 对于创建信道之前的操作做了一些封装代码如下

package com.star.movie.common;

import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @Description:常量类
 * @author:kaili
 * @Date: 2019-04-21 22:13
 **/
public class Constant {

    public static String HOST = "127.0.0.1";

    public static int PORT = 5672;

    public static String USERNAME = "root";

    public static String USERPASS = "123456";

    public static Connection getConnection(){
        //1 创建ConnectionFactory
        ConnectionFactory connectionFactory = new ConnectionFactory() ;
        connectionFactory.setHost(Constant.HOST);
        connectionFactory.setPort(Constant.PORT);
        connectionFactory.setUsername(Constant.USERNAME);
        connectionFactory.setPassword(Constant.USERPASS);
        connectionFactory.setVirtualHost("/");
        connectionFactory.setAutomaticRecoveryEnabled(true);
        connectionFactory.setNetworkRecoveryInterval(3000);
        //2 创建Connection
        Connection connection = null;
        try {
            connection = connectionFactory.newConnection();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        }
        return  connection;
    }
}

可以直接通过getConnection方法获取Connection
1.1生产者代码:

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.star.movie.common.Constant;

/**
 * @Description:direct类型交换机
 * @author:kaili
 * @Date: 2019-04-21 22:19
 **/
public class ProducerDirectExchange {

    public static void main(String[] args) throws Exception {
        //2 创建Connection
        Connection connection = Constant.getConnection();
        //3 创建Channel
        Channel channel = connection.createChannel();
        //4 声明
        String exchangeName = "test_direct_exchange";
        String routingKey = "test.direct";
        //5 发送
        String msg = "Hello World RabbitMQ 4  Direct Exchange Message 111 ... ";
        channel.basicPublish(exchangeName, routingKey , null , msg.getBytes());
        channel.close();
        connection.close();
    }
}

1.2消费者代码

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.QueueingConsumer;
import com.rabbitmq.client.QueueingConsumer.Delivery;
import com.star.movie.common.Constant;

/**
 * @Description:Directl类型交换机
 * @author:kaili
 * @Date: 2019-04-21 22:20
 **/
public class ConsumerDirectExchange {

    public static void main(String[] args) throws Exception {
        Connection connection = Constant.getConnection();

        Channel channel = connection.createChannel();
        //4 声明
        String exchangeName = "test_direct_exchange";
        String exchangeType = "direct";
        String queueName = "test_direct_queue";
        String routingKey = "test.direct";

        //表示声明了一个交换机
        channel.exchangeDeclare(exchangeName, exchangeType, true, false, false, null);
        //表示声明了一个队列
        channel.queueDeclare(queueName, false, false, false, null);
        //建立一个绑定关系:
        channel.queueBind(queueName, exchangeName, routingKey);

        //durable 是否持久化消息
        QueueingConsumer consumer = new QueueingConsumer(channel);
        //参数:队列名称、是否自动ACK、Consumer
        channel.basicConsume(queueName, true, consumer);
        //循环获取消息
        while(true){
            //获取消息,如果没有消息,这一步将会一直阻塞
            Delivery delivery = consumer.nextDelivery();
            String msg = new String(delivery.getBody());
            System.out.println("收到消息:" + msg);
        }
    }
}

1.3直接启动生产者观察控制台日志

"C:\Program Files\Java\jdk1.8.0_171\bin\java.exe" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:59621,suspend=y,server=n -javaagent:C:\Users\star2017\.IntelliJIdea2019.2\system\captureAgent\debugger-agent.jar -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_171\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\rt.jar;F:\old\spring-workplace\spring-rabbitmq\movie\target\classes;F:\repo\org\springframework\boot\spring-boot-starter-web\2.1.4.RELEASE\spring-boot-starter-web-2.1.4.RELEASE.jar;F:\repo\org\springframework\boot\spring-boot-starter\2.1.4.RELEASE\spring-boot-starter-2.1.4.RELEASE.jar;F:\repo\org\springframework\boot\spring-boot\2.1.4.RELEASE\spring-boot-2.1.4.RELEASE.jar;F:\repo\org\springframework\boot\spring-boot-autoconfigure\2.1.4.RELEASE\spring-boot-autoconfigure-2.1.4.RELEASE.jar;F:\repo\org\springframework\boot\spring-boot-starter-logging\2.1.4.RELEASE\spring-boot-starter-logging-2.1.4.RELEASE.jar;F:\repo\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;F:\repo\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;F:\repo\org\apache\logging\log4j\log4j-to-slf4j\2.11.2\log4j-to-slf4j-2.11.2.jar;F:\repo\org\apache\logging\log4j\log4j-api\2.11.2\log4j-api-2.11.2.jar;F:\repo\org\slf4j\jul-to-slf4j\1.7.26\jul-to-slf4j-1.7.26.jar;F:\repo\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar;F:\repo\org\yaml\snakeyaml\1.23\snakeyaml-1.23.jar;F:\repo\org\springframework\boot\spring-boot-starter-json\2.1.4.RELEASE\spring-boot-starter-json-2.1.4.RELEASE.jar;F:\repo\com\fasterxml\jackson\core\jackson-databind\2.9.8\jackson-databind-2.9.8.jar;F:\repo\com\fasterxml\jackson\core\jackson-annotations\2.9.0\jackson-annotations-2.9.0.jar;F:\repo\com\fasterxml\jackson\core\jackson-core\2.9.8\jackson-core-2.9.8.jar;F:\repo\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.9.8\jackson-datatype-jdk8-2.9.8.jar;F:\repo\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.9.8\jackson-datatype-jsr310-2.9.8.jar;F:\repo\com\fasterxml\jackson\module\jackson-module-parameter-names\2.9.8\jackson-module-parameter-names-2.9.8.jar;F:\repo\org\springframework\boot\spring-boot-starter-tomcat\2.1.4.RELEASE\spring-boot-starter-tomcat-2.1.4.RELEASE.jar;F:\repo\org\apache\tomcat\embed\tomcat-embed-core\9.0.17\tomcat-embed-core-9.0.17.jar;F:\repo\org\apache\tomcat\embed\tomcat-embed-el\9.0.17\tomcat-embed-el-9.0.17.jar;F:\repo\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.17\tomcat-embed-websocket-9.0.17.jar;F:\repo\org\hibernate\validator\hibernate-validator\6.0.16.Final\hibernate-validator-6.0.16.Final.jar;F:\repo\javax\validation\validation-api\2.0.1.Final\validation-api-2.0.1.Final.jar;F:\repo\org\jboss\logging\jboss-logging\3.3.2.Final\jboss-logging-3.3.2.Final.jar;F:\repo\com\fasterxml\classmate\1.4.0\classmate-1.4.0.jar;F:\repo\org\springframework\spring-web\5.1.6.RELEASE\spring-web-5.1.6.RELEASE.jar;F:\repo\org\springframework\spring-beans\5.1.6.RELEASE\spring-beans-5.1.6.RELEASE.jar;F:\repo\org\springframework\spring-webmvc\5.1.6.RELEASE\spring-webmvc-5.1.6.RELEASE.jar;F:\repo\org\springframework\spring-aop\5.1.6.RELEASE\spring-aop-5.1.6.RELEASE.jar;F:\repo\org\springframework\spring-context\5.1.6.RELEASE\spring-context-5.1.6.RELEASE.jar;F:\repo\org\springframework\spring-expression\5.1.6.RELEASE\spring-expression-5.1.6.RELEASE.jar;F:\repo\org\slf4j\slf4j-api\1.7.26\slf4j-api-1.7.26.jar;F:\repo\org\springframework\spring-core\5.1.6.RELEASE\spring-core-5.1.6.RELEASE.jar;F:\repo\org\springframework\spring-jcl\5.1.6.RELEASE\spring-jcl-5.1.6.RELEASE.jar;F:\repo\com\rabbitmq\amqp-client\3.6.5\amqp-client-3.6.5.jar;D:\idea\IntelliJ IDEA 2019.1.2\lib\idea_rt.jar" com.star.movie.exchange.direct.ProducerDirectExchange
Connected to the target VM, address: '127.0.0.1:59621', transport: 'socket'
Exception in thread "main" com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no exchange 'test_direct_exchange' in vhost '/', class-id=60, method-id=40)
	at com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.java:66)
	at com.rabbitmq.utility.BlockingValueOrException.uninterruptibleGetValue(BlockingValueOrException.java:36)
	at com.rabbitmq.client.impl.AMQChannel$BlockingRpcContinuation.getReply(AMQChannel.java:366)
	at com.rabbitmq.client.impl.ChannelN.close(ChannelN.java:581)
	at com.rabbitmq.client.impl.ChannelN.close(ChannelN.java:508)
	at com.rabbitmq.client.impl.ChannelN.close(ChannelN.java:502)
	at com.rabbitmq.client.impl.recovery.AutorecoveringChannel.close(AutorecoveringChannel.java:77)
	at com.star.movie.exchange.direct.ProducerDirectExchange.main(ProducerDirectExchange.java:25)
Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no exchange 'test_direct_exchange' in vhost '/', class-id=60, method-id=40)
	at com.rabbitmq.client.impl.ChannelN.asyncShutdown(ChannelN.java:483)
	at com.rabbitmq.client.impl.ChannelN.processAsync(ChannelN.java:320)
	at com.rabbitmq.client.impl.AMQChannel.handleCompleteInboundCommand(AMQChannel.java:143)
	at com.rabbitmq.client.impl.AMQChannel.handleFrame(AMQChannel.java:90)
	at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:559)
	at java.lang.Thread.run(Thread.java:748)

由控制台日志可知消息投递失败,失败的原因是没有test_direct_exchange这个交换机。打开RabbitMQ Management管控页面观察交换机界面
在这里插入图片描述
所以消息会投递失败
1.4 启动消费者代码
在这里插入图片描述
1.4.1 消费者等待消费队列消息,打开RabbitMQ Management管控页面观察
在这里插入图片描述
1.4.2 建立了一个连接,exchange界面生成了一个test_direct_exchange交换机
在这里插入图片描述
1.4.3 点击该交换机查看该交换机详情
在这里插入图片描述
1.4.5 可以看到
该交换机的Routing key为:test.direct
路由到的队列为:test_direct_queue
与我们消费者代码种定义的一致,点击队列页面查看队列消息
在这里插入图片描述
1.5.6 点击test_direct_queue查看队列详情
在这里插入图片描述
1.5.7 启动生产者代码

观察消费者控制台:
在这里插入图片描述
消费消费了一条生产者生产的消息

1.5 关闭消费者代码,启动生产者代码
观察RabbitMQ Management管控页面
在这里插入图片描述
可以看到有一条消息在等待消费
在这里插入图片描述
启动消费者代码观察消息队列
在这里插入图片描述
队列的消息已经被消费了
在这里插入图片描述

发布了24 篇原创文章 · 获赞 4 · 访问量 1386
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章