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管控页面
可以看到有一条消息在等待消费
启动消费者代码观察消息队列
队列的消息已经被消费了