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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章