RabbitMQ通信方式之Hello World
Hello World通信方式结构图
添加RabbitMQ和Junit工具栏的maven依赖
<!--rabbitmq-->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.12.0</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
创建一个构建连接的工具类
public class RabbitMQConnectionUtil {
public static final String RABBITMQ_HOST = "xxx.xx.xxx.xxx"; //设置你自己的RabbitMQ服务ip
public static final int RABBITMQ_PORT = 5672;
public static final String RABBITMQ_USERNAME = "guest";
public static final String RABBITMQ_PASSWORD = "guest";
public static final String RABBITMQ_VIRTUAL_HOST = "/";
/**
* 构建RabbitMQ的连接对象
*/
public static Connection getConnection() throws Exception {
//1. 创建Connection工厂
ConnectionFactory factory = new ConnectionFactory();
//2. 设置RabbitMQ的连接信息
factory.setHost(RABBITMQ_HOST);
factory.setPort(RABBITMQ_PORT);
factory.setUsername(RABBITMQ_USERNAME);
factory.setPassword(RABBITMQ_PASSWORD);
factory.setVirtualHost(RABBITMQ_VIRTUAL_HOST);
//3. 返回连接对象
Connection connection = factory.newConnection();
return connection;
}
创建生产者
public class Producer {
public final static String QUEUE_NAME = "hello";
@Test
public void publish() throws Exception {
// 创建连接工厂
Connection connection = RabbitMQConnectionUtil.getConnection();
// 创建通道
Channel channel = connection.createChannel();
// 声明队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 发送消息
String message = "Hello World!";
channel.basicPublish("", QUEUE_NAME, null, message.getBytes(StandardCharsets.UTF_8));
System.out.println("消息发送成功!");
}
}
创建消费者
public class Consumer {
@Test
public void consume() throws Exception {
//1. 获取连接对象
Connection connection = RabbitMQConnectionUtil.getConnection();
//2. 构建Channel
Channel channel = connection.createChannel();
//3. 构建队列
channel.queueDeclare(Producer.QUEUE_NAME,false,false,false,null);
//4. 监听消息
DefaultConsumer callback = new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("消费者获取到消息:" + new String(body,"UTF-8"));
}
};
channel.basicConsume(Producer.QUEUE_NAME,true,callback);
System.out.println("开始监听队列");
System.in.read();
}
}
启动消费者然后启动生产者观察控制台可以看到消费者拿到消息后的打印结果
RabbitMQ默认的Exchange,它是一个名字为空字符串(“”)的Exchange。在使用默认Exchange的情况下,消息的路由键(routing key)被设置为队列的名称,消息会被直接路由到与该名称匹配的队列中。如果没有与队列名称匹配的队列,则消息将被丢弃。
在hello world通信方式中,如果没有指定Exchange,那么消息会被发送到默认Exchange中,并使用队列名称作为路由键,从而被直接路由到相应的队列中。
因此,可以说在hello world通信方式中,消息是通过默认Exchange来进行路由的。但是需要注意的是,在这种简单的场景下,由于只有一个队列,因此消息的路由并没有经过复杂的匹配规则,可以说是直接发送到指定队列中的。